Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
SmartSwapV2
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-30 */ // File: @openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol) pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ``` * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._ */ library StorageSlotUpgradeable { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } } // File: @openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeaconUpgradeable { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); } // File: @openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.0; /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822ProxiableUpgradeable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); } // File: @openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol // OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } } // File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File: @openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File: @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File: @openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol // OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol) pragma solidity ^0.8.2; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ * * @custom:oz-upgrades-unsafe-allow delegatecall */ abstract contract ERC1967UpgradeUpgradeable is Initializable { function __ERC1967Upgrade_init() internal onlyInitializing { } function __ERC1967Upgrade_init_unchained() internal onlyInitializing { } // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Returns the current implementation address. */ function _getImplementation() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall( address newImplementation, bytes memory data, bool forceCall ) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { _functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallUUPS( address newImplementation, bytes memory data, bool forceCall ) internal { // Upgrades from old implementations will perform a rollback test. This test requires the new // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing // this special case will break upgrade paths from old UUPS implementation to new ones. if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) { _setImplementation(newImplementation); } else { try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) { require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } _upgradeToAndCall(newImplementation, data, forceCall); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Returns the current admin. */ function _getAdmin() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _changeAdmin(address newAdmin) internal { emit AdminChanged(_getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Emitted when the beacon is upgraded. */ event BeaconUpgraded(address indexed beacon); /** * @dev Returns the current beacon. */ function _getBeacon() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall( address newBeacon, bytes memory data, bool forceCall ) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { _functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data); } } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function _functionDelegateCall(address target, bytes memory data) private returns (bytes memory) { require(AddressUpgradeable.isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return AddressUpgradeable.verifyCallResult(success, returndata, "Address: low-level delegate call failed"); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File: @openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol // OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.0; /** * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. * * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing * `UUPSUpgradeable` with a custom implementation of upgrades. * * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. * * _Available since v4.1._ */ abstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable { function __UUPSUpgradeable_init() internal onlyInitializing { } function __UUPSUpgradeable_init_unchained() internal onlyInitializing { } /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment address private immutable __self = address(this); /** * @dev Check that the execution is being performed through a delegatecall call and that the execution context is * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { require(address(this) != __self, "Function must be called through delegatecall"); require(_getImplementation() == __self, "Function must be called through active proxy"); _; } /** * @dev Check that the execution is not being performed through a delegate call. This allows a function to be * callable on the implementing contract but not through proxies. */ modifier notDelegated() { require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall"); _; } /** * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the * implementation. It is used to validate that the this implementation remains valid after an upgrade. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier. */ function proxiableUUID() external view virtual override notDelegated returns (bytes32) { return _IMPLEMENTATION_SLOT; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeTo(address newImplementation) external virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, new bytes(0), false); } /** * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call * encoded in `data`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, data, true); } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeTo} and {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal override onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File: @openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuardUpgradeable is Initializable { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; function __ReentrancyGuard_init() internal onlyInitializing { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal onlyInitializing { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File: contracts/SmartSwapV2.sol //SPDX-License-Identifier: MIT pragma solidity ^0.8.13; pragma abicoder v2; interface IERC20 { function balanceOf(address owner) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transfer(address to, uint256 amount) external returns (bool); function transferFrom(address from, address to, uint256 amount) external returns (bool); function decimals() external view returns (uint8); } interface SmartFinanceHelper { // calculates the token amount that will be received after deducting stargate's fees function getDstAmountAfterFees ( uint16 dstChainId, address dstSupportToken, address srcSupportToken, uint256 srcChainTokenAmt ) external view returns(uint256); // calculates the protocol fees function calculateProtocolFees ( uint256 _amount, bool _islocal ) external view returns(uint256); // gets the fee address where protocol fees is collected function feeAddress() external view returns(address); // gets the referral fee. function calculateProtocolReferralFees( uint256 _amount ) external view returns(uint256); // Get the referral address. function getReferralInfo(address _msgSender) external view returns(address); // Get the referral ID. function getReferralID(address _address) external view returns(uint256); // Set the referral ID. function setReferralInfo(address _address, address _value) external; // Get Destination referral address. function getDestReferralID(uint256 _key) external view returns(address); } interface SmartFinanceRouter { // smart router's functions that calls stargate's router contract to enable cross chain swap function sendSwap( address initiator, bytes memory stargateData, bytes memory payload, uint256 dstChainReleaseAmt ) external payable; } library StringHelper { function concat( bytes memory a, bytes memory b ) internal pure returns (bytes memory) { return abi.encodePacked(a, b); } function getRevertMsg(bytes memory _returnData) internal pure returns (string memory) { if (_returnData.length < 68) return 'Transaction reverted silently'; assembly { _returnData := add(_returnData, 0x04) } return abi.decode(_returnData, (string)); } } contract SmartSwapV2 is Initializable, OwnableUpgradeable, UUPSUpgradeable, ReentrancyGuardUpgradeable, PausableUpgradeable{ using StringHelper for bytes; using StringHelper for uint256; // Smart Finance Contracts address public smartRouter; address public smartHelper; // Failed Tx Recovery Address. address public failedTxRecovery; // Mapping for supported tokens by stargate mapping(address => bool) public isSupportToken; // Mapping for decimals for each stargate's supported token of destination chains. mapping(uint16 => mapping(address => uint8)) public dstSupportDecimal; bool public isWhitelistActive; mapping(address => bool) public isWhitelisted; address public swapTarget0x; event Swap( address initiator, address buyToken, uint256 buyAmount, address sellToken, uint256 sellAmount, address receiver ); function _authorizeUpgrade(address _newImplementation) internal override onlyOwner {} /// @notice Using this function to initialize the smart swap's parameters /// @param _supportToken Address of the stargate supported stable token /// @param _recovery account address that can failed transactions to get tokens out of the account function initialize ( address _supportToken, address _recovery ) public initializer { require(_supportToken != address(0),"Invalid Address"); __Ownable_init(); __UUPSUpgradeable_init(); __Pausable_init(); __ReentrancyGuard_init(); isSupportToken[_supportToken] = true; failedTxRecovery = _recovery; } receive() external payable {} /// @notice withdraw token from the router contract (Only owner can call this fn) /// @param _token address of the token owner wishes to withdraw from the contract function withdraw(address _token) onlyOwner external { require(_token != address(0), "Invalid Address"); IERC20(_token).transfer(msg.sender, IERC20(_token).balanceOf(address(this))); } /// @notice function to Pause smart contract. function pause() public onlyOwner whenNotPaused { _pause(); } /// @notice function to UnPause smart contract function unPause() public onlyOwner whenPaused { _unpause(); } /// @notice withdraw chain native token from the router contract (Only owner can call this fn) function withdrawETH() public onlyOwner { address payable to = payable(msg.sender); to.transfer(address(this).balance); } /// @notice updates the 0x Smart Swap target address. function updateswapTarget0x(address _swapTarget) public onlyOwner { require(address(_swapTarget) != address(0),"No Zero Address"); swapTarget0x = _swapTarget; } /// @notice updates the account address which can call the contract to recover failed transactions /// @param _recovery account address function updateFailedTxRecoveryAddress(address _recovery) public onlyOwner whenNotPaused { failedTxRecovery = _recovery; } function addToWhitelist(address[] calldata _addresses) public onlyOwner { require(_addresses.length <= 100,"Whitelist List exceeds allowed limit."); for(uint256 i = 0; i < _addresses.length; i++) { require(address(_addresses[i]) != address(0),"No Zero Address"); isWhitelisted[_addresses[i]] = true; } } function removeFromWhitelist(address[] calldata _addresses) public onlyOwner { require(_addresses.length <= 100,"Whitelist List exceeds allowed limit."); for(uint256 i = 0; i < _addresses.length; i++) { require(address(_addresses[i]) != address(0),"No Zero Address"); isWhitelisted[_addresses[i]] = false; } } function toggleWhitelistState() external onlyOwner { isWhitelistActive = !isWhitelistActive; } /// @notice updates smart helper contract /// @param _helper smart helper contract address function updateHelper( address _helper ) external onlyOwner whenNotPaused { require(_helper != address(0),"Invalid Address"); smartHelper = _helper; } /// @notice updates smart router contract /// @param _router smart router contract address function updateRouter( address _router ) external onlyOwner whenNotPaused { require(_router != address(0),"Invalid Address"); smartRouter = _router; } /// @notice updates destination chain's supported tokens /// @param _dstChainId destination chain id /// @param _dstToken stargate supported destination stable token address /// @param _dstTokenDecimal token decimals for the token function updateDstSupport( uint16 _dstChainId, address _dstToken, uint8 _dstTokenDecimal ) external onlyOwner whenNotPaused { require(_dstToken != address(0),"Invalid Address"); dstSupportDecimal[_dstChainId][_dstToken] = _dstTokenDecimal; } /// @notice updates src chain's support tokens /// @param _supportToken stargate supported src stable token address function updateSupportToken( address _supportToken ) external onlyOwner whenNotPaused { require(_supportToken != address(0),"Invalid Address"); isSupportToken[_supportToken] = true; } /// @notice updates src chain's support tokens /// @param _supportToken stargate supported src stable token address function removeSupportToken( address _supportToken ) external onlyOwner whenNotPaused { require(_supportToken != address(0),"Invalid Address"); isSupportToken[_supportToken] = false; } /// @notice performs local swap from native to token /// @param buyToken token address which the user wants to swap the native token for /// @param sellAmt amount of native token user wants to swap /// @param receiver address where swapped tokens are to be transferred /// @param swapTarget 0x protocol's dex address to enable swap /// @param swapData byte data containing the local swap information function swapNativeForTokens( address buyToken, uint256 sellAmt, address receiver, address swapTarget, bytes memory swapData ) external payable nonReentrant() whenNotPaused { if(isWhitelistActive) { require(isWhitelisted[msg.sender],"You are NOT Whitelisted"); } // Track balance of the buyToken to determine how much we've bought. uint256 currBuyBal = IERC20(buyToken).balanceOf(address(this)); // Validate swapTarget require(address(swapTarget) == address(swapTarget0x),"Invalid Target Address"); // Swap Token For Token (bool success, bytes memory res) = swapTarget.call{value: sellAmt}(swapData); require(success, string(bytes('SWAP_CALL_FAILED: ').concat(bytes(res.getRevertMsg())))); uint256 boughtBuyAmt = IERC20(buyToken).balanceOf(address(this)) - currBuyBal; // Take the fee. payable(SmartFinanceHelper(smartHelper).feeAddress()).transfer(SmartFinanceHelper(smartHelper).calculateProtocolFees(sellAmt, true)); // Transfer the bought amount to the designated address. IERC20(buyToken).transfer(receiver, boughtBuyAmt); emit Swap( msg.sender, buyToken, boughtBuyAmt, address(0), sellAmt, receiver ); } /// @notice performs local swap from token to token /// @param buyToken token address which the user wants to swap the native token for /// @param sellToken token address which the user wantes to sell /// @param sellAmt amount of native token user wants to swap /// @param spender 0x protocol's dex address to enable swap ### ADD THIS /// @param swapTarget 0x protocol's dex address to enable swap /// @param receiver address where swapped tokens are to be transferred /// @param swapData byte data containing the local swap information function swapTokenForToken( address buyToken, address sellToken, uint256 sellAmt, address spender, address swapTarget, address receiver, bytes memory swapData ) public payable nonReentrant() whenNotPaused { if(isWhitelistActive) { require(isWhitelisted[msg.sender],"You are NOT Whitelisted"); } // Deposit Tokens into the account if (msg.sender != smartRouter){ if(msg.sender != failedTxRecovery) { IERC20(sellToken).transferFrom(msg.sender, address(this), sellAmt); } } // We will always validate the sellAmt in form of Token. require(IERC20(sellToken).balanceOf(address(this)) >= sellAmt, "Insufficient Balance"); // Validate Approval require(IERC20(sellToken).approve(spender, sellAmt), "Sell Token Approval Failed"); uint256 currBuyBal = IERC20(buyToken).balanceOf(address(this)); // Validate swapTarget require(address(swapTarget) == address(swapTarget0x),"Invalid Target Address"); // Swap Token For Token (bool success, bytes memory res) = swapTarget.call(swapData); require(success, string(bytes('SWAP_CALL_FAILED: ').concat(bytes(res.getRevertMsg())))); uint256 boughtBuyAmt = IERC20(buyToken).balanceOf(address(this)) - currBuyBal; // Take the fee. payable(SmartFinanceHelper(smartHelper).feeAddress()).transfer(SmartFinanceHelper(smartHelper).calculateProtocolFees(sellAmt, true)); // Transfer the bought amount to the designated address. IERC20(buyToken).transfer(receiver, boughtBuyAmt); emit Swap( msg.sender, buyToken, boughtBuyAmt, sellToken, sellAmt, receiver ); } /// @notice performs local swap from token to native /// @param sellToken token address which the user wantes to sell /// @param sellAmt amount of native token user wants to swap /// @param spender 0x protocol's dex address to enable swap ### ADD THIS /// @param swapTarget 0x protocol's dex address to enable swap /// @param receiver address where swapped tokens are to be transferred /// @param swapData byte data containing the local swap information function swapTokenForNative( address sellToken, uint256 sellAmt, address spender, address swapTarget, address payable receiver, bytes memory swapData ) public payable nonReentrant() whenNotPaused { if(isWhitelistActive) { require(isWhitelisted[msg.sender],"You are NOT Whitelisted"); } // Deposit Tokens into the account if (msg.sender != smartRouter){ if(msg.sender != failedTxRecovery) { IERC20(sellToken).transferFrom(msg.sender, address(this), sellAmt); } } // We will always validate the sellAmt in form of Token. require(IERC20(sellToken).balanceOf(address(this)) >= sellAmt, "Insufficient Balance"); // Validate Approval require(IERC20(sellToken).approve(spender, sellAmt), "Sell Token Approval Failed"); uint256 currBuyBal = address(this).balance; // Validate swapTarget require(address(swapTarget) == address(swapTarget0x),"Invalid Target Address"); // Swap Token For ETH (bool success, bytes memory res) = swapTarget.call(swapData); require(success, string(bytes('SWAP_CALL_FAILED: ').concat(bytes(res.getRevertMsg())))); uint256 boughtBuyAmt = address(this).balance - currBuyBal; // Take the fee. payable(SmartFinanceHelper(smartHelper).feeAddress()).transfer(SmartFinanceHelper(smartHelper).calculateProtocolFees(sellAmt, true)); // Transfer ETH to the designated address. receiver.transfer(boughtBuyAmt); emit Swap( msg.sender, address(0), boughtBuyAmt, sellToken, sellAmt, receiver ); } // Helper Functions /// @notice creates destination payload to enable swapping to enable user to get the desired token on the destination chain /// @dev return payload to enable swapping to enable user to get the desired token on the destination chain /// @param key referralID /// @param srcChainData encoded stargate's destination chain id, src chain stable token and src chain stable token amount /// @param dstChainSwapData encoded data with information of destination local swap function _createDstChainPayload( uint256 key, bytes memory srcChainData, bytes memory dstChainSwapData ) internal view returns (bytes memory payload) { ( address dstChainSupportToken, address dstChainToken, uint256 dstChainAmount, address spender, address swapTarget, address payable dstReceiver, bytes memory swapData ) = abi.decode(dstChainSwapData, (address, address, uint256, address, address, address, bytes)); // Determine the releaseAmt for Destination { (uint16 dstChainId, address srcChainToken, uint256 srcChainReleaseAmt) = abi.decode(srcChainData, (uint16,address,uint256)); // Normalising the value to 6 decimals. srcChainReleaseAmt = srcChainReleaseAmt * 10**6 / (10**IERC20(srcChainToken).decimals()); uint256 afterStargateFees = SmartFinanceHelper(smartHelper).getDstAmountAfterFees( dstChainId, dstChainSupportToken, srcChainToken, srcChainReleaseAmt ); // After Protocol Fees afterStargateFees = afterStargateFees - SmartFinanceHelper(smartHelper).calculateProtocolFees(afterStargateFees, false); // After Stargate Fees afterStargateFees = afterStargateFees * (10**dstSupportDecimal[dstChainId][dstChainSupportToken]) / 10**6; // Check if the release amount at destination is greater than what we anticipate. require(afterStargateFees >= dstChainAmount,"Insufficient Destination Amount"); } if(dstChainToken == address(0)){ // Native at Destination bytes memory actionObject = abi.encode( dstChainSupportToken, dstChainAmount, spender, swapTarget, dstReceiver, swapData ); return ( abi.encode( msg.sender, uint16(3), key, actionObject ) ); } else if(dstChainToken == dstChainSupportToken) { // Support Token at Destination bytes memory actionObject = abi.encode( dstChainSupportToken, dstChainAmount, dstReceiver ); return ( abi.encode( msg.sender, uint16(1), key, actionObject ) ); } else { // Token at Destination bytes memory actionObject = abi.encode( dstChainToken, dstChainSupportToken, dstChainAmount, spender, swapTarget, dstReceiver, swapData ); return ( abi.encode( msg.sender, uint16(2), key, actionObject ) ); } } // Cross Swap /// @notice performs cross chain swap from native on src chain to token on destination chain /// @param dstChainId stargate's destination chain id /// @param srcChainSwapData encoded data with information of src chain local swap /// @param dstChainSwapData encoded data with information of destination chain local swap /// @param stargateData encoded data with information of stargate cross chain swap function sendCrossSwapNativeForToken( uint16 dstChainId, address referralID, bytes memory srcChainSwapData, bytes memory dstChainSwapData, bytes memory stargateData ) external payable nonReentrant() whenNotPaused { if(isWhitelistActive) { require(isWhitelisted[msg.sender],"You are NOT Whitelisted"); } uint256 key; { if (referralID == address(0)) { if (SmartFinanceHelper(smartHelper).getReferralInfo(msg.sender) != address(0)) { key = SmartFinanceHelper(smartHelper).getReferralID(SmartFinanceHelper(smartHelper).getReferralInfo(msg.sender)); } } else { require(SmartFinanceHelper(smartHelper).getReferralID(referralID) != 0, "SMRT: Invalid Ref ID"); SmartFinanceHelper(smartHelper).setReferralInfo(msg.sender,referralID); key = SmartFinanceHelper(smartHelper).getReferralID(referralID); } } // Break the Src Chain Swap Data ( uint256 sellAmt, address srcBuyToken, address swapTarget, bytes memory swapData ) = abi.decode(srcChainSwapData, (uint256, address, address, bytes)); uint256 balance = IERC20(srcBuyToken).balanceOf(address(this)); require(isSupportToken[srcBuyToken],"Not Support Token"); // Swap Native for Support Token { // Validate swapTarget require(address(swapTarget) == address(swapTarget0x),"Invalid Target Address"); // Swap Native For Token (bool success, bytes memory res) = swapTarget.call{value: sellAmt}(swapData); require(success, string(bytes('SWAP_CALL_FAILED: ').concat(bytes(res.getRevertMsg())))); } // Updated Balance balance = IERC20(srcBuyToken).balanceOf(address(this)) - balance; // Create Payload for Destination bytes memory payload = _createDstChainPayload( key, abi.encode(dstChainId,srcBuyToken,balance), dstChainSwapData ); // Transfer tokens to smartRouter IERC20(srcBuyToken).transfer(smartRouter, balance); // Sends the native token along with destination payload to enable swap on the destination chain SmartFinanceRouter(smartRouter).sendSwap{value: msg.value - sellAmt}( msg.sender, stargateData, payload, balance ); } /// @notice performs cross chain swap from non-native on src chain to token on destination chain /// @param dstChainId stargate's destination chain id /// @param srcChainSwapData encoded data with information of src chain local swap /// @param dstChainSwapData encoded data with information of destination chain local swap /// @param stargateData encoded data with information of stargate cross chain swap function sendCrossSwapTokenForToken( uint16 dstChainId, address referralID, bytes memory srcChainSwapData, bytes memory dstChainSwapData, bytes memory stargateData ) external payable nonReentrant() whenNotPaused { if(isWhitelistActive) { require(isWhitelisted[msg.sender],"You are NOT Whitelisted"); } uint256 key; { if (referralID == address(0)) { if (SmartFinanceHelper(smartHelper).getReferralInfo(msg.sender) != address(0)) { key = SmartFinanceHelper(smartHelper).getReferralID(SmartFinanceHelper(smartHelper).getReferralInfo(msg.sender)); } } else { require(SmartFinanceHelper(smartHelper).getReferralID(referralID) != 0, "SMRT: Invalid Ref ID"); SmartFinanceHelper(smartHelper).setReferralInfo(msg.sender,referralID); key = SmartFinanceHelper(smartHelper).getReferralID(referralID); } } // Break the Src Chain Swap Data ( address srcSellToken, uint256 sellAmt, address srcBuyToken, address swapTarget, address spender, bytes memory swapData ) = abi.decode(srcChainSwapData, (address, uint256, address, address, address, bytes)); // Transfer Tokens IERC20(srcSellToken).transferFrom(msg.sender, address(this), sellAmt); uint256 balance = IERC20(srcBuyToken).balanceOf(address(this)); require(isSupportToken[srcBuyToken],"Not Support Token"); if(isSupportToken[srcSellToken]){ // Update Balance to the support Token Sell Amt. balance = sellAmt; } else { // Swap Token for Support Token { // Validate Approval require(IERC20(srcSellToken).approve(spender, sellAmt), "Sell Token Approval Failed"); // Validate swapTarget require(address(swapTarget) == address(swapTarget0x),"Invalid Target Address"); // Swap Token For Token (bool success, bytes memory res) = swapTarget.call(swapData); require(success, string(bytes('SWAP_CALL_FAILED: ').concat(bytes(res.getRevertMsg())))); } // Updated Balance balance = IERC20(srcBuyToken).balanceOf(address(this)) - balance; } // Create Payload for Destination bytes memory payload = _createDstChainPayload( key, abi.encode(dstChainId,srcBuyToken,balance), dstChainSwapData ); // Transfer tokens to smartRouter IERC20(srcBuyToken).transfer(smartRouter, balance); // Sends the native token along with destination payload to enable swap on the destination chain SmartFinanceRouter(smartRouter).sendSwap{value: msg.value}( msg.sender, stargateData, payload, balance ); } /// @notice receives payload from the smart router on the destination chain to enable swapping of received stargate supported tokens into the token the user wants /// @param amountLD amount received from stargate's router /// @param payload encoded data containing information for local swap function receivePayload( uint256 amountLD, bytes memory payload ) external payable { require(msg.sender == smartRouter,"Only SmartFinanceRouter"); ( , uint16 actionType, uint256 key, bytes memory actionObject ) = abi.decode(payload, (address, uint16, uint256, bytes)); if(actionType == uint16(1)){ ( address token, , address receiver ) = abi.decode(actionObject, (address, uint256, address)); { // Send to the receiver uint256 fee = SmartFinanceHelper(smartHelper).calculateProtocolFees(amountLD, false); // Send Tokens IERC20(token).transfer(receiver, amountLD-fee); // Transfer the fees { if (key != 0) { // Transfer Referral Fee. IERC20(token).transfer(SmartFinanceHelper(smartHelper).getDestReferralID(key), SmartFinanceHelper(smartHelper).calculateProtocolReferralFees(fee)); // Transfer Protocol Fee. IERC20(token).transfer(SmartFinanceHelper(smartHelper).feeAddress(), fee-SmartFinanceHelper(smartHelper).calculateProtocolReferralFees(fee)); } else { // Transfer Protocol Fee. IERC20(token).transfer(SmartFinanceHelper(smartHelper).feeAddress(), fee); } } } } else if(actionType == uint16(2)) { ( address buyToken, address sellToken, uint256 sellAmt, address spender, address swapTarget, address receiver, bytes memory swapData ) = abi.decode(actionObject, (address, address, uint256, address, address, address, bytes)); // Swap Support Token for Designated Token { // Get the ideal balance of the contract before transfer from Router. uint256 idealBalance = IERC20(sellToken).balanceOf(address(this)) - amountLD; // We will always validate the sellAmt. require(idealBalance + amountLD >= sellAmt, "Insufficient Balance"); // Validate Approval require(IERC20(sellToken).approve(spender, sellAmt), "Sell Token Approval Failed"); uint256 currBuyBal = IERC20(buyToken).balanceOf(address(this)); // Validate swapTarget require(address(swapTarget) == address(swapTarget0x),"Invalid Target Address"); // Swap Token For Token { (bool success, bytes memory res) = swapTarget.call(swapData); require(success, string(bytes('SWAP_CALL_FAILED: ').concat(bytes(res.getRevertMsg())))); } // Transfer the bought amount to the designated address. { uint256 boughtBuyAmt = IERC20(buyToken).balanceOf(address(this)) - currBuyBal; IERC20(buyToken).transfer(receiver, boughtBuyAmt); } // Transfer the fees to feeAddress { // Calculate Fee uint256 fee = IERC20(sellToken).balanceOf(address(this)) - idealBalance; require(fee >= SmartFinanceHelper(smartHelper).calculateProtocolFees(sellAmt, false), "Service Fee too low."); if (key != 0) { // Transfer Referral Fee. IERC20(sellToken).transfer(SmartFinanceHelper(smartHelper).getDestReferralID(key), SmartFinanceHelper(smartHelper).calculateProtocolReferralFees(fee)); // Transfer Protocol Fee. IERC20(sellToken).transfer(SmartFinanceHelper(smartHelper).feeAddress(), fee - SmartFinanceHelper(smartHelper).calculateProtocolReferralFees(fee)); } else { // Transfer Protocol Fee. IERC20(sellToken).transfer(SmartFinanceHelper(smartHelper).feeAddress(), fee); } } } } else { ( address sellToken, uint256 sellAmt, address spender, address swapTarget, address payable receiver, bytes memory swapData ) = abi.decode(actionObject, (address, uint256, address, address, address, bytes)); // Swap Support Tokens For Native Asset { // Get the ideal balance of the contract before transfer from Router. uint256 idealBalance = IERC20(sellToken).balanceOf(address(this)) - amountLD; // We will always validate the sellAmt. require(idealBalance + amountLD >= sellAmt, "Insufficient Balance"); // Validate Approval require(IERC20(sellToken).approve(spender, sellAmt), "Sell Token Approval Failed"); uint256 currBuyBal = address(this).balance; // Validate swapTarget require(address(swapTarget) == address(swapTarget0x),"Invalid Target Address"); // Swap Token For Token { (bool success, bytes memory res) = swapTarget.call(swapData); require(success, string(bytes('SWAP_CALL_FAILED: ').concat(bytes(res.getRevertMsg())))); } // Transfer the bought amount to the designated address. { uint256 boughtBuyAmt = address(this).balance - currBuyBal; receiver.transfer(boughtBuyAmt); } // Transfer the fees to feeAddress { // Calculate Fee uint256 fee = IERC20(sellToken).balanceOf(address(this)) - idealBalance; require(fee >= SmartFinanceHelper(smartHelper).calculateProtocolFees(sellAmt, false), "Service Fee too low."); if (key != 0) { // Transfer Referral Fee. IERC20(sellToken).transfer(SmartFinanceHelper(smartHelper).getDestReferralID(key), SmartFinanceHelper(smartHelper).calculateProtocolReferralFees(fee)); // Transfer Protocol Fee. IERC20(sellToken).transfer(SmartFinanceHelper(smartHelper).feeAddress(), fee - SmartFinanceHelper(smartHelper).calculateProtocolReferralFees(fee)); } else { // Transfer Protocol Fee. IERC20(sellToken).transfer(SmartFinanceHelper(smartHelper).feeAddress(), fee); } } } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"initiator","type":"address"},{"indexed":false,"internalType":"address","name":"buyToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"buyAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"sellToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"sellAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"address","name":"","type":"address"}],"name":"dstSupportDecimal","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"failedTxRecovery","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_supportToken","type":"address"},{"internalType":"address","name":"_recovery","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isSupportToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitelistActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"receivePayload","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_supportToken","type":"address"}],"name":"removeSupportToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"dstChainId","type":"uint16"},{"internalType":"address","name":"referralID","type":"address"},{"internalType":"bytes","name":"srcChainSwapData","type":"bytes"},{"internalType":"bytes","name":"dstChainSwapData","type":"bytes"},{"internalType":"bytes","name":"stargateData","type":"bytes"}],"name":"sendCrossSwapNativeForToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"dstChainId","type":"uint16"},{"internalType":"address","name":"referralID","type":"address"},{"internalType":"bytes","name":"srcChainSwapData","type":"bytes"},{"internalType":"bytes","name":"dstChainSwapData","type":"bytes"},{"internalType":"bytes","name":"stargateData","type":"bytes"}],"name":"sendCrossSwapTokenForToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"smartHelper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"smartRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"buyToken","type":"address"},{"internalType":"uint256","name":"sellAmt","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"swapTarget","type":"address"},{"internalType":"bytes","name":"swapData","type":"bytes"}],"name":"swapNativeForTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"swapTarget0x","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sellToken","type":"address"},{"internalType":"uint256","name":"sellAmt","type":"uint256"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"address","name":"swapTarget","type":"address"},{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"bytes","name":"swapData","type":"bytes"}],"name":"swapTokenForNative","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"buyToken","type":"address"},{"internalType":"address","name":"sellToken","type":"address"},{"internalType":"uint256","name":"sellAmt","type":"uint256"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"address","name":"swapTarget","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes","name":"swapData","type":"bytes"}],"name":"swapTokenForToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"toggleWhitelistState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_dstToken","type":"address"},{"internalType":"uint8","name":"_dstTokenDecimal","type":"uint8"}],"name":"updateDstSupport","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recovery","type":"address"}],"name":"updateFailedTxRecoveryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_helper","type":"address"}],"name":"updateHelper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"updateRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_supportToken","type":"address"}],"name":"updateSupportToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_swapTarget","type":"address"}],"name":"updateswapTarget0x","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040523060805234801561001457600080fd5b50608051615d086200004d60003960008181610f9701528181610fd7015281816112060152818161124601526113d90152615d086000f3fe6080604052600436106102135760003560e01c806375d3abc811610118578063e086e5ec116100a0578063f2fde38b1161006f578063f2fde38b14610608578063f545078314610628578063f67ea30914610649578063f7b188a51461065c578063fd59cbe71461067157600080fd5b8063e086e5ec146105ab578063e2769cfa146105c0578063e62a7ae2146105e0578063ec16c530146105f557600080fd5b80638da5cb5b116100e75780638da5cb5b1461050d578063a1d767961461052b578063af2800c21461054b578063b4139be41461056b578063c851cc321461058b57600080fd5b806375d3abc8146104975780637f649783146104b85780638456cb59146104d85780638bcc4166146104ed57600080fd5b806349f5acca1161019b57806352d1902d1161016a57806352d1902d14610414578063548db174146104375780635c975abb1461045757806363613a7b1461046f578063715018a61461048257600080fd5b806349f5acca146103a55780634f1ef286146103c657806351cff8d9146103d9578063524513d6146103f957600080fd5b8063238ed823116101e2578063238ed823146102e05780633659cfe6146102f35780633af32abf14610313578063485cc9551461035457806348d58d221461037457600080fd5b806306ae524a1461021f5780630a800e541461025d578063147182711461027f578063200af02a146102cd57600080fd5b3661021a57005b600080fd5b34801561022b57600080fd5b5061012f54610240906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561026957600080fd5b5061027d610278366004614df9565b610684565b005b34801561028b57600080fd5b506102bb61029a366004614e26565b61013160209081526000928352604080842090915290825290205460ff1681565b60405160ff9091168152602001610254565b61027d6102db366004614f22565b6106de565b61027d6102ee366004614fb1565b610b9e565b3480156102ff57600080fd5b5061027d61030e366004614df9565b610f8d565b34801561031f57600080fd5b5061034461032e366004614df9565b6101336020526000908152604090205460ff1681565b6040519015158152602001610254565b34801561036057600080fd5b5061027d61036f36600461502f565b61106c565b34801561038057600080fd5b5061034461038f366004614df9565b6101306020526000908152604090205460ff1681565b3480156103b157600080fd5b5061013454610240906001600160a01b031681565b61027d6103d436600461504d565b6111fc565b3480156103e557600080fd5b5061027d6103f4366004614df9565b6112cc565b34801561040557600080fd5b50610132546103449060ff1681565b34801561042057600080fd5b506104296113cc565b604051908152602001610254565b34801561044357600080fd5b5061027d61045236600461509c565b61147f565b34801561046357600080fd5b5060fb5460ff16610344565b61027d61047d366004615110565b61156a565b34801561048e57600080fd5b5061027d612a4c565b3480156104a357600080fd5b5061012e54610240906001600160a01b031681565b3480156104c457600080fd5b5061027d6104d336600461509c565b612a60565b3480156104e457600080fd5b5061027d612b4b565b3480156104f957600080fd5b5061027d610508366004614df9565b612b63565b34801561051957600080fd5b506033546001600160a01b0316610240565b34801561053757600080fd5b5061027d61054636600461514f565b612bbc565b34801561055757600080fd5b5061027d610566366004614df9565b612c30565b34801561057757600080fd5b5061027d610586366004614df9565b612c8b565b34801561059757600080fd5b5061027d6105a6366004614df9565b612cbe565b3480156105b757600080fd5b5061027d612d17565b3480156105cc57600080fd5b5061027d6105db366004614df9565b612d4d565b3480156105ec57600080fd5b5061027d612da5565b61027d61060336600461519a565b612dc2565b34801561061457600080fd5b5061027d610623366004614df9565b6135c6565b34801561063457600080fd5b5061012d54610240906001600160a01b031681565b61027d61065736600461519a565b61363c565b34801561066857600080fd5b5061027d613d0f565b61027d61067f36600461523a565b613d27565b61068c6142ca565b6001600160a01b0381166106bb5760405162461bcd60e51b81526004016106b2906152dd565b60405180910390fd5b61013480546001600160a01b0319166001600160a01b0392909216919091179055565b600260c954036107005760405162461bcd60e51b81526004016106b290615306565b600260c95561070d614324565b6101325460ff161561074957336000908152610133602052604090205460ff166107495760405162461bcd60e51b81526004016106b29061533d565b61012d546001600160a01b031633146107e85761012f546001600160a01b031633146107e8576040516323b872dd60e01b8152336004820152306024820152604481018690526001600160a01b038716906323b872dd906064016020604051808303816000875af11580156107c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e69190615374565b505b6040516370a0823160e01b815230600482015285906001600160a01b038816906370a0823190602401602060405180830381865afa15801561082e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108529190615396565b10156108705760405162461bcd60e51b81526004016106b2906153af565b60405163095ea7b360e01b81526001600160a01b0387169063095ea7b39061089e90879089906004016153dd565b6020604051808303816000875af11580156108bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e19190615374565b6108fd5760405162461bcd60e51b81526004016106b2906153f6565b6101345447906001600160a01b0385811691161461092d5760405162461bcd60e51b81526004016106b29061542d565b600080856001600160a01b0316846040516109489190615481565b6000604051808303816000865af19150503d8060008114610985576040519150601f19603f3d011682016040523d82523d6000602084013e61098a565b606091505b5091509150816109cb61099c8361436a565b604080518082019091526012815271029aba0a82fa1a0a6262fa320a4a622a21d160751b6020820152906143cf565b906109e95760405162461bcd60e51b81526004016106b291906154c9565b5060006109f684476154f2565b905061012e60009054906101000a90046001600160a01b03166001600160a01b031663412753586040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a709190615505565b61012e5460405163231929d360e01b8152600481018c9052600160248201526001600160a01b03928316926108fc92169063231929d390604401602060405180830381865afa158015610ac7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aeb9190615396565b6040518115909202916000818181858888f19350505050158015610b13573d6000803e3d6000fd5b506040516001600160a01b0387169082156108fc029083906000818181858888f19350505050158015610b4a573d6000803e3d6000fd5b507f5b7284eacd81a8429db68d2da54b85765d088de36dfbdde65bfe29ef1993f860336000838d8d8b604051610b8596959493929190615522565b60405180910390a15050600160c9555050505050505050565b600260c95403610bc05760405162461bcd60e51b81526004016106b290615306565b600260c955610bcd614324565b6101325460ff1615610c0957336000908152610133602052604090205460ff16610c095760405162461bcd60e51b81526004016106b29061533d565b6040516370a0823160e01b81523060048201526000906001600160a01b038716906370a0823190602401602060405180830381865afa158015610c50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c749190615396565b610134549091506001600160a01b03848116911614610ca55760405162461bcd60e51b81526004016106b29061542d565b600080846001600160a01b03168785604051610cc19190615481565b60006040518083038185875af1925050503d8060008114610cfe576040519150601f19603f3d011682016040523d82523d6000602084013e610d03565b606091505b509150915081610d1561099c8361436a565b90610d335760405162461bcd60e51b81526004016106b291906154c9565b506040516370a0823160e01b815230600482015260009084906001600160a01b038b16906370a0823190602401602060405180830381865afa158015610d7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da19190615396565b610dab91906154f2565b905061012e60009054906101000a90046001600160a01b03166001600160a01b031663412753586040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e259190615505565b61012e5460405163231929d360e01b8152600481018b9052600160248201526001600160a01b03928316926108fc92169063231929d390604401602060405180830381865afa158015610e7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea09190615396565b6040518115909202916000818181858888f19350505050158015610ec8573d6000803e3d6000fd5b5060405163a9059cbb60e01b81526001600160a01b038a169063a9059cbb90610ef7908a9085906004016153dd565b6020604051808303816000875af1158015610f16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3a9190615374565b507f5b7284eacd81a8429db68d2da54b85765d088de36dfbdde65bfe29ef1993f860338a8360008c8c604051610f7596959493929190615522565b60405180910390a15050600160c95550505050505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610fd55760405162461bcd60e51b81526004016106b29061555a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661101e600080516020615c8c833981519152546001600160a01b031690565b6001600160a01b0316146110445760405162461bcd60e51b81526004016106b2906155a6565b61104d816143fb565b6040805160008082526020820190925261106991839190614403565b50565b600054610100900460ff161580801561108c5750600054600160ff909116105b806110a65750303b1580156110a6575060005460ff166001145b6111095760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106b2565b6000805460ff19166001179055801561112c576000805461ff0019166101001790555b6001600160a01b0383166111525760405162461bcd60e51b81526004016106b2906155f2565b61115a61456e565b61116261459d565b61116a6145c4565b6111726145f3565b6001600160a01b03808416600090815261013060205260409020805460ff1916600117905561012f80549184166001600160a01b031990921691909117905580156111f7576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036112445760405162461bcd60e51b81526004016106b29061555a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661128d600080516020615c8c833981519152546001600160a01b031690565b6001600160a01b0316146112b35760405162461bcd60e51b81526004016106b2906155a6565b6112bc826143fb565b6112c882826001614403565b5050565b6112d46142ca565b6001600160a01b0381166112fa5760405162461bcd60e51b81526004016106b2906155f2565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015611348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136c9190615396565b6040518363ffffffff1660e01b81526004016113899291906153dd565b6020604051808303816000875af11580156113a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c89190615374565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461146c5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016106b2565b50600080516020615c8c83398151915290565b6114876142ca565b60648111156114a85760405162461bcd60e51b81526004016106b29061561b565b60005b818110156111f75760008383838181106114c7576114c7615660565b90506020020160208101906114dc9190614df9565b6001600160a01b0316036115025760405162461bcd60e51b81526004016106b2906152dd565b6000610133600085858581811061151b5761151b615660565b90506020020160208101906115309190614df9565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061156281615676565b9150506114ab565b61012d546001600160a01b031633146115c55760405162461bcd60e51b815260206004820152601760248201527f4f6e6c7920536d61727446696e616e6365526f7574657200000000000000000060448201526064016106b2565b6000806000838060200190518101906115de91906156df565b919550935091505060001961ffff841601611aa6576000808280602001905181019061160a919061574c565b61012e5460405163231929d360e01b8152600481018c90526000602482018190529496509194506001600160a01b0316915063231929d390604401602060405180830381865afa158015611662573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116869190615396565b90506001600160a01b03831663a9059cbb836116a2848c6154f2565b6040518363ffffffff1660e01b81526004016116bf9291906153dd565b6020604051808303816000875af11580156116de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117029190615374565b5084156119b45761012e54604051635e0d4ce760e01b8152600481018790526001600160a01b038581169263a9059cbb92911690635e0d4ce790602401602060405180830381865afa15801561175c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117809190615505565b61012e546040516351c9513760e11b8152600481018690526001600160a01b039091169063a392a26e90602401602060405180830381865afa1580156117ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ee9190615396565b6040518363ffffffff1660e01b815260040161180b9291906153dd565b6020604051808303816000875af115801561182a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184e9190615374565b50826001600160a01b031663a9059cbb61012e60009054906101000a90046001600160a01b03166001600160a01b031663412753586040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d69190615505565b61012e546040516351c9513760e11b8152600481018690526001600160a01b039091169063a392a26e90602401602060405180830381865afa158015611920573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119449190615396565b61194e90856154f2565b6040518363ffffffff1660e01b815260040161196b9291906153dd565b6020604051808303816000875af115801561198a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ae9190615374565b50611a9e565b826001600160a01b031663a9059cbb61012e60009054906101000a90046001600160a01b03166001600160a01b031663412753586040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3b9190615505565b836040518363ffffffff1660e01b8152600401611a599291906153dd565b6020604051808303816000875af1158015611a78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9c9190615374565b505b505050612a45565b60011961ffff84160161230957600080600080600080600087806020019051810190611ad29190615784565b6040516370a0823160e01b8152306004820152969d50949b509299509097509550935091506000908d906001600160a01b038916906370a0823190602401602060405180830381865afa158015611b2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b519190615396565b611b5b91906154f2565b905085611b688e8361581d565b1015611b865760405162461bcd60e51b81526004016106b2906153af565b60405163095ea7b360e01b81526001600160a01b0388169063095ea7b390611bb49088908a906004016153dd565b6020604051808303816000875af1158015611bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf79190615374565b611c135760405162461bcd60e51b81526004016106b2906153f6565b6040516370a0823160e01b81523060048201526000906001600160a01b038a16906370a0823190602401602060405180830381865afa158015611c5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7e9190615396565b610134549091506001600160a01b03868116911614611caf5760405162461bcd60e51b81526004016106b29061542d565b600080866001600160a01b031685604051611cca9190615481565b6000604051808303816000865af19150503d8060008114611d07576040519150601f19603f3d011682016040523d82523d6000602084013e611d0c565b606091505b509150915081611d1e61099c8361436a565b90611d3c5760405162461bcd60e51b81526004016106b291906154c9565b50506040516370a0823160e01b81523060048201526000915082906001600160a01b038c16906370a0823190602401602060405180830381865afa158015611d88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dac9190615396565b611db691906154f2565b60405163a9059cbb60e01b81529091506001600160a01b038b169063a9059cbb90611de790889085906004016153dd565b6020604051808303816000875af1158015611e06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2a9190615374565b50506040516370a0823160e01b815230600482015260009083906001600160a01b038b16906370a0823190602401602060405180830381865afa158015611e75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e999190615396565b611ea391906154f2565b61012e5460405163231929d360e01b8152600481018b9052600060248201529192506001600160a01b03169063231929d390604401602060405180830381865afa158015611ef5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f199190615396565b811015611f5f5760405162461bcd60e51b815260206004820152601460248201527329b2b93b34b1b2902332b2903a37b7903637bb9760611b60448201526064016106b2565b8b156122105761012e54604051635e0d4ce760e01b8152600481018e90526001600160a01b03808c169263a9059cbb92911690635e0d4ce790602401602060405180830381865afa158015611fb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fdc9190615505565b61012e546040516351c9513760e11b8152600481018690526001600160a01b039091169063a392a26e90602401602060405180830381865afa158015612026573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204a9190615396565b6040518363ffffffff1660e01b81526004016120679291906153dd565b6020604051808303816000875af1158015612086573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120aa9190615374565b50886001600160a01b031663a9059cbb61012e60009054906101000a90046001600160a01b03166001600160a01b031663412753586040518163ffffffff1660e01b8152600401602060405180830381865afa15801561210e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121329190615505565b61012e546040516351c9513760e11b8152600481018690526001600160a01b039091169063a392a26e90602401602060405180830381865afa15801561217c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a09190615396565b6121aa90856154f2565b6040518363ffffffff1660e01b81526004016121c79291906153dd565b6020604051808303816000875af11580156121e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061220a9190615374565b506122fa565b886001600160a01b031663a9059cbb61012e60009054906101000a90046001600160a01b03166001600160a01b031663412753586040518163ffffffff1660e01b8152600401602060405180830381865afa158015612273573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122979190615505565b836040518363ffffffff1660e01b81526004016122b59291906153dd565b6020604051808303816000875af11580156122d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f89190615374565b505b50505050505050505050612a45565b600080600080600080868060200190518101906123269190615830565b6040516370a0823160e01b8152306004820152959b509399509197509550935091506000908c906001600160a01b038916906370a0823190602401602060405180830381865afa15801561237e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123a29190615396565b6123ac91906154f2565b9050856123b98d8361581d565b10156123d75760405162461bcd60e51b81526004016106b2906153af565b60405163095ea7b360e01b81526001600160a01b0388169063095ea7b3906124059088908a906004016153dd565b6020604051808303816000875af1158015612424573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124489190615374565b6124645760405162461bcd60e51b81526004016106b2906153f6565b6101345447906001600160a01b038681169116146124945760405162461bcd60e51b81526004016106b29061542d565b600080866001600160a01b0316856040516124af9190615481565b6000604051808303816000865af19150503d80600081146124ec576040519150601f19603f3d011682016040523d82523d6000602084013e6124f1565b606091505b50915091508161250361099c8361436a565b906125215760405162461bcd60e51b81526004016106b291906154c9565b5050506000814761253291906154f2565b6040519091506001600160a01b0386169082156108fc029083906000818181858888f1935050505015801561256b573d6000803e3d6000fd5b50506040516370a0823160e01b815230600482015260009083906001600160a01b038b16906370a0823190602401602060405180830381865afa1580156125b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125da9190615396565b6125e491906154f2565b61012e5460405163231929d360e01b8152600481018b9052600060248201529192506001600160a01b03169063231929d390604401602060405180830381865afa158015612636573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265a9190615396565b8110156126a05760405162461bcd60e51b815260206004820152601460248201527329b2b93b34b1b2902332b2903a37b7903637bb9760611b60448201526064016106b2565b8a156129515761012e54604051635e0d4ce760e01b8152600481018d90526001600160a01b03808c169263a9059cbb92911690635e0d4ce790602401602060405180830381865afa1580156126f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271d9190615505565b61012e546040516351c9513760e11b8152600481018690526001600160a01b039091169063a392a26e90602401602060405180830381865afa158015612767573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278b9190615396565b6040518363ffffffff1660e01b81526004016127a89291906153dd565b6020604051808303816000875af11580156127c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127eb9190615374565b50886001600160a01b031663a9059cbb61012e60009054906101000a90046001600160a01b03166001600160a01b031663412753586040518163ffffffff1660e01b8152600401602060405180830381865afa15801561284f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128739190615505565b61012e546040516351c9513760e11b8152600481018690526001600160a01b039091169063a392a26e90602401602060405180830381865afa1580156128bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128e19190615396565b6128eb90856154f2565b6040518363ffffffff1660e01b81526004016129089291906153dd565b6020604051808303816000875af1158015612927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294b9190615374565b50612a3b565b886001600160a01b031663a9059cbb61012e60009054906101000a90046001600160a01b03166001600160a01b031663412753586040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129d89190615505565b836040518363ffffffff1660e01b81526004016129f69291906153dd565b6020604051808303816000875af1158015612a15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a399190615374565b505b5050505050505050505b5050505050565b612a546142ca565b612a5e6000614622565b565b612a686142ca565b6064811115612a895760405162461bcd60e51b81526004016106b29061561b565b60005b818110156111f7576000838383818110612aa857612aa8615660565b9050602002016020810190612abd9190614df9565b6001600160a01b031603612ae35760405162461bcd60e51b81526004016106b2906152dd565b60016101336000858585818110612afc57612afc615660565b9050602002016020810190612b119190614df9565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580612b4381615676565b915050612a8c565b612b536142ca565b612b5b614324565b612a5e614674565b612b6b6142ca565b612b73614324565b6001600160a01b038116612b995760405162461bcd60e51b81526004016106b2906155f2565b61012e80546001600160a01b0319166001600160a01b0392909216919091179055565b612bc46142ca565b612bcc614324565b6001600160a01b038216612bf25760405162461bcd60e51b81526004016106b2906155f2565b61ffff9092166000908152610131602090815260408083206001600160a01b03909416835292905220805460ff90921660ff19909216919091179055565b612c386142ca565b612c40614324565b6001600160a01b038116612c665760405162461bcd60e51b81526004016106b2906155f2565b6001600160a01b0316600090815261013060205260409020805460ff19166001179055565b612c936142ca565b612c9b614324565b61012f80546001600160a01b0319166001600160a01b0392909216919091179055565b612cc66142ca565b612cce614324565b6001600160a01b038116612cf45760405162461bcd60e51b81526004016106b2906155f2565b61012d80546001600160a01b0319166001600160a01b0392909216919091179055565b612d1f6142ca565b604051339081904780156108fc02916000818181858888f193505050501580156112c8573d6000803e3d6000fd5b612d556142ca565b612d5d614324565b6001600160a01b038116612d835760405162461bcd60e51b81526004016106b2906155f2565b6001600160a01b0316600090815261013060205260409020805460ff19169055565b612dad6142ca565b610132805460ff19811660ff90911615179055565b600260c95403612de45760405162461bcd60e51b81526004016106b290615306565b600260c955612df1614324565b6101325460ff1615612e2d57336000908152610133602052604090205460ff16612e2d5760405162461bcd60e51b81526004016106b29061533d565b60006001600160a01b038516612f9e5761012e546040516310c3a57160e11b81523360048201526000916001600160a01b0316906321874ae290602401602060405180830381865afa158015612e87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eab9190615505565b6001600160a01b031614612f995761012e546040516310c3a57160e11b81523360048201526001600160a01b0390911690635e81935e9082906321874ae290602401602060405180830381865afa158015612f0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f2e9190615505565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612f72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f969190615396565b90505b61312b565b61012e54604051632f40c9af60e11b81526001600160a01b03878116600483015290911690635e81935e90602401602060405180830381865afa158015612fe9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061300d9190615396565b6000036130535760405162461bcd60e51b815260206004820152601460248201527314d354950e88125b9d985b1a590814995988125160621b60448201526064016106b2565b61012e546040516308ca917960e21b81523360048201526001600160a01b0387811660248301529091169063232a45e490604401600060405180830381600087803b1580156130a157600080fd5b505af11580156130b5573d6000803e3d6000fd5b505061012e54604051632f40c9af60e11b81526001600160a01b0389811660048301529091169250635e81935e9150602401602060405180830381865afa158015613104573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131289190615396565b90505b600080600080600080898060200190518101906131489190615830565b6040516323b872dd60e01b815233600482015230602482015260448101869052959b509399509197509550935091506001600160a01b038716906323b872dd906064016020604051808303816000875af11580156131aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ce9190615374565b506040516370a0823160e01b81523060048201526000906001600160a01b038616906370a0823190602401602060405180830381865afa158015613216573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061323a9190615396565b6001600160a01b0386166000908152610130602052604090205490915060ff1661329a5760405162461bcd60e51b81526020600482015260116024820152702737ba1029bab83837b93a102a37b5b2b760791b60448201526064016106b2565b6001600160a01b0387166000908152610130602052604090205460ff16156132c3575084613485565b60405163095ea7b360e01b81526001600160a01b0388169063095ea7b3906132f19086908a906004016153dd565b6020604051808303816000875af1158015613310573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133349190615374565b6133505760405162461bcd60e51b81526004016106b2906153f6565b610134546001600160a01b0385811691161461337e5760405162461bcd60e51b81526004016106b29061542d565b600080856001600160a01b0316846040516133999190615481565b6000604051808303816000865af19150503d80600081146133d6576040519150601f19603f3d011682016040523d82523d6000602084013e6133db565b606091505b5091509150816133ed61099c8361436a565b9061340b5760405162461bcd60e51b81526004016106b291906154c9565b50506040516370a0823160e01b81523060048201528291506001600160a01b038716906370a0823190602401602060405180830381865afa158015613454573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134789190615396565b61348291906154f2565b90505b6040805161ffff8f1660208201526001600160a01b03871691810191909152606081018290526000906134cc908a906080016040516020818303038152906040528d6146ce565b61012d5460405163a9059cbb60e01b81529192506001600160a01b038089169263a9059cbb9261350292169086906004016153dd565b6020604051808303816000875af1158015613521573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135459190615374565b5061012d54604051632cad4a6d60e21b81526001600160a01b039091169063b2b529b490349061357f9033908f90879089906004016158b6565b6000604051808303818588803b15801561359857600080fd5b505af11580156135ac573d6000803e3d6000fd5b5050600160c9555050505050505050505050505050505050565b6135ce6142ca565b6001600160a01b0381166136335760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106b2565b61106981614622565b600260c9540361365e5760405162461bcd60e51b81526004016106b290615306565b600260c95561366b614324565b6101325460ff16156136a757336000908152610133602052604090205460ff166136a75760405162461bcd60e51b81526004016106b29061533d565b60006001600160a01b0385166138185761012e546040516310c3a57160e11b81523360048201526000916001600160a01b0316906321874ae290602401602060405180830381865afa158015613701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137259190615505565b6001600160a01b0316146138135761012e546040516310c3a57160e11b81523360048201526001600160a01b0390911690635e81935e9082906321874ae290602401602060405180830381865afa158015613784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137a89190615505565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156137ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138109190615396565b90505b6139a5565b61012e54604051632f40c9af60e11b81526001600160a01b03878116600483015290911690635e81935e90602401602060405180830381865afa158015613863573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138879190615396565b6000036138cd5760405162461bcd60e51b815260206004820152601460248201527314d354950e88125b9d985b1a590814995988125160621b60448201526064016106b2565b61012e546040516308ca917960e21b81523360048201526001600160a01b0387811660248301529091169063232a45e490604401600060405180830381600087803b15801561391b57600080fd5b505af115801561392f573d6000803e3d6000fd5b505061012e54604051632f40c9af60e11b81526001600160a01b0389811660048301529091169250635e81935e9150602401602060405180830381865afa15801561397e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139a29190615396565b90505b600080600080878060200190518101906139bf91906158fe565b6040516370a0823160e01b8152306004820152939750919550935091506000906001600160a01b038516906370a0823190602401602060405180830381865afa158015613a10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a349190615396565b6001600160a01b0385166000908152610130602052604090205490915060ff16613a945760405162461bcd60e51b81526020600482015260116024820152702737ba1029bab83837b93a102a37b5b2b760791b60448201526064016106b2565b610134546001600160a01b03848116911614613ac25760405162461bcd60e51b81526004016106b29061542d565b600080846001600160a01b03168785604051613ade9190615481565b60006040518083038185875af1925050503d8060008114613b1b576040519150601f19603f3d011682016040523d82523d6000602084013e613b20565b606091505b509150915081613b3261099c8361436a565b90613b505760405162461bcd60e51b81526004016106b291906154c9565b50506040516370a0823160e01b81523060048201528291506001600160a01b038616906370a0823190602401602060405180830381865afa158015613b99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bbd9190615396565b613bc791906154f2565b6040805161ffff8e1660208201526001600160a01b0387169181019190915260608101829052909150600090613c119088906080016040516020818303038152906040528b6146ce565b61012d5460405163a9059cbb60e01b81529192506001600160a01b038088169263a9059cbb92613c4792169086906004016153dd565b6020604051808303816000875af1158015613c66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c8a9190615374565b5061012d546001600160a01b031663b2b529b4613ca788346154f2565b338b85876040518663ffffffff1660e01b8152600401613cca94939291906158b6565b6000604051808303818588803b158015613ce357600080fd5b505af1158015613cf7573d6000803e3d6000fd5b5050600160c955505050505050505050505050505050565b613d176142ca565b613d1f614a9d565b612a5e614ae6565b600260c95403613d495760405162461bcd60e51b81526004016106b290615306565b600260c955613d56614324565b6101325460ff1615613d9257336000908152610133602052604090205460ff16613d925760405162461bcd60e51b81526004016106b29061533d565b61012d546001600160a01b03163314613e315761012f546001600160a01b03163314613e31576040516323b872dd60e01b8152336004820152306024820152604481018690526001600160a01b038716906323b872dd906064016020604051808303816000875af1158015613e0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e2f9190615374565b505b6040516370a0823160e01b815230600482015285906001600160a01b038816906370a0823190602401602060405180830381865afa158015613e77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e9b9190615396565b1015613eb95760405162461bcd60e51b81526004016106b2906153af565b60405163095ea7b360e01b81526001600160a01b0387169063095ea7b390613ee790879089906004016153dd565b6020604051808303816000875af1158015613f06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f2a9190615374565b613f465760405162461bcd60e51b81526004016106b2906153f6565b6040516370a0823160e01b81523060048201526000906001600160a01b038916906370a0823190602401602060405180830381865afa158015613f8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fb19190615396565b610134549091506001600160a01b03858116911614613fe25760405162461bcd60e51b81526004016106b29061542d565b600080856001600160a01b031684604051613ffd9190615481565b6000604051808303816000865af19150503d806000811461403a576040519150601f19603f3d011682016040523d82523d6000602084013e61403f565b606091505b50915091508161405161099c8361436a565b9061406f5760405162461bcd60e51b81526004016106b291906154c9565b506040516370a0823160e01b815230600482015260009084906001600160a01b038d16906370a0823190602401602060405180830381865afa1580156140b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140dd9190615396565b6140e791906154f2565b905061012e60009054906101000a90046001600160a01b03166001600160a01b031663412753586040518163ffffffff1660e01b8152600401602060405180830381865afa15801561413d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141619190615505565b61012e5460405163231929d360e01b8152600481018c9052600160248201526001600160a01b03928316926108fc92169063231929d390604401602060405180830381865afa1580156141b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141dc9190615396565b6040518115909202916000818181858888f19350505050158015614204573d6000803e3d6000fd5b5060405163a9059cbb60e01b81526001600160a01b038c169063a9059cbb9061423390899085906004016153dd565b6020604051808303816000875af1158015614252573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142769190615374565b507f5b7284eacd81a8429db68d2da54b85765d088de36dfbdde65bfe29ef1993f860338c838d8d8b6040516142b096959493929190615522565b60405180910390a15050600160c955505050505050505050565b6033546001600160a01b03163314612a5e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106b2565b60fb5460ff1615612a5e5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106b2565b60606044825110156143af57505060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c79000000602082015290565b600482019150818060200190518101906143c99190615953565b92915050565b606082826040516020016143e49291906159a3565b604051602081830303815290604052905092915050565b6110696142ca565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615614436576111f783614b1f565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015614490575060408051601f3d908101601f1916820190925261448d91810190615396565b60015b6144f35760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016106b2565b600080516020615c8c83398151915281146145625760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016106b2565b506111f7838383614bbb565b600054610100900460ff166145955760405162461bcd60e51b81526004016106b2906159d2565b612a5e614be6565b600054610100900460ff16612a5e5760405162461bcd60e51b81526004016106b2906159d2565b600054610100900460ff166145eb5760405162461bcd60e51b81526004016106b2906159d2565b612a5e614c16565b600054610100900460ff1661461a5760405162461bcd60e51b81526004016106b2906159d2565b612a5e614c49565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61467c614324565b60fb805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586146b13390565b6040516001600160a01b03909116815260200160405180910390a1565b60606000806000806000806000888060200190518101906146ef9190615784565b965096509650965096509650965060008060008c8060200190518101906147169190615a1d565b925092509250816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561475a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061477e9190615a60565b61478990600a615b61565b61479682620f4240615b70565b6147a09190615b87565b61012e5460405163cd5065a360e01b815261ffff861660048201526001600160a01b038d811660248301528581166044830152606482018490529293506000929091169063cd5065a390608401602060405180830381865afa15801561480a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061482e9190615396565b61012e5460405163231929d360e01b815260048101839052600060248201529192506001600160a01b03169063231929d390604401602060405180830381865afa158015614880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148a49190615396565b6148ae90826154f2565b9050620f424061013160008661ffff1661ffff16815260200190815260200160002060008d6001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a900460ff16600a61490d9190615b61565b6149179083615b70565b6149219190615b87565b9050888110156149735760405162461bcd60e51b815260206004820152601f60248201527f496e73756666696369656e742044657374696e6174696f6e20416d6f756e740060448201526064016106b2565b5050506001600160a01b03871690506149ea5760008786868686866040516020016149a396959493929190615ba9565b60405160208183030381529060405290503360038d836040516020016149cc9493929190615bf8565b60405160208183030381529060405298505050505050505050614a96565b866001600160a01b0316866001600160a01b031603614a4e57604080516001600160a01b038981166020830152818301889052841660608083019190915282518083039091018152608082019092526149cc9033906001908f90859060a001615bf8565b600086888787878787604051602001614a6d9796959493929190615c33565b60405160208183030381529060405290503360028d836040516020016149cc9493929190615bf8565b9392505050565b60fb5460ff16612a5e5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016106b2565b614aee614a9d565b60fb805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336146b1565b6001600160a01b0381163b614b8c5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016106b2565b600080516020615c8c83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b614bc483614c77565b600082511180614bd15750805b156111f757614be08383614cb7565b50505050565b600054610100900460ff16614c0d5760405162461bcd60e51b81526004016106b2906159d2565b612a5e33614622565b600054610100900460ff16614c3d5760405162461bcd60e51b81526004016106b2906159d2565b60fb805460ff19169055565b600054610100900460ff16614c705760405162461bcd60e51b81526004016106b2906159d2565b600160c955565b614c8081614b1f565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b614d1f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016106b2565b600080846001600160a01b031684604051614d3a9190615481565b600060405180830381855af49150503d8060008114614d75576040519150601f19603f3d011682016040523d82523d6000602084013e614d7a565b606091505b5091509150614da28282604051806060016040528060278152602001615cac60279139614dab565b95945050505050565b60608315614dba575081614a96565b825115614dca5782518084602001fd5b8160405162461bcd60e51b81526004016106b291906154c9565b6001600160a01b038116811461106957600080fd5b600060208284031215614e0b57600080fd5b8135614a9681614de4565b61ffff8116811461106957600080fd5b60008060408385031215614e3957600080fd5b8235614e4481614e16565b91506020830135614e5481614de4565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715614e9d57614e9d614e5f565b604052919050565b60006001600160401b03821115614ebe57614ebe614e5f565b50601f01601f191660200190565b600082601f830112614edd57600080fd5b8135614ef0614eeb82614ea5565b614e75565b818152846020838601011115614f0557600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215614f3b57600080fd5b8635614f4681614de4565b9550602087013594506040870135614f5d81614de4565b93506060870135614f6d81614de4565b92506080870135614f7d81614de4565b915060a08701356001600160401b03811115614f9857600080fd5b614fa489828a01614ecc565b9150509295509295509295565b600080600080600060a08688031215614fc957600080fd5b8535614fd481614de4565b9450602086013593506040860135614feb81614de4565b92506060860135614ffb81614de4565b915060808601356001600160401b0381111561501657600080fd5b61502288828901614ecc565b9150509295509295909350565b6000806040838503121561504257600080fd5b8235614e4481614de4565b6000806040838503121561506057600080fd5b823561506b81614de4565b915060208301356001600160401b0381111561508657600080fd5b61509285828601614ecc565b9150509250929050565b600080602083850312156150af57600080fd5b82356001600160401b03808211156150c657600080fd5b818501915085601f8301126150da57600080fd5b8135818111156150e957600080fd5b8660208260051b85010111156150fe57600080fd5b60209290920196919550909350505050565b6000806040838503121561512357600080fd5b8235915060208301356001600160401b0381111561508657600080fd5b60ff8116811461106957600080fd5b60008060006060848603121561516457600080fd5b833561516f81614e16565b9250602084013561517f81614de4565b9150604084013561518f81615140565b809150509250925092565b600080600080600060a086880312156151b257600080fd5b85356151bd81614e16565b945060208601356151cd81614de4565b935060408601356001600160401b03808211156151e957600080fd5b6151f589838a01614ecc565b9450606088013591508082111561520b57600080fd5b61521789838a01614ecc565b9350608088013591508082111561522d57600080fd5b5061502288828901614ecc565b600080600080600080600060e0888a03121561525557600080fd5b873561526081614de4565b9650602088013561527081614de4565b955060408801359450606088013561528781614de4565b9350608088013561529781614de4565b925060a08801356152a781614de4565b915060c08801356001600160401b038111156152c257600080fd5b6152ce8a828b01614ecc565b91505092959891949750929550565b6020808252600f908201526e4e6f205a65726f204164647265737360881b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526017908201527f596f7520617265204e4f542057686974656c6973746564000000000000000000604082015260600190565b60006020828403121561538657600080fd5b81518015158114614a9657600080fd5b6000602082840312156153a857600080fd5b5051919050565b602080825260149082015273496e73756666696369656e742042616c616e636560601b604082015260600190565b6001600160a01b03929092168252602082015260400190565b6020808252601a908201527f53656c6c20546f6b656e20417070726f76616c204661696c6564000000000000604082015260600190565b602080825260169082015275496e76616c696420546172676574204164647265737360501b604082015260600190565b60005b83811015615478578181015183820152602001615460565b50506000910152565b6000825161549381846020870161545d565b9190910192915050565b600081518084526154b581602086016020860161545d565b601f01601f19169290920160200192915050565b602081526000614a96602083018461549d565b634e487b7160e01b600052601160045260246000fd5b818103818111156143c9576143c96154dc565b60006020828403121561551757600080fd5b8151614a9681614de4565b6001600160a01b039687168152948616602086015260408501939093529084166060840152608083015290911660a082015260c00190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b6020808252600f908201526e496e76616c6964204164647265737360881b604082015260600190565b60208082526025908201527f57686974656c697374204c697374206578636565647320616c6c6f776564206c60408201526434b6b4ba1760d91b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600060018201615688576156886154dc565b5060010190565b600061569d614eeb84614ea5565b90508281528383830111156156b157600080fd5b614a9683602083018461545d565b600082601f8301126156d057600080fd5b614a968383516020850161568f565b600080600080608085870312156156f557600080fd5b845161570081614de4565b602086015190945061571181614e16565b6040860151606087015191945092506001600160401b0381111561573457600080fd5b615740878288016156bf565b91505092959194509250565b60008060006060848603121561576157600080fd5b835161576c81614de4565b60208501516040860151919450925061518f81614de4565b600080600080600080600060e0888a03121561579f57600080fd5b87516157aa81614de4565b60208901519097506157bb81614de4565b604089015160608a015191975095506157d381614de4565b60808901519094506157e481614de4565b60a08901519093506157f581614de4565b60c08901519092506001600160401b0381111561581157600080fd5b6152ce8a828b016156bf565b808201808211156143c9576143c96154dc565b60008060008060008060c0878903121561584957600080fd5b865161585481614de4565b60208801516040890151919750955061586c81614de4565b606088015190945061587d81614de4565b608088015190935061588e81614de4565b60a08801519092506001600160401b038111156158aa57600080fd5b614fa489828a016156bf565b6001600160a01b03851681526080602082018190526000906158da9083018661549d565b82810360408401526158ec818661549d565b91505082606083015295945050505050565b6000806000806080858703121561591457600080fd5b84519350602085015161592681614de4565b604086015190935061593781614de4565b60608601519092506001600160401b0381111561573457600080fd5b60006020828403121561596557600080fd5b81516001600160401b0381111561597b57600080fd5b8201601f8101841361598c57600080fd5b61599b8482516020840161568f565b949350505050565b600083516159b581846020880161545d565b8351908301906159c981836020880161545d565b01949350505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600080600060608486031215615a3257600080fd5b8351615a3d81614e16565b6020850151909350615a4e81614de4565b80925050604084015190509250925092565b600060208284031215615a7257600080fd5b8151614a9681615140565b600181815b80851115615ab8578160001904821115615a9e57615a9e6154dc565b80851615615aab57918102915b93841c9390800290615a82565b509250929050565b600082615acf575060016143c9565b81615adc575060006143c9565b8160018114615af25760028114615afc57615b18565b60019150506143c9565b60ff841115615b0d57615b0d6154dc565b50506001821b6143c9565b5060208310610133831016604e8410600b8410161715615b3b575081810a6143c9565b615b458383615a7d565b8060001904821115615b5957615b596154dc565b029392505050565b6000614a9660ff841683615ac0565b80820281158282048414176143c9576143c96154dc565b600082615ba457634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b03878116825260208201879052858116604083015284811660608301528316608082015260c060a08201819052600090615bec9083018461549d565b98975050505050505050565b60018060a01b038516815261ffff84166020820152826040820152608060608201526000615c29608083018461549d565b9695505050505050565b6001600160a01b03888116825287811660208301526040820187905285811660608301528481166080830152831660a082015260e060c08201819052600090615c7e9083018461549d565b999850505050505050505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212203526d7c9227bf89336913b28d6f28c393359d4df96ecd8038e8c0e4fbe641ed164736f6c63430008110033
Deployed Bytecode
0x6080604052600436106102135760003560e01c806375d3abc811610118578063e086e5ec116100a0578063f2fde38b1161006f578063f2fde38b14610608578063f545078314610628578063f67ea30914610649578063f7b188a51461065c578063fd59cbe71461067157600080fd5b8063e086e5ec146105ab578063e2769cfa146105c0578063e62a7ae2146105e0578063ec16c530146105f557600080fd5b80638da5cb5b116100e75780638da5cb5b1461050d578063a1d767961461052b578063af2800c21461054b578063b4139be41461056b578063c851cc321461058b57600080fd5b806375d3abc8146104975780637f649783146104b85780638456cb59146104d85780638bcc4166146104ed57600080fd5b806349f5acca1161019b57806352d1902d1161016a57806352d1902d14610414578063548db174146104375780635c975abb1461045757806363613a7b1461046f578063715018a61461048257600080fd5b806349f5acca146103a55780634f1ef286146103c657806351cff8d9146103d9578063524513d6146103f957600080fd5b8063238ed823116101e2578063238ed823146102e05780633659cfe6146102f35780633af32abf14610313578063485cc9551461035457806348d58d221461037457600080fd5b806306ae524a1461021f5780630a800e541461025d578063147182711461027f578063200af02a146102cd57600080fd5b3661021a57005b600080fd5b34801561022b57600080fd5b5061012f54610240906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561026957600080fd5b5061027d610278366004614df9565b610684565b005b34801561028b57600080fd5b506102bb61029a366004614e26565b61013160209081526000928352604080842090915290825290205460ff1681565b60405160ff9091168152602001610254565b61027d6102db366004614f22565b6106de565b61027d6102ee366004614fb1565b610b9e565b3480156102ff57600080fd5b5061027d61030e366004614df9565b610f8d565b34801561031f57600080fd5b5061034461032e366004614df9565b6101336020526000908152604090205460ff1681565b6040519015158152602001610254565b34801561036057600080fd5b5061027d61036f36600461502f565b61106c565b34801561038057600080fd5b5061034461038f366004614df9565b6101306020526000908152604090205460ff1681565b3480156103b157600080fd5b5061013454610240906001600160a01b031681565b61027d6103d436600461504d565b6111fc565b3480156103e557600080fd5b5061027d6103f4366004614df9565b6112cc565b34801561040557600080fd5b50610132546103449060ff1681565b34801561042057600080fd5b506104296113cc565b604051908152602001610254565b34801561044357600080fd5b5061027d61045236600461509c565b61147f565b34801561046357600080fd5b5060fb5460ff16610344565b61027d61047d366004615110565b61156a565b34801561048e57600080fd5b5061027d612a4c565b3480156104a357600080fd5b5061012e54610240906001600160a01b031681565b3480156104c457600080fd5b5061027d6104d336600461509c565b612a60565b3480156104e457600080fd5b5061027d612b4b565b3480156104f957600080fd5b5061027d610508366004614df9565b612b63565b34801561051957600080fd5b506033546001600160a01b0316610240565b34801561053757600080fd5b5061027d61054636600461514f565b612bbc565b34801561055757600080fd5b5061027d610566366004614df9565b612c30565b34801561057757600080fd5b5061027d610586366004614df9565b612c8b565b34801561059757600080fd5b5061027d6105a6366004614df9565b612cbe565b3480156105b757600080fd5b5061027d612d17565b3480156105cc57600080fd5b5061027d6105db366004614df9565b612d4d565b3480156105ec57600080fd5b5061027d612da5565b61027d61060336600461519a565b612dc2565b34801561061457600080fd5b5061027d610623366004614df9565b6135c6565b34801561063457600080fd5b5061012d54610240906001600160a01b031681565b61027d61065736600461519a565b61363c565b34801561066857600080fd5b5061027d613d0f565b61027d61067f36600461523a565b613d27565b61068c6142ca565b6001600160a01b0381166106bb5760405162461bcd60e51b81526004016106b2906152dd565b60405180910390fd5b61013480546001600160a01b0319166001600160a01b0392909216919091179055565b600260c954036107005760405162461bcd60e51b81526004016106b290615306565b600260c95561070d614324565b6101325460ff161561074957336000908152610133602052604090205460ff166107495760405162461bcd60e51b81526004016106b29061533d565b61012d546001600160a01b031633146107e85761012f546001600160a01b031633146107e8576040516323b872dd60e01b8152336004820152306024820152604481018690526001600160a01b038716906323b872dd906064016020604051808303816000875af11580156107c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e69190615374565b505b6040516370a0823160e01b815230600482015285906001600160a01b038816906370a0823190602401602060405180830381865afa15801561082e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108529190615396565b10156108705760405162461bcd60e51b81526004016106b2906153af565b60405163095ea7b360e01b81526001600160a01b0387169063095ea7b39061089e90879089906004016153dd565b6020604051808303816000875af11580156108bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e19190615374565b6108fd5760405162461bcd60e51b81526004016106b2906153f6565b6101345447906001600160a01b0385811691161461092d5760405162461bcd60e51b81526004016106b29061542d565b600080856001600160a01b0316846040516109489190615481565b6000604051808303816000865af19150503d8060008114610985576040519150601f19603f3d011682016040523d82523d6000602084013e61098a565b606091505b5091509150816109cb61099c8361436a565b604080518082019091526012815271029aba0a82fa1a0a6262fa320a4a622a21d160751b6020820152906143cf565b906109e95760405162461bcd60e51b81526004016106b291906154c9565b5060006109f684476154f2565b905061012e60009054906101000a90046001600160a01b03166001600160a01b031663412753586040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a709190615505565b61012e5460405163231929d360e01b8152600481018c9052600160248201526001600160a01b03928316926108fc92169063231929d390604401602060405180830381865afa158015610ac7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aeb9190615396565b6040518115909202916000818181858888f19350505050158015610b13573d6000803e3d6000fd5b506040516001600160a01b0387169082156108fc029083906000818181858888f19350505050158015610b4a573d6000803e3d6000fd5b507f5b7284eacd81a8429db68d2da54b85765d088de36dfbdde65bfe29ef1993f860336000838d8d8b604051610b8596959493929190615522565b60405180910390a15050600160c9555050505050505050565b600260c95403610bc05760405162461bcd60e51b81526004016106b290615306565b600260c955610bcd614324565b6101325460ff1615610c0957336000908152610133602052604090205460ff16610c095760405162461bcd60e51b81526004016106b29061533d565b6040516370a0823160e01b81523060048201526000906001600160a01b038716906370a0823190602401602060405180830381865afa158015610c50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c749190615396565b610134549091506001600160a01b03848116911614610ca55760405162461bcd60e51b81526004016106b29061542d565b600080846001600160a01b03168785604051610cc19190615481565b60006040518083038185875af1925050503d8060008114610cfe576040519150601f19603f3d011682016040523d82523d6000602084013e610d03565b606091505b509150915081610d1561099c8361436a565b90610d335760405162461bcd60e51b81526004016106b291906154c9565b506040516370a0823160e01b815230600482015260009084906001600160a01b038b16906370a0823190602401602060405180830381865afa158015610d7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da19190615396565b610dab91906154f2565b905061012e60009054906101000a90046001600160a01b03166001600160a01b031663412753586040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e259190615505565b61012e5460405163231929d360e01b8152600481018b9052600160248201526001600160a01b03928316926108fc92169063231929d390604401602060405180830381865afa158015610e7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea09190615396565b6040518115909202916000818181858888f19350505050158015610ec8573d6000803e3d6000fd5b5060405163a9059cbb60e01b81526001600160a01b038a169063a9059cbb90610ef7908a9085906004016153dd565b6020604051808303816000875af1158015610f16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3a9190615374565b507f5b7284eacd81a8429db68d2da54b85765d088de36dfbdde65bfe29ef1993f860338a8360008c8c604051610f7596959493929190615522565b60405180910390a15050600160c95550505050505050565b6001600160a01b037f000000000000000000000000bed6c3440cb39e6652f865f5ce7133a9d95b875b163003610fd55760405162461bcd60e51b81526004016106b29061555a565b7f000000000000000000000000bed6c3440cb39e6652f865f5ce7133a9d95b875b6001600160a01b031661101e600080516020615c8c833981519152546001600160a01b031690565b6001600160a01b0316146110445760405162461bcd60e51b81526004016106b2906155a6565b61104d816143fb565b6040805160008082526020820190925261106991839190614403565b50565b600054610100900460ff161580801561108c5750600054600160ff909116105b806110a65750303b1580156110a6575060005460ff166001145b6111095760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106b2565b6000805460ff19166001179055801561112c576000805461ff0019166101001790555b6001600160a01b0383166111525760405162461bcd60e51b81526004016106b2906155f2565b61115a61456e565b61116261459d565b61116a6145c4565b6111726145f3565b6001600160a01b03808416600090815261013060205260409020805460ff1916600117905561012f80549184166001600160a01b031990921691909117905580156111f7576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6001600160a01b037f000000000000000000000000bed6c3440cb39e6652f865f5ce7133a9d95b875b1630036112445760405162461bcd60e51b81526004016106b29061555a565b7f000000000000000000000000bed6c3440cb39e6652f865f5ce7133a9d95b875b6001600160a01b031661128d600080516020615c8c833981519152546001600160a01b031690565b6001600160a01b0316146112b35760405162461bcd60e51b81526004016106b2906155a6565b6112bc826143fb565b6112c882826001614403565b5050565b6112d46142ca565b6001600160a01b0381166112fa5760405162461bcd60e51b81526004016106b2906155f2565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015611348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136c9190615396565b6040518363ffffffff1660e01b81526004016113899291906153dd565b6020604051808303816000875af11580156113a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c89190615374565b6000306001600160a01b037f000000000000000000000000bed6c3440cb39e6652f865f5ce7133a9d95b875b161461146c5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016106b2565b50600080516020615c8c83398151915290565b6114876142ca565b60648111156114a85760405162461bcd60e51b81526004016106b29061561b565b60005b818110156111f75760008383838181106114c7576114c7615660565b90506020020160208101906114dc9190614df9565b6001600160a01b0316036115025760405162461bcd60e51b81526004016106b2906152dd565b6000610133600085858581811061151b5761151b615660565b90506020020160208101906115309190614df9565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061156281615676565b9150506114ab565b61012d546001600160a01b031633146115c55760405162461bcd60e51b815260206004820152601760248201527f4f6e6c7920536d61727446696e616e6365526f7574657200000000000000000060448201526064016106b2565b6000806000838060200190518101906115de91906156df565b919550935091505060001961ffff841601611aa6576000808280602001905181019061160a919061574c565b61012e5460405163231929d360e01b8152600481018c90526000602482018190529496509194506001600160a01b0316915063231929d390604401602060405180830381865afa158015611662573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116869190615396565b90506001600160a01b03831663a9059cbb836116a2848c6154f2565b6040518363ffffffff1660e01b81526004016116bf9291906153dd565b6020604051808303816000875af11580156116de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117029190615374565b5084156119b45761012e54604051635e0d4ce760e01b8152600481018790526001600160a01b038581169263a9059cbb92911690635e0d4ce790602401602060405180830381865afa15801561175c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117809190615505565b61012e546040516351c9513760e11b8152600481018690526001600160a01b039091169063a392a26e90602401602060405180830381865afa1580156117ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ee9190615396565b6040518363ffffffff1660e01b815260040161180b9291906153dd565b6020604051808303816000875af115801561182a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184e9190615374565b50826001600160a01b031663a9059cbb61012e60009054906101000a90046001600160a01b03166001600160a01b031663412753586040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d69190615505565b61012e546040516351c9513760e11b8152600481018690526001600160a01b039091169063a392a26e90602401602060405180830381865afa158015611920573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119449190615396565b61194e90856154f2565b6040518363ffffffff1660e01b815260040161196b9291906153dd565b6020604051808303816000875af115801561198a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ae9190615374565b50611a9e565b826001600160a01b031663a9059cbb61012e60009054906101000a90046001600160a01b03166001600160a01b031663412753586040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3b9190615505565b836040518363ffffffff1660e01b8152600401611a599291906153dd565b6020604051808303816000875af1158015611a78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9c9190615374565b505b505050612a45565b60011961ffff84160161230957600080600080600080600087806020019051810190611ad29190615784565b6040516370a0823160e01b8152306004820152969d50949b509299509097509550935091506000908d906001600160a01b038916906370a0823190602401602060405180830381865afa158015611b2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b519190615396565b611b5b91906154f2565b905085611b688e8361581d565b1015611b865760405162461bcd60e51b81526004016106b2906153af565b60405163095ea7b360e01b81526001600160a01b0388169063095ea7b390611bb49088908a906004016153dd565b6020604051808303816000875af1158015611bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf79190615374565b611c135760405162461bcd60e51b81526004016106b2906153f6565b6040516370a0823160e01b81523060048201526000906001600160a01b038a16906370a0823190602401602060405180830381865afa158015611c5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7e9190615396565b610134549091506001600160a01b03868116911614611caf5760405162461bcd60e51b81526004016106b29061542d565b600080866001600160a01b031685604051611cca9190615481565b6000604051808303816000865af19150503d8060008114611d07576040519150601f19603f3d011682016040523d82523d6000602084013e611d0c565b606091505b509150915081611d1e61099c8361436a565b90611d3c5760405162461bcd60e51b81526004016106b291906154c9565b50506040516370a0823160e01b81523060048201526000915082906001600160a01b038c16906370a0823190602401602060405180830381865afa158015611d88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dac9190615396565b611db691906154f2565b60405163a9059cbb60e01b81529091506001600160a01b038b169063a9059cbb90611de790889085906004016153dd565b6020604051808303816000875af1158015611e06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2a9190615374565b50506040516370a0823160e01b815230600482015260009083906001600160a01b038b16906370a0823190602401602060405180830381865afa158015611e75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e999190615396565b611ea391906154f2565b61012e5460405163231929d360e01b8152600481018b9052600060248201529192506001600160a01b03169063231929d390604401602060405180830381865afa158015611ef5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f199190615396565b811015611f5f5760405162461bcd60e51b815260206004820152601460248201527329b2b93b34b1b2902332b2903a37b7903637bb9760611b60448201526064016106b2565b8b156122105761012e54604051635e0d4ce760e01b8152600481018e90526001600160a01b03808c169263a9059cbb92911690635e0d4ce790602401602060405180830381865afa158015611fb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fdc9190615505565b61012e546040516351c9513760e11b8152600481018690526001600160a01b039091169063a392a26e90602401602060405180830381865afa158015612026573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204a9190615396565b6040518363ffffffff1660e01b81526004016120679291906153dd565b6020604051808303816000875af1158015612086573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120aa9190615374565b50886001600160a01b031663a9059cbb61012e60009054906101000a90046001600160a01b03166001600160a01b031663412753586040518163ffffffff1660e01b8152600401602060405180830381865afa15801561210e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121329190615505565b61012e546040516351c9513760e11b8152600481018690526001600160a01b039091169063a392a26e90602401602060405180830381865afa15801561217c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a09190615396565b6121aa90856154f2565b6040518363ffffffff1660e01b81526004016121c79291906153dd565b6020604051808303816000875af11580156121e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061220a9190615374565b506122fa565b886001600160a01b031663a9059cbb61012e60009054906101000a90046001600160a01b03166001600160a01b031663412753586040518163ffffffff1660e01b8152600401602060405180830381865afa158015612273573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122979190615505565b836040518363ffffffff1660e01b81526004016122b59291906153dd565b6020604051808303816000875af11580156122d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f89190615374565b505b50505050505050505050612a45565b600080600080600080868060200190518101906123269190615830565b6040516370a0823160e01b8152306004820152959b509399509197509550935091506000908c906001600160a01b038916906370a0823190602401602060405180830381865afa15801561237e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123a29190615396565b6123ac91906154f2565b9050856123b98d8361581d565b10156123d75760405162461bcd60e51b81526004016106b2906153af565b60405163095ea7b360e01b81526001600160a01b0388169063095ea7b3906124059088908a906004016153dd565b6020604051808303816000875af1158015612424573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124489190615374565b6124645760405162461bcd60e51b81526004016106b2906153f6565b6101345447906001600160a01b038681169116146124945760405162461bcd60e51b81526004016106b29061542d565b600080866001600160a01b0316856040516124af9190615481565b6000604051808303816000865af19150503d80600081146124ec576040519150601f19603f3d011682016040523d82523d6000602084013e6124f1565b606091505b50915091508161250361099c8361436a565b906125215760405162461bcd60e51b81526004016106b291906154c9565b5050506000814761253291906154f2565b6040519091506001600160a01b0386169082156108fc029083906000818181858888f1935050505015801561256b573d6000803e3d6000fd5b50506040516370a0823160e01b815230600482015260009083906001600160a01b038b16906370a0823190602401602060405180830381865afa1580156125b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125da9190615396565b6125e491906154f2565b61012e5460405163231929d360e01b8152600481018b9052600060248201529192506001600160a01b03169063231929d390604401602060405180830381865afa158015612636573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265a9190615396565b8110156126a05760405162461bcd60e51b815260206004820152601460248201527329b2b93b34b1b2902332b2903a37b7903637bb9760611b60448201526064016106b2565b8a156129515761012e54604051635e0d4ce760e01b8152600481018d90526001600160a01b03808c169263a9059cbb92911690635e0d4ce790602401602060405180830381865afa1580156126f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271d9190615505565b61012e546040516351c9513760e11b8152600481018690526001600160a01b039091169063a392a26e90602401602060405180830381865afa158015612767573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278b9190615396565b6040518363ffffffff1660e01b81526004016127a89291906153dd565b6020604051808303816000875af11580156127c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127eb9190615374565b50886001600160a01b031663a9059cbb61012e60009054906101000a90046001600160a01b03166001600160a01b031663412753586040518163ffffffff1660e01b8152600401602060405180830381865afa15801561284f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128739190615505565b61012e546040516351c9513760e11b8152600481018690526001600160a01b039091169063a392a26e90602401602060405180830381865afa1580156128bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128e19190615396565b6128eb90856154f2565b6040518363ffffffff1660e01b81526004016129089291906153dd565b6020604051808303816000875af1158015612927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294b9190615374565b50612a3b565b886001600160a01b031663a9059cbb61012e60009054906101000a90046001600160a01b03166001600160a01b031663412753586040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129d89190615505565b836040518363ffffffff1660e01b81526004016129f69291906153dd565b6020604051808303816000875af1158015612a15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a399190615374565b505b5050505050505050505b5050505050565b612a546142ca565b612a5e6000614622565b565b612a686142ca565b6064811115612a895760405162461bcd60e51b81526004016106b29061561b565b60005b818110156111f7576000838383818110612aa857612aa8615660565b9050602002016020810190612abd9190614df9565b6001600160a01b031603612ae35760405162461bcd60e51b81526004016106b2906152dd565b60016101336000858585818110612afc57612afc615660565b9050602002016020810190612b119190614df9565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580612b4381615676565b915050612a8c565b612b536142ca565b612b5b614324565b612a5e614674565b612b6b6142ca565b612b73614324565b6001600160a01b038116612b995760405162461bcd60e51b81526004016106b2906155f2565b61012e80546001600160a01b0319166001600160a01b0392909216919091179055565b612bc46142ca565b612bcc614324565b6001600160a01b038216612bf25760405162461bcd60e51b81526004016106b2906155f2565b61ffff9092166000908152610131602090815260408083206001600160a01b03909416835292905220805460ff90921660ff19909216919091179055565b612c386142ca565b612c40614324565b6001600160a01b038116612c665760405162461bcd60e51b81526004016106b2906155f2565b6001600160a01b0316600090815261013060205260409020805460ff19166001179055565b612c936142ca565b612c9b614324565b61012f80546001600160a01b0319166001600160a01b0392909216919091179055565b612cc66142ca565b612cce614324565b6001600160a01b038116612cf45760405162461bcd60e51b81526004016106b2906155f2565b61012d80546001600160a01b0319166001600160a01b0392909216919091179055565b612d1f6142ca565b604051339081904780156108fc02916000818181858888f193505050501580156112c8573d6000803e3d6000fd5b612d556142ca565b612d5d614324565b6001600160a01b038116612d835760405162461bcd60e51b81526004016106b2906155f2565b6001600160a01b0316600090815261013060205260409020805460ff19169055565b612dad6142ca565b610132805460ff19811660ff90911615179055565b600260c95403612de45760405162461bcd60e51b81526004016106b290615306565b600260c955612df1614324565b6101325460ff1615612e2d57336000908152610133602052604090205460ff16612e2d5760405162461bcd60e51b81526004016106b29061533d565b60006001600160a01b038516612f9e5761012e546040516310c3a57160e11b81523360048201526000916001600160a01b0316906321874ae290602401602060405180830381865afa158015612e87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eab9190615505565b6001600160a01b031614612f995761012e546040516310c3a57160e11b81523360048201526001600160a01b0390911690635e81935e9082906321874ae290602401602060405180830381865afa158015612f0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f2e9190615505565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612f72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f969190615396565b90505b61312b565b61012e54604051632f40c9af60e11b81526001600160a01b03878116600483015290911690635e81935e90602401602060405180830381865afa158015612fe9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061300d9190615396565b6000036130535760405162461bcd60e51b815260206004820152601460248201527314d354950e88125b9d985b1a590814995988125160621b60448201526064016106b2565b61012e546040516308ca917960e21b81523360048201526001600160a01b0387811660248301529091169063232a45e490604401600060405180830381600087803b1580156130a157600080fd5b505af11580156130b5573d6000803e3d6000fd5b505061012e54604051632f40c9af60e11b81526001600160a01b0389811660048301529091169250635e81935e9150602401602060405180830381865afa158015613104573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131289190615396565b90505b600080600080600080898060200190518101906131489190615830565b6040516323b872dd60e01b815233600482015230602482015260448101869052959b509399509197509550935091506001600160a01b038716906323b872dd906064016020604051808303816000875af11580156131aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ce9190615374565b506040516370a0823160e01b81523060048201526000906001600160a01b038616906370a0823190602401602060405180830381865afa158015613216573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061323a9190615396565b6001600160a01b0386166000908152610130602052604090205490915060ff1661329a5760405162461bcd60e51b81526020600482015260116024820152702737ba1029bab83837b93a102a37b5b2b760791b60448201526064016106b2565b6001600160a01b0387166000908152610130602052604090205460ff16156132c3575084613485565b60405163095ea7b360e01b81526001600160a01b0388169063095ea7b3906132f19086908a906004016153dd565b6020604051808303816000875af1158015613310573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133349190615374565b6133505760405162461bcd60e51b81526004016106b2906153f6565b610134546001600160a01b0385811691161461337e5760405162461bcd60e51b81526004016106b29061542d565b600080856001600160a01b0316846040516133999190615481565b6000604051808303816000865af19150503d80600081146133d6576040519150601f19603f3d011682016040523d82523d6000602084013e6133db565b606091505b5091509150816133ed61099c8361436a565b9061340b5760405162461bcd60e51b81526004016106b291906154c9565b50506040516370a0823160e01b81523060048201528291506001600160a01b038716906370a0823190602401602060405180830381865afa158015613454573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134789190615396565b61348291906154f2565b90505b6040805161ffff8f1660208201526001600160a01b03871691810191909152606081018290526000906134cc908a906080016040516020818303038152906040528d6146ce565b61012d5460405163a9059cbb60e01b81529192506001600160a01b038089169263a9059cbb9261350292169086906004016153dd565b6020604051808303816000875af1158015613521573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135459190615374565b5061012d54604051632cad4a6d60e21b81526001600160a01b039091169063b2b529b490349061357f9033908f90879089906004016158b6565b6000604051808303818588803b15801561359857600080fd5b505af11580156135ac573d6000803e3d6000fd5b5050600160c9555050505050505050505050505050505050565b6135ce6142ca565b6001600160a01b0381166136335760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106b2565b61106981614622565b600260c9540361365e5760405162461bcd60e51b81526004016106b290615306565b600260c95561366b614324565b6101325460ff16156136a757336000908152610133602052604090205460ff166136a75760405162461bcd60e51b81526004016106b29061533d565b60006001600160a01b0385166138185761012e546040516310c3a57160e11b81523360048201526000916001600160a01b0316906321874ae290602401602060405180830381865afa158015613701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137259190615505565b6001600160a01b0316146138135761012e546040516310c3a57160e11b81523360048201526001600160a01b0390911690635e81935e9082906321874ae290602401602060405180830381865afa158015613784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137a89190615505565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156137ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138109190615396565b90505b6139a5565b61012e54604051632f40c9af60e11b81526001600160a01b03878116600483015290911690635e81935e90602401602060405180830381865afa158015613863573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138879190615396565b6000036138cd5760405162461bcd60e51b815260206004820152601460248201527314d354950e88125b9d985b1a590814995988125160621b60448201526064016106b2565b61012e546040516308ca917960e21b81523360048201526001600160a01b0387811660248301529091169063232a45e490604401600060405180830381600087803b15801561391b57600080fd5b505af115801561392f573d6000803e3d6000fd5b505061012e54604051632f40c9af60e11b81526001600160a01b0389811660048301529091169250635e81935e9150602401602060405180830381865afa15801561397e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139a29190615396565b90505b600080600080878060200190518101906139bf91906158fe565b6040516370a0823160e01b8152306004820152939750919550935091506000906001600160a01b038516906370a0823190602401602060405180830381865afa158015613a10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a349190615396565b6001600160a01b0385166000908152610130602052604090205490915060ff16613a945760405162461bcd60e51b81526020600482015260116024820152702737ba1029bab83837b93a102a37b5b2b760791b60448201526064016106b2565b610134546001600160a01b03848116911614613ac25760405162461bcd60e51b81526004016106b29061542d565b600080846001600160a01b03168785604051613ade9190615481565b60006040518083038185875af1925050503d8060008114613b1b576040519150601f19603f3d011682016040523d82523d6000602084013e613b20565b606091505b509150915081613b3261099c8361436a565b90613b505760405162461bcd60e51b81526004016106b291906154c9565b50506040516370a0823160e01b81523060048201528291506001600160a01b038616906370a0823190602401602060405180830381865afa158015613b99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bbd9190615396565b613bc791906154f2565b6040805161ffff8e1660208201526001600160a01b0387169181019190915260608101829052909150600090613c119088906080016040516020818303038152906040528b6146ce565b61012d5460405163a9059cbb60e01b81529192506001600160a01b038088169263a9059cbb92613c4792169086906004016153dd565b6020604051808303816000875af1158015613c66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c8a9190615374565b5061012d546001600160a01b031663b2b529b4613ca788346154f2565b338b85876040518663ffffffff1660e01b8152600401613cca94939291906158b6565b6000604051808303818588803b158015613ce357600080fd5b505af1158015613cf7573d6000803e3d6000fd5b5050600160c955505050505050505050505050505050565b613d176142ca565b613d1f614a9d565b612a5e614ae6565b600260c95403613d495760405162461bcd60e51b81526004016106b290615306565b600260c955613d56614324565b6101325460ff1615613d9257336000908152610133602052604090205460ff16613d925760405162461bcd60e51b81526004016106b29061533d565b61012d546001600160a01b03163314613e315761012f546001600160a01b03163314613e31576040516323b872dd60e01b8152336004820152306024820152604481018690526001600160a01b038716906323b872dd906064016020604051808303816000875af1158015613e0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e2f9190615374565b505b6040516370a0823160e01b815230600482015285906001600160a01b038816906370a0823190602401602060405180830381865afa158015613e77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e9b9190615396565b1015613eb95760405162461bcd60e51b81526004016106b2906153af565b60405163095ea7b360e01b81526001600160a01b0387169063095ea7b390613ee790879089906004016153dd565b6020604051808303816000875af1158015613f06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f2a9190615374565b613f465760405162461bcd60e51b81526004016106b2906153f6565b6040516370a0823160e01b81523060048201526000906001600160a01b038916906370a0823190602401602060405180830381865afa158015613f8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fb19190615396565b610134549091506001600160a01b03858116911614613fe25760405162461bcd60e51b81526004016106b29061542d565b600080856001600160a01b031684604051613ffd9190615481565b6000604051808303816000865af19150503d806000811461403a576040519150601f19603f3d011682016040523d82523d6000602084013e61403f565b606091505b50915091508161405161099c8361436a565b9061406f5760405162461bcd60e51b81526004016106b291906154c9565b506040516370a0823160e01b815230600482015260009084906001600160a01b038d16906370a0823190602401602060405180830381865afa1580156140b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140dd9190615396565b6140e791906154f2565b905061012e60009054906101000a90046001600160a01b03166001600160a01b031663412753586040518163ffffffff1660e01b8152600401602060405180830381865afa15801561413d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141619190615505565b61012e5460405163231929d360e01b8152600481018c9052600160248201526001600160a01b03928316926108fc92169063231929d390604401602060405180830381865afa1580156141b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141dc9190615396565b6040518115909202916000818181858888f19350505050158015614204573d6000803e3d6000fd5b5060405163a9059cbb60e01b81526001600160a01b038c169063a9059cbb9061423390899085906004016153dd565b6020604051808303816000875af1158015614252573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142769190615374565b507f5b7284eacd81a8429db68d2da54b85765d088de36dfbdde65bfe29ef1993f860338c838d8d8b6040516142b096959493929190615522565b60405180910390a15050600160c955505050505050505050565b6033546001600160a01b03163314612a5e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106b2565b60fb5460ff1615612a5e5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106b2565b60606044825110156143af57505060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c79000000602082015290565b600482019150818060200190518101906143c99190615953565b92915050565b606082826040516020016143e49291906159a3565b604051602081830303815290604052905092915050565b6110696142ca565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615614436576111f783614b1f565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015614490575060408051601f3d908101601f1916820190925261448d91810190615396565b60015b6144f35760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016106b2565b600080516020615c8c83398151915281146145625760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016106b2565b506111f7838383614bbb565b600054610100900460ff166145955760405162461bcd60e51b81526004016106b2906159d2565b612a5e614be6565b600054610100900460ff16612a5e5760405162461bcd60e51b81526004016106b2906159d2565b600054610100900460ff166145eb5760405162461bcd60e51b81526004016106b2906159d2565b612a5e614c16565b600054610100900460ff1661461a5760405162461bcd60e51b81526004016106b2906159d2565b612a5e614c49565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61467c614324565b60fb805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586146b13390565b6040516001600160a01b03909116815260200160405180910390a1565b60606000806000806000806000888060200190518101906146ef9190615784565b965096509650965096509650965060008060008c8060200190518101906147169190615a1d565b925092509250816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561475a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061477e9190615a60565b61478990600a615b61565b61479682620f4240615b70565b6147a09190615b87565b61012e5460405163cd5065a360e01b815261ffff861660048201526001600160a01b038d811660248301528581166044830152606482018490529293506000929091169063cd5065a390608401602060405180830381865afa15801561480a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061482e9190615396565b61012e5460405163231929d360e01b815260048101839052600060248201529192506001600160a01b03169063231929d390604401602060405180830381865afa158015614880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148a49190615396565b6148ae90826154f2565b9050620f424061013160008661ffff1661ffff16815260200190815260200160002060008d6001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a900460ff16600a61490d9190615b61565b6149179083615b70565b6149219190615b87565b9050888110156149735760405162461bcd60e51b815260206004820152601f60248201527f496e73756666696369656e742044657374696e6174696f6e20416d6f756e740060448201526064016106b2565b5050506001600160a01b03871690506149ea5760008786868686866040516020016149a396959493929190615ba9565b60405160208183030381529060405290503360038d836040516020016149cc9493929190615bf8565b60405160208183030381529060405298505050505050505050614a96565b866001600160a01b0316866001600160a01b031603614a4e57604080516001600160a01b038981166020830152818301889052841660608083019190915282518083039091018152608082019092526149cc9033906001908f90859060a001615bf8565b600086888787878787604051602001614a6d9796959493929190615c33565b60405160208183030381529060405290503360028d836040516020016149cc9493929190615bf8565b9392505050565b60fb5460ff16612a5e5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016106b2565b614aee614a9d565b60fb805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336146b1565b6001600160a01b0381163b614b8c5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016106b2565b600080516020615c8c83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b614bc483614c77565b600082511180614bd15750805b156111f757614be08383614cb7565b50505050565b600054610100900460ff16614c0d5760405162461bcd60e51b81526004016106b2906159d2565b612a5e33614622565b600054610100900460ff16614c3d5760405162461bcd60e51b81526004016106b2906159d2565b60fb805460ff19169055565b600054610100900460ff16614c705760405162461bcd60e51b81526004016106b2906159d2565b600160c955565b614c8081614b1f565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b614d1f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016106b2565b600080846001600160a01b031684604051614d3a9190615481565b600060405180830381855af49150503d8060008114614d75576040519150601f19603f3d011682016040523d82523d6000602084013e614d7a565b606091505b5091509150614da28282604051806060016040528060278152602001615cac60279139614dab565b95945050505050565b60608315614dba575081614a96565b825115614dca5782518084602001fd5b8160405162461bcd60e51b81526004016106b291906154c9565b6001600160a01b038116811461106957600080fd5b600060208284031215614e0b57600080fd5b8135614a9681614de4565b61ffff8116811461106957600080fd5b60008060408385031215614e3957600080fd5b8235614e4481614e16565b91506020830135614e5481614de4565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715614e9d57614e9d614e5f565b604052919050565b60006001600160401b03821115614ebe57614ebe614e5f565b50601f01601f191660200190565b600082601f830112614edd57600080fd5b8135614ef0614eeb82614ea5565b614e75565b818152846020838601011115614f0557600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215614f3b57600080fd5b8635614f4681614de4565b9550602087013594506040870135614f5d81614de4565b93506060870135614f6d81614de4565b92506080870135614f7d81614de4565b915060a08701356001600160401b03811115614f9857600080fd5b614fa489828a01614ecc565b9150509295509295509295565b600080600080600060a08688031215614fc957600080fd5b8535614fd481614de4565b9450602086013593506040860135614feb81614de4565b92506060860135614ffb81614de4565b915060808601356001600160401b0381111561501657600080fd5b61502288828901614ecc565b9150509295509295909350565b6000806040838503121561504257600080fd5b8235614e4481614de4565b6000806040838503121561506057600080fd5b823561506b81614de4565b915060208301356001600160401b0381111561508657600080fd5b61509285828601614ecc565b9150509250929050565b600080602083850312156150af57600080fd5b82356001600160401b03808211156150c657600080fd5b818501915085601f8301126150da57600080fd5b8135818111156150e957600080fd5b8660208260051b85010111156150fe57600080fd5b60209290920196919550909350505050565b6000806040838503121561512357600080fd5b8235915060208301356001600160401b0381111561508657600080fd5b60ff8116811461106957600080fd5b60008060006060848603121561516457600080fd5b833561516f81614e16565b9250602084013561517f81614de4565b9150604084013561518f81615140565b809150509250925092565b600080600080600060a086880312156151b257600080fd5b85356151bd81614e16565b945060208601356151cd81614de4565b935060408601356001600160401b03808211156151e957600080fd5b6151f589838a01614ecc565b9450606088013591508082111561520b57600080fd5b61521789838a01614ecc565b9350608088013591508082111561522d57600080fd5b5061502288828901614ecc565b600080600080600080600060e0888a03121561525557600080fd5b873561526081614de4565b9650602088013561527081614de4565b955060408801359450606088013561528781614de4565b9350608088013561529781614de4565b925060a08801356152a781614de4565b915060c08801356001600160401b038111156152c257600080fd5b6152ce8a828b01614ecc565b91505092959891949750929550565b6020808252600f908201526e4e6f205a65726f204164647265737360881b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526017908201527f596f7520617265204e4f542057686974656c6973746564000000000000000000604082015260600190565b60006020828403121561538657600080fd5b81518015158114614a9657600080fd5b6000602082840312156153a857600080fd5b5051919050565b602080825260149082015273496e73756666696369656e742042616c616e636560601b604082015260600190565b6001600160a01b03929092168252602082015260400190565b6020808252601a908201527f53656c6c20546f6b656e20417070726f76616c204661696c6564000000000000604082015260600190565b602080825260169082015275496e76616c696420546172676574204164647265737360501b604082015260600190565b60005b83811015615478578181015183820152602001615460565b50506000910152565b6000825161549381846020870161545d565b9190910192915050565b600081518084526154b581602086016020860161545d565b601f01601f19169290920160200192915050565b602081526000614a96602083018461549d565b634e487b7160e01b600052601160045260246000fd5b818103818111156143c9576143c96154dc565b60006020828403121561551757600080fd5b8151614a9681614de4565b6001600160a01b039687168152948616602086015260408501939093529084166060840152608083015290911660a082015260c00190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b6020808252600f908201526e496e76616c6964204164647265737360881b604082015260600190565b60208082526025908201527f57686974656c697374204c697374206578636565647320616c6c6f776564206c60408201526434b6b4ba1760d91b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600060018201615688576156886154dc565b5060010190565b600061569d614eeb84614ea5565b90508281528383830111156156b157600080fd5b614a9683602083018461545d565b600082601f8301126156d057600080fd5b614a968383516020850161568f565b600080600080608085870312156156f557600080fd5b845161570081614de4565b602086015190945061571181614e16565b6040860151606087015191945092506001600160401b0381111561573457600080fd5b615740878288016156bf565b91505092959194509250565b60008060006060848603121561576157600080fd5b835161576c81614de4565b60208501516040860151919450925061518f81614de4565b600080600080600080600060e0888a03121561579f57600080fd5b87516157aa81614de4565b60208901519097506157bb81614de4565b604089015160608a015191975095506157d381614de4565b60808901519094506157e481614de4565b60a08901519093506157f581614de4565b60c08901519092506001600160401b0381111561581157600080fd5b6152ce8a828b016156bf565b808201808211156143c9576143c96154dc565b60008060008060008060c0878903121561584957600080fd5b865161585481614de4565b60208801516040890151919750955061586c81614de4565b606088015190945061587d81614de4565b608088015190935061588e81614de4565b60a08801519092506001600160401b038111156158aa57600080fd5b614fa489828a016156bf565b6001600160a01b03851681526080602082018190526000906158da9083018661549d565b82810360408401526158ec818661549d565b91505082606083015295945050505050565b6000806000806080858703121561591457600080fd5b84519350602085015161592681614de4565b604086015190935061593781614de4565b60608601519092506001600160401b0381111561573457600080fd5b60006020828403121561596557600080fd5b81516001600160401b0381111561597b57600080fd5b8201601f8101841361598c57600080fd5b61599b8482516020840161568f565b949350505050565b600083516159b581846020880161545d565b8351908301906159c981836020880161545d565b01949350505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600080600060608486031215615a3257600080fd5b8351615a3d81614e16565b6020850151909350615a4e81614de4565b80925050604084015190509250925092565b600060208284031215615a7257600080fd5b8151614a9681615140565b600181815b80851115615ab8578160001904821115615a9e57615a9e6154dc565b80851615615aab57918102915b93841c9390800290615a82565b509250929050565b600082615acf575060016143c9565b81615adc575060006143c9565b8160018114615af25760028114615afc57615b18565b60019150506143c9565b60ff841115615b0d57615b0d6154dc565b50506001821b6143c9565b5060208310610133831016604e8410600b8410161715615b3b575081810a6143c9565b615b458383615a7d565b8060001904821115615b5957615b596154dc565b029392505050565b6000614a9660ff841683615ac0565b80820281158282048414176143c9576143c96154dc565b600082615ba457634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b03878116825260208201879052858116604083015284811660608301528316608082015260c060a08201819052600090615bec9083018461549d565b98975050505050505050565b60018060a01b038516815261ffff84166020820152826040820152608060608201526000615c29608083018461549d565b9695505050505050565b6001600160a01b03888116825287811660208301526040820187905285811660608301528481166080830152831660a082015260e060c08201819052600090615c7e9083018461549d565b999850505050505050505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212203526d7c9227bf89336913b28d6f28c393359d4df96ecd8038e8c0e4fbe641ed164736f6c63430008110033
Deployed Bytecode Sourcemap
44035:30599:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44375:31;;;;;;;;;;-1:-1:-1;44375:31:0;;;;-1:-1:-1;;;;;44375:31:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;44375:31:0;;;;;;;;46800:183;;;;;;;;;;-1:-1:-1;46800:183:0;;;;;:::i;:::-;;:::i;:::-;;44609:69;;;;;;;;;;-1:-1:-1;44609:69:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1295:4:1;1283:17;;;1265:36;;1253:2;1238:18;44609:69:0;1123:184:1;54841:1844:0;;;;;;:::i;:::-;;:::i;50432:1416::-;;;;;;:::i;:::-;;:::i;36699:200::-;;;;;;;;;;-1:-1:-1;36699:200:0;;;;;:::i;:::-;;:::i;44723:45::-;;;;;;;;;;-1:-1:-1;44723:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4321:14:1;;4314:22;4296:41;;4284:2;4269:18;44723:45:0;4156:187:1;45393:392:0;;;;;;;;;;-1:-1:-1;45393:392:0;;;;;:::i;:::-;;:::i;44468:46::-;;;;;;;;;;-1:-1:-1;44468:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;44777:27;;;;;;;;;;-1:-1:-1;44777:27:0;;;;-1:-1:-1;;;;;44777:27:0;;;37158:225;;;;;;:::i;:::-;;:::i;46004:207::-;;;;;;;;;;-1:-1:-1;46004:207:0;;;;;:::i;:::-;;:::i;44687:29::-;;;;;;;;;;-1:-1:-1;44687:29:0;;;;;;;;36377:133;;;;;;;;;;;;;:::i;:::-;;;5347:25:1;;;5335:2;5320:18;36377:133:0;5201:177:1;47650:367:0;;;;;;;;;;-1:-1:-1;47650:367:0;;;;;:::i;:::-;;:::i;21024:86::-;;;;;;;;;;-1:-1:-1;21095:7:0;;;;21024:86;;67476:7155;;;;;;:::i;:::-;;:::i;24402:103::-;;;;;;;;;;;;;:::i;44304:26::-;;;;;;;;;;-1:-1:-1;44304:26:0;;;;-1:-1:-1;;;;;44304:26:0;;;47281:361;;;;;;;;;;-1:-1:-1;47281:361:0;;;;;:::i;:::-;;:::i;46270:75::-;;;;;;;;;;;;;:::i;48243:187::-;;;;;;;;;;-1:-1:-1;48243:187:0;;;;;:::i;:::-;;:::i;23754:87::-;;;;;;;;;;-1:-1:-1;23827:6:0;;-1:-1:-1;;;;;23827:6:0;23754:87;;48985:296;;;;;;;;;;-1:-1:-1;48985:296:0;;;;;:::i;:::-;;:::i;49415:220::-;;;;;;;;;;-1:-1:-1;49415:220:0;;;;;:::i;:::-;;:::i;47137:136::-;;;;;;;;;;-1:-1:-1;47137:136:0;;;;;:::i;:::-;;:::i;48539:187::-;;;;;;;;;;-1:-1:-1;48539:187:0;;;;;:::i;:::-;;:::i;46589:144::-;;;;;;;;;;;;;:::i;49769:221::-;;;;;;;;;;-1:-1:-1;49769:221:0;;;;;:::i;:::-;;:::i;48026:108::-;;;;;;;;;;;;;:::i;64012:3149::-;;;;;;:::i;:::-;;:::i;24660:201::-;;;;;;;;;;-1:-1:-1;24660:201:0;;;;;:::i;:::-;;:::i;44271:26::-;;;;;;;;;;-1:-1:-1;44271:26:0;;;;-1:-1:-1;;;;;44271:26:0;;;60955:2618;;;;;;:::i;:::-;;:::i;46405:76::-;;;;;;;;;;;;;:::i;52433:1911::-;;;;;;:::i;:::-;;:::i;46800:183::-;23640:13;:11;:13::i;:::-;-1:-1:-1;;;;;46885:34:0;::::1;46877:61;;;;-1:-1:-1::0;;;46877:61:0::1;;;;;;;:::i;:::-;;;;;;;;;46949:12;:26:::0;;-1:-1:-1;;;;;;46949:26:0::1;-1:-1:-1::0;;;;;46949:26:0;;;::::1;::::0;;;::::1;::::0;;46800:183::o;54841:1844::-;40044:1;40819:7;;:19;40811:63;;;;-1:-1:-1;;;40811:63:0;;;;;;;:::i;:::-;40044:1;40952:7;:18;20629:19:::1;:17;:19::i;:::-;55111:17:::2;::::0;::::2;;55108:109;;;55167:10;55153:25;::::0;;;:13:::2;:25;::::0;;;;;::::2;;55145:60;;;;-1:-1:-1::0;;;55145:60:0::2;;;;;;;:::i;:::-;55289:11;::::0;-1:-1:-1;;;;;55289:11:0::2;55275:10;:25;55271:192;;55333:16;::::0;-1:-1:-1;;;;;55333:16:0::2;55319:10;:30;55316:136;;55370:66;::::0;-1:-1:-1;;;55370:66:0;;55401:10:::2;55370:66;::::0;::::2;10453:34:1::0;55421:4:0::2;10503:18:1::0;;;10496:43;10555:18;;;10548:34;;;-1:-1:-1;;;;;55370:30:0;::::2;::::0;::::2;::::0;10388:18:1;;55370:66:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55316:136;55557:42;::::0;-1:-1:-1;;;55557:42:0;;55593:4:::2;55557:42;::::0;::::2;160:51:1::0;55603:7:0;;-1:-1:-1;;;;;55557:27:0;::::2;::::0;::::2;::::0;133:18:1;;55557:42:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;55549:86;;;;-1:-1:-1::0;;;55549:86:0::2;;;;;;;:::i;:::-;55686:43;::::0;-1:-1:-1;;;55686:43:0;;-1:-1:-1;;;;;55686:25:0;::::2;::::0;::::2;::::0;:43:::2;::::0;55712:7;;55721;;55686:43:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55678:82;;;;-1:-1:-1::0;;;55678:82:0::2;;;;;;;:::i;:::-;55899:12;::::0;55794:21:::2;::::0;-1:-1:-1;;;;;55868:44:0;;::::2;55899:12:::0;::::2;55868:44;55860:78;;;;-1:-1:-1::0;;;55860:78:0::2;;;;;;;:::i;:::-;55983:12;55997:16:::0;56017:10:::2;-1:-1:-1::0;;;;;56017:15:0::2;56033:8;56017:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55982:60;;;;56061:7;56077:61;56118:18;:3;:16;:18::i;:::-;56077:27;::::0;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;56077:27:0::2;::::0;::::2;::::0;;:34:::2;:61::i;:::-;56053:87;;;;;-1:-1:-1::0;;;56053:87:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;56153:20:0::2;56176:34;56200:10:::0;56176:21:::2;:34;:::i;:::-;56153:57;;56276:11;;;;;;;;;-1:-1:-1::0;;;;;56276:11:0::2;-1:-1:-1::0;;;;;56257:42:0::2;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56331:11;::::0;56312:68:::2;::::0;-1:-1:-1;;;56312:68:0;;::::2;::::0;::::2;14135:25:1::0;;;56331:11:0;14176:18:1;;;14169:50;-1:-1:-1;;;;;56249:62:0;;::::2;::::0;:132:::2;::::0;56331:11:::2;::::0;56312:53:::2;::::0;14108:18:1;;56312:68:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56249:132;::::0;;::::2;::::0;;::::2;::::0;::::2;::::0;;;;;;::::2;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;56454:31:0::2;::::0;-1:-1:-1;;;;;56454:17:0;::::2;::::0;:31;::::2;;;::::0;56472:12;;56454:31:::2;::::0;;;56472:12;56454:17;:31;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;56511:166;56530:10;56564:1;56582:12;56610:9;56635:7;56658:8;56511:166;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;40000:1:0;41131:7;:22;-1:-1:-1;;;;;;;;54841:1844:0:o;50432:1416::-;40044:1;40819:7;;:19;40811:63;;;;-1:-1:-1;;;40811:63:0;;;;;;;:::i;:::-;40044:1;40952:7;:18;20629:19:::1;:17;:19::i;:::-;50669:17:::2;::::0;::::2;;50666:109;;;50725:10;50711:25;::::0;;;:13:::2;:25;::::0;;;;;::::2;;50703:60;;;;-1:-1:-1::0;;;50703:60:0::2;;;;;;;:::i;:::-;50884:41;::::0;-1:-1:-1;;;50884:41:0;;50919:4:::2;50884:41;::::0;::::2;160:51:1::0;50863:18:0::2;::::0;-1:-1:-1;;;;;50884:26:0;::::2;::::0;::::2;::::0;133:18:1;;50884:41:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51009:12;::::0;50863:62;;-1:-1:-1;;;;;;50978:44:0;;::::2;51009:12:::0;::::2;50978:44;50970:78;;;;-1:-1:-1::0;;;50970:78:0::2;;;;;;;:::i;:::-;51095:12;51109:16:::0;51129:10:::2;-1:-1:-1::0;;;;;51129:15:0::2;51152:7;51161:8;51129:41;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51094:76;;;;51189:7;51205:61;51246:18;:3;:16;:18::i;51205:61::-;51181:87;;;;;-1:-1:-1::0;;;51181:87:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;51304:41:0::2;::::0;-1:-1:-1;;;51304:41:0;;51339:4:::2;51304:41;::::0;::::2;160:51:1::0;51281:20:0::2;::::0;51348:10;;-1:-1:-1;;;;;51304:26:0;::::2;::::0;::::2;::::0;133:18:1;;51304:41:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;51281:77;;51424:11;;;;;;;;;-1:-1:-1::0;;;;;51424:11:0::2;-1:-1:-1::0;;;;;51405:42:0::2;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51479:11;::::0;51460:68:::2;::::0;-1:-1:-1;;;51460:68:0;;::::2;::::0;::::2;14135:25:1::0;;;51479:11:0;14176:18:1;;;14169:50;-1:-1:-1;;;;;51397:62:0;;::::2;::::0;:132:::2;::::0;51479:11:::2;::::0;51460:53:::2;::::0;14108:18:1;;51460:68:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51397:132;::::0;;::::2;::::0;;::::2;::::0;::::2;::::0;;;;;;::::2;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;51608:49:0::2;::::0;-1:-1:-1;;;51608:49:0;;-1:-1:-1;;;;;51608:25:0;::::2;::::0;::::2;::::0;:49:::2;::::0;51634:8;;51644:12;;51608:49:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;51675:165;51694:10;51720:8;51744:12;51780:1;51798:7;51821:8;51675:165;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;40000:1:0;41131:7;:22;-1:-1:-1;;;;;;;50432:1416:0:o;36699:200::-;-1:-1:-1;;;;;35249:6:0;35232:23;35240:4;35232:23;35224:80;;;;-1:-1:-1;;;35224:80:0;;;;;;;:::i;:::-;35347:6;-1:-1:-1;;;;;35323:30:0;:20;-1:-1:-1;;;;;;;;;;;27036:65:0;-1:-1:-1;;;;;27036:65:0;;26956:153;35323:20;-1:-1:-1;;;;;35323:30:0;;35315:87;;;;-1:-1:-1;;;35315:87:0;;;;;;;:::i;:::-;36783:36:::1;36801:17;36783;:36::i;:::-;36871:12;::::0;;36881:1:::1;36871:12:::0;;;::::1;::::0;::::1;::::0;;;36830:61:::1;::::0;36852:17;;36871:12;36830:21:::1;:61::i;:::-;36699:200:::0;:::o;45393:392::-;15124:19;15147:13;;;;;;15146:14;;15194:34;;;;-1:-1:-1;15212:12:0;;15227:1;15212:12;;;;:16;15194:34;15193:108;;;-1:-1:-1;15273:4:0;5886:19;:23;;;15234:66;;-1:-1:-1;15283:12:0;;;;;:17;15234:66;15171:204;;;;-1:-1:-1;;;15171:204:0;;16494:2:1;15171:204:0;;;16476:21:1;16533:2;16513:18;;;16506:30;16572:34;16552:18;;;16545:62;-1:-1:-1;;;16623:18:1;;;16616:44;16677:19;;15171:204:0;16292:410:1;15171:204:0;15386:12;:16;;-1:-1:-1;;15386:16:0;15401:1;15386:16;;;15413:67;;;;15448:13;:20;;-1:-1:-1;;15448:20:0;;;;;15413:67;-1:-1:-1;;;;;45519:27:0;::::1;45511:54;;;;-1:-1:-1::0;;;45511:54:0::1;;;;;;;:::i;:::-;45576:16;:14;:16::i;:::-;45603:24;:22;:24::i;:::-;45638:17;:15;:17::i;:::-;45666:24;:22;:24::i;:::-;-1:-1:-1::0;;;;;45701:29:0;;::::1;;::::0;;;:14:::1;:29;::::0;;;;:36;;-1:-1:-1;;45701:36:0::1;45733:4;45701:36;::::0;;45748:16:::1;:28:::0;;;;::::1;-1:-1:-1::0;;;;;;45748:28:0;;::::1;::::0;;;::::1;::::0;;15502:102;;;;15553:5;15537:21;;-1:-1:-1;;15537:21:0;;;15578:14;;-1:-1:-1;1265:36:1;;15578:14:0;;1253:2:1;1238:18;15578:14:0;;;;;;;15502:102;15113:498;45393:392;;:::o;37158:225::-;-1:-1:-1;;;;;35249:6:0;35232:23;35240:4;35232:23;35224:80;;;;-1:-1:-1;;;35224:80:0;;;;;;;:::i;:::-;35347:6;-1:-1:-1;;;;;35323:30:0;:20;-1:-1:-1;;;;;;;;;;;27036:65:0;-1:-1:-1;;;;;27036:65:0;;26956:153;35323:20;-1:-1:-1;;;;;35323:30:0;;35315:87;;;;-1:-1:-1;;;35315:87:0;;;;;;;:::i;:::-;37276:36:::1;37294:17;37276;:36::i;:::-;37323:52;37345:17;37364:4;37370;37323:21;:52::i;:::-;37158:225:::0;;:::o;46004:207::-;23640:13;:11;:13::i;:::-;-1:-1:-1;;;;;46076:20:0;::::1;46068:48;;;;-1:-1:-1::0;;;46068:48:0::1;;;;;;;:::i;:::-;46163:39;::::0;-1:-1:-1;;;46163:39:0;;46196:4:::1;46163:39;::::0;::::1;160:51:1::0;-1:-1:-1;;;;;46127:23:0;::::1;::::0;::::1;::::0;46151:10:::1;::::0;46127:23;;46163:24:::1;::::0;133:18:1;;46163:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46127:76;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36377:133::-:0;36455:7;35685:4;-1:-1:-1;;;;;35694:6:0;35677:23;;35669:92;;;;-1:-1:-1;;;35669:92:0;;17452:2:1;35669:92:0;;;17434:21:1;17491:2;17471:18;;;17464:30;17530:34;17510:18;;;17503:62;17601:26;17581:18;;;17574:54;17645:19;;35669:92:0;17250:420:1;35669:92:0;-1:-1:-1;;;;;;;;;;;;36377:133:0;:::o;47650:367::-;23640:13;:11;:13::i;:::-;47767:3:::1;47746:24:::0;::::1;;47738:73;;;;-1:-1:-1::0;;;47738:73:0::1;;;;;;;:::i;:::-;47826:9;47822:188;47841:21:::0;;::::1;47822:188;;;47926:1;47900:10:::0;;47911:1;47900:13;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;47892:36:0::1;::::0;47884:63:::1;;;;-1:-1:-1::0;;;47884:63:0::1;;;;;;;:::i;:::-;47993:5;47962:13;:28;47976:10;;47987:1;47976:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;47962:28:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;47962:28:0;:36;;-1:-1:-1;;47962:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47864:3;::::1;::::0;::::1;:::i;:::-;;;;47822:188;;67476:7155:::0;67615:11;;-1:-1:-1;;;;;67615:11:0;67601:10;:25;67593:60;;;;-1:-1:-1;;;67593:60:0;;18555:2:1;67593:60:0;;;18537:21:1;18594:2;18574:18;;;18567:30;18633:25;18613:18;;;18606:53;18676:18;;67593:60:0;18353:347:1;67593:60:0;67694:17;67726:11;67752:25;67802:7;67791:54;;;;;;;;;;;;:::i;:::-;67664:181;;-1:-1:-1;67664:181:0;-1:-1:-1;67664:181:0;-1:-1:-1;;;;67861:23:0;;;;67858:6766;;67919:13;67970:16;68015:12;68004:53;;;;;;;;;;;;:::i;:::-;68167:11;;68148:70;;-1:-1:-1;;;68148:70:0;;;;;14135:25:1;;;68134:11:0;14176:18:1;;;14169:50;;;67900:157:0;;-1:-1:-1;67900:157:0;;-1:-1:-1;;;;;;68167:11:0;;-1:-1:-1;68148:53:0;;14108:18:1;;68148:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68134:84;-1:-1:-1;;;;;;68271:22:0;;;68294:8;68304:12;68134:84;68304:8;:12;:::i;:::-;68271:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;68403:8:0;;68399:661;;68533:11;;68514:54;;-1:-1:-1;;;68514:54:0;;;;;5347:25:1;;;-1:-1:-1;;;;;68491:22:0;;;;;;68533:11;;;68514:49;;5320:18:1;;68514:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68589:11;;68570:66;;-1:-1:-1;;;68570:66:0;;;;;5347:25:1;;;-1:-1:-1;;;;;68589:11:0;;;;68570:61;;5320:18:1;;68570:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68491:146;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;68722:5;-1:-1:-1;;;;;68715:22:0;;68757:11;;;;;;;;;-1:-1:-1;;;;;68757:11:0;-1:-1:-1;;;;;68738:42:0;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68807:11;;68788:66;;-1:-1:-1;;;68788:66:0;;;;;5347:25:1;;;-1:-1:-1;;;;;68807:11:0;;;;68788:61;;5320:18:1;;68788:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68784:70;;:3;:70;:::i;:::-;68715:140;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;68399:661;;;68970:5;-1:-1:-1;;;;;68963:22:0;;69005:11;;;;;;;;;-1:-1:-1;;;;;69005:11:0;-1:-1:-1;;;;;68986:42:0;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69032:3;68963:73;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;68399:661;68074:1020;67885:1220;;67858:6766;;;-1:-1:-1;;69114:23:0;;;;69111:5513;;69173:16;69208:17;69244:15;69278;69312:18;69349:16;69384:21;69434:12;69423:87;;;;;;;;;;;;:::i;:::-;69712:42;;-1:-1:-1;;;69712:42:0;;69748:4;69712:42;;;160:51:1;69154:356:0;;-1:-1:-1;69154:356:0;;-1:-1:-1;69154:356:0;;-1:-1:-1;69154:356:0;;-1:-1:-1;69154:356:0;-1:-1:-1;69154:356:0;-1:-1:-1;69154:356:0;-1:-1:-1;69689:20:0;;69757:8;;-1:-1:-1;;;;;69712:27:0;;;;;133:18:1;;69712:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;69689:76;-1:-1:-1;69878:7:0;69851:23;69866:8;69689:76;69851:23;:::i;:::-;:34;;69843:67;;;;-1:-1:-1;;;69843:67:0;;;;;;;:::i;:::-;69977:43;;-1:-1:-1;;;69977:43:0;;-1:-1:-1;;;;;69977:25:0;;;;;:43;;70003:7;;70012;;69977:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69969:82;;;;-1:-1:-1;;;69969:82:0;;;;;;;:::i;:::-;70093:41;;-1:-1:-1;;;70093:41:0;;70128:4;70093:41;;;160:51:1;70072:18:0;;-1:-1:-1;;;;;70093:26:0;;;;;133:18:1;;70093:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70234:12;;70072:62;;-1:-1:-1;;;;;;70203:44:0;;;70234:12;;70203:44;70195:78;;;;-1:-1:-1;;;70195:78:0;;;;;;;:::i;:::-;70359:12;70373:16;70393:10;-1:-1:-1;;;;;70393:15:0;70409:8;70393:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70358:60;;;;70449:7;70465:61;70506:18;:3;:16;:18::i;70465:61::-;70441:87;;;;;-1:-1:-1;;;70441:87:0;;;;;;;;:::i;:::-;-1:-1:-1;;70688:41:0;;-1:-1:-1;;;70688:41:0;;70723:4;70688:41;;;160:51:1;70665:20:0;;-1:-1:-1;70732:10:0;;-1:-1:-1;;;;;70688:26:0;;;;;133:18:1;;70688:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;70765:49;;-1:-1:-1;;;70765:49:0;;70665:77;;-1:-1:-1;;;;;;70765:25:0;;;;;:49;;70791:8;;70665:77;;70765:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;70981:42:0;;-1:-1:-1;;;70981:42:0;;71017:4;70981:42;;;160:51:1;70967:11:0;;71026:12;;-1:-1:-1;;;;;70981:27:0;;;;;133:18:1;;70981:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;;;:::i;:::-;71095:11;;71076:69;;-1:-1:-1;;;71076:69:0;;;;;14135:25:1;;;71095:11:0;14176:18:1;;;14169:50;70967:71:0;;-1:-1:-1;;;;;;71095:11:0;;71076:53;;14108:18:1;;71076:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71069:3;:76;;71061:109;;;;-1:-1:-1;;;71061:109:0;;22030:2:1;71061:109:0;;;22012:21:1;22069:2;22049:18;;;22042:30;-1:-1:-1;;;22088:18:1;;;22081:50;22148:18;;71061:109:0;21828:344:1;71061:109:0;71199:8;;71195:675;;71333:11;;71314:54;;-1:-1:-1;;;71314:54:0;;;;;5347:25:1;;;-1:-1:-1;;;;;71287:26:0;;;;;;71333:11;;;71314:49;;5320:18:1;;71314:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71389:11;;71370:66;;-1:-1:-1;;;71370:66:0;;;;;5347:25:1;;;-1:-1:-1;;;;;71389:11:0;;;;71370:61;;5320:18:1;;71370:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71287:150;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;71522:9;-1:-1:-1;;;;;71515:26:0;;71561:11;;;;;;;;;-1:-1:-1;;;;;71561:11:0;-1:-1:-1;;;;;71542:42:0;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71613:11;;71594:66;;-1:-1:-1;;;71594:66:0;;;;;5347:25:1;;;-1:-1:-1;;;;;71613:11:0;;;;71594:61;;5320:18:1;;71594:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71588:72;;:3;:72;:::i;:::-;71515:146;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;71195:675;;;71776:9;-1:-1:-1;;;;;71769:26:0;;71815:11;;;;;;;;;-1:-1:-1;;;;;71815:11:0;-1:-1:-1;;;;;71796:42:0;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71842:3;71769:77;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;71195:675;70906:983;69583:2321;;69139:2776;;;;;;;69111:5513;;;71955:17;71991:15;72025;72059:18;72096:24;72139:21;72189:12;72178:78;;;;;;;;;;;;:::i;:::-;72467:42;;-1:-1:-1;;;72467:42:0;;72503:4;72467:42;;;160:51:1;71936:320:0;;-1:-1:-1;71936:320:0;;-1:-1:-1;71936:320:0;;-1:-1:-1;71936:320:0;-1:-1:-1;71936:320:0;-1:-1:-1;71936:320:0;-1:-1:-1;72444:20:0;;72512:8;;-1:-1:-1;;;;;72467:27:0;;;;;133:18:1;;72467:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;72444:76;-1:-1:-1;72633:7:0;72606:23;72621:8;72444:76;72606:23;:::i;:::-;:34;;72598:67;;;;-1:-1:-1;;;72598:67:0;;;;;;;:::i;:::-;72732:43;;-1:-1:-1;;;72732:43:0;;-1:-1:-1;;;;;72732:25:0;;;;;:43;;72758:7;;72767;;72732:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72724:82;;;;-1:-1:-1;;;72724:82:0;;;;;;;:::i;:::-;72969:12;;72848:21;;-1:-1:-1;;;;;72938:44:0;;;72969:12;;72938:44;72930:78;;;;-1:-1:-1;;;72930:78:0;;;;;;;:::i;:::-;73110:12;73124:16;73144:10;-1:-1:-1;;;;;73144:15:0;73160:8;73144:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73109:60;;;;73200:7;73216:61;73257:18;:3;:16;:18::i;73216:61::-;73192:87;;;;;-1:-1:-1;;;73192:87:0;;;;;;;;:::i;:::-;;73086:213;;73414:20;73461:10;73437:21;:34;;;;:::i;:::-;73494:31;;73414:57;;-1:-1:-1;;;;;;73494:17:0;;;:31;;;;;73414:57;;73494:31;;;;73414:57;73494:17;:31;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;73690:42:0;;-1:-1:-1;;;73690:42:0;;73726:4;73690:42;;;160:51:1;73676:11:0;;73735:12;;-1:-1:-1;;;;;73690:27:0;;;;;133:18:1;;73690:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;;;:::i;:::-;73804:11;;73785:69;;-1:-1:-1;;;73785:69:0;;;;;14135:25:1;;;73804:11:0;14176:18:1;;;14169:50;73676:71:0;;-1:-1:-1;;;;;;73804:11:0;;73785:53;;14108:18:1;;73785:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73778:3;:76;;73770:109;;;;-1:-1:-1;;;73770:109:0;;22030:2:1;73770:109:0;;;22012:21:1;22069:2;22049:18;;;22042:30;-1:-1:-1;;;22088:18:1;;;22081:50;22148:18;;73770:109:0;21828:344:1;73770:109:0;73908:8;;73904:675;;74042:11;;74023:54;;-1:-1:-1;;;74023:54:0;;;;;5347:25:1;;;-1:-1:-1;;;;;73996:26:0;;;;;;74042:11;;;74023:49;;5320:18:1;;74023:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74098:11;;74079:66;;-1:-1:-1;;;74079:66:0;;;;;5347:25:1;;;-1:-1:-1;;;;;74098:11:0;;;;74079:61;;5320:18:1;;74079:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73996:150;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;74231:9;-1:-1:-1;;;;;74224:26:0;;74270:11;;;;;;;;;-1:-1:-1;;;;;74270:11:0;-1:-1:-1;;;;;74251:42:0;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74322:11;;74303:66;;-1:-1:-1;;;74303:66:0;;;;;5347:25:1;;;-1:-1:-1;;;;;74322:11:0;;;;74303:61;;5320:18:1;;74303:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74297:72;;:3;:72;:::i;:::-;74224:146;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;73904:675;;;74485:9;-1:-1:-1;;;;;74478:26:0;;74524:11;;;;;;;;;-1:-1:-1;;;;;74524:11:0;-1:-1:-1;;;;;74505:42:0;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74551:3;74478:77;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;73904:675;73615:983;72338:2275;;71921:2703;;;;;;69111:5513;67582:7049;;;67476:7155;;:::o;24402:103::-;23640:13;:11;:13::i;:::-;24467:30:::1;24494:1;24467:18;:30::i;:::-;24402:103::o:0;47281:361::-;23640:13;:11;:13::i;:::-;47393:3:::1;47372:24:::0;::::1;;47364:73;;;;-1:-1:-1::0;;;47364:73:0::1;;;;;;;:::i;:::-;47452:9;47448:187;47467:21:::0;;::::1;47448:187;;;47552:1;47526:10:::0;;47537:1;47526:13;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;47518:36:0::1;::::0;47510:63:::1;;;;-1:-1:-1::0;;;47510:63:0::1;;;;;;;:::i;:::-;47619:4;47588:13;:28;47602:10;;47613:1;47602:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;47588:28:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;47588:28:0;:35;;-1:-1:-1;;47588:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47490:3;::::1;::::0;::::1;:::i;:::-;;;;47448:187;;46270:75:::0;23640:13;:11;:13::i;:::-;20629:19:::1;:17;:19::i;:::-;46329:8:::2;:6;:8::i;48243:187::-:0;23640:13;:11;:13::i;:::-;20629:19:::1;:17;:19::i;:::-;-1:-1:-1::0;;;;;48350:21:0;::::2;48342:48;;;;-1:-1:-1::0;;;48342:48:0::2;;;;;;;:::i;:::-;48401:11;:21:::0;;-1:-1:-1;;;;;;48401:21:0::2;-1:-1:-1::0;;;;;48401:21:0;;;::::2;::::0;;;::::2;::::0;;48243:187::o;48985:296::-;23640:13;:11;:13::i;:::-;20629:19:::1;:17;:19::i;:::-;-1:-1:-1::0;;;;;49160:23:0;::::2;49152:50;;;;-1:-1:-1::0;;;49152:50:0::2;;;;;;;:::i;:::-;49213:30;::::0;;::::2;;::::0;;;:17:::2;:30;::::0;;;;;;;-1:-1:-1;;;;;49213:41:0;;::::2;::::0;;;;;;:60;;::::2;::::0;;::::2;-1:-1:-1::0;;49213:60:0;;::::2;::::0;;;::::2;::::0;;48985:296::o;49415:220::-;23640:13;:11;:13::i;:::-;20629:19:::1;:17;:19::i;:::-;-1:-1:-1::0;;;;;49534:27:0;::::2;49526:54;;;;-1:-1:-1::0;;;49526:54:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;49591:29:0::2;;::::0;;;:14:::2;:29;::::0;;;;:36;;-1:-1:-1;;49591:36:0::2;49623:4;49591:36;::::0;;49415:220::o;47137:136::-;23640:13;:11;:13::i;:::-;20629:19:::1;:17;:19::i;:::-;47237:16:::2;:28:::0;;-1:-1:-1;;;;;;47237:28:0::2;-1:-1:-1::0;;;;;47237:28:0;;;::::2;::::0;;;::::2;::::0;;47137:136::o;48539:187::-;23640:13;:11;:13::i;:::-;20629:19:::1;:17;:19::i;:::-;-1:-1:-1::0;;;;;48646:21:0;::::2;48638:48;;;;-1:-1:-1::0;;;48638:48:0::2;;;;;;;:::i;:::-;48697:11;:21:::0;;-1:-1:-1;;;;;;48697:21:0::2;-1:-1:-1::0;;;;;48697:21:0;;;::::2;::::0;;;::::2;::::0;;48539:187::o;46589:144::-;23640:13;:11;:13::i;:::-;46691:34:::1;::::0;46669:10:::1;::::0;;;46703:21:::1;46691:34:::0;::::1;;;::::0;46640:18:::1;46691:34:::0;46640:18;46691:34;46703:21;46669:10;46691:34;::::1;;;;;;;;;;;;;::::0;::::1;;;;49769:221:::0;23640:13;:11;:13::i;:::-;20629:19:::1;:17;:19::i;:::-;-1:-1:-1::0;;;;;49888:27:0;::::2;49880:54;;;;-1:-1:-1::0;;;49880:54:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;49945:29:0::2;49977:5;49945:29:::0;;;:14:::2;:29;::::0;;;;:37;;-1:-1:-1;;49945:37:0::2;::::0;;49769:221::o;48026:108::-;23640:13;:11;:13::i;:::-;48109:17:::1;::::0;;-1:-1:-1;;48088:38:0;::::1;48109:17;::::0;;::::1;48108:18;48088:38;::::0;;48026:108::o;64012:3149::-;40044:1;40819:7;;:19;40811:63;;;;-1:-1:-1;;;40811:63:0;;;;;;;:::i;:::-;40044:1;40952:7;:18;20629:19:::1;:17;:19::i;:::-;64288:17:::2;::::0;::::2;;64285:109;;;64344:10;64330:25;::::0;;;:13:::2;:25;::::0;;;;;::::2;;64322:60;;;;-1:-1:-1::0;;;64322:60:0::2;;;;;;;:::i;:::-;64406:11;-1:-1:-1::0;;;;;64447:24:0;::::2;64443:605;;64515:11;::::0;64496:59:::2;::::0;-1:-1:-1;;;64496:59:0;;64544:10:::2;64496:59;::::0;::::2;160:51:1::0;64567:1:0::2;::::0;-1:-1:-1;;;;;64515:11:0::2;::::0;64496:47:::2;::::0;133:18:1;;64496:59:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;64496:73:0::2;;64492:234;;64619:11;::::0;64646:59:::2;::::0;-1:-1:-1;;;64646:59:0;;64694:10:::2;64646:59;::::0;::::2;160:51:1::0;-1:-1:-1;;;;;64619:11:0;;::::2;::::0;64600:45:::2;::::0;64619:11;;64646:47:::2;::::0;133:18:1;;64646:59:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64600:106;::::0;-1:-1:-1;;;;;;64600:106:0::2;::::0;;;;;;-1:-1:-1;;;;;178:32:1;;;64600:106:0::2;::::0;::::2;160:51:1::0;133:18;;64600:106:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64594:112;;64492:234;64443:605;;;64793:11;::::0;64774:57:::2;::::0;-1:-1:-1;;;64774:57:0;;-1:-1:-1;;;;;178:32:1;;;64774:57:0::2;::::0;::::2;160:51:1::0;64793:11:0;;::::2;::::0;64774:45:::2;::::0;133:18:1;;64774:57:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64835:1;64774:62:::0;64766:95:::2;;;::::0;-1:-1:-1;;;64766:95:0;;23345:2:1;64766:95:0::2;::::0;::::2;23327:21:1::0;23384:2;23364:18;;;23357:30;-1:-1:-1;;;23403:18:1;;;23396:50;23463:18;;64766:95:0::2;23143:344:1::0;64766:95:0::2;64899:11;::::0;64880:70:::2;::::0;-1:-1:-1;;;64880:70:0;;64928:10:::2;64880:70;::::0;::::2;23704:34:1::0;-1:-1:-1;;;;;23774:15:1;;;23754:18;;;23747:43;64899:11:0;;::::2;::::0;64880:47:::2;::::0;23639:18:1;;64880:70:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;64994:11:0::2;::::0;64975:57:::2;::::0;-1:-1:-1;;;64975:57:0;;-1:-1:-1;;;;;178:32:1;;;64975:57:0::2;::::0;::::2;160:51:1::0;64994:11:0;;::::2;::::0;-1:-1:-1;64975:45:0::2;::::0;-1:-1:-1;133:18:1;;64975:57:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64969:63;;64443:605;65128:20;65163:15:::0;65193:19:::2;65227:18:::0;65260:15:::2;65290:21:::0;65336:16:::2;65325:82;;;;;;;;;;;;:::i;:::-;65448:69;::::0;-1:-1:-1;;;65448:69:0;;65482:10:::2;65448:69;::::0;::::2;10453:34:1::0;65502:4:0::2;10503:18:1::0;;;10496:43;10555:18;;;10548:34;;;65113:294:0;;-1:-1:-1;65113:294:0;;-1:-1:-1;65113:294:0;;-1:-1:-1;65113:294:0;-1:-1:-1;65113:294:0;-1:-1:-1;65113:294:0;-1:-1:-1;;;;;;65448:33:0;::::2;::::0;::::2;::::0;10388:18:1;;65448:69:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;65548:44:0::2;::::0;-1:-1:-1;;;65548:44:0;;65586:4:::2;65548:44;::::0;::::2;160:51:1::0;65530:15:0::2;::::0;-1:-1:-1;;;;;65548:29:0;::::2;::::0;::::2;::::0;133:18:1;;65548:44:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;65613:27:0;::::2;;::::0;;;:14:::2;:27;::::0;;;;;65530:62;;-1:-1:-1;65613:27:0::2;;65605:56;;;::::0;-1:-1:-1;;;65605:56:0;;24003:2:1;65605:56:0::2;::::0;::::2;23985:21:1::0;24042:2;24022:18;;;24015:30;-1:-1:-1;;;24061:18:1;;;24054:47;24118:18;;65605:56:0::2;23801:341:1::0;65605:56:0::2;-1:-1:-1::0;;;;;65677:28:0;::::2;;::::0;;;:14:::2;:28;::::0;;;;;::::2;;65674:863;;;-1:-1:-1::0;65793:7:0;65674:863:::2;;;65953:46;::::0;-1:-1:-1;;;65953:46:0;;-1:-1:-1;;;;;65953:28:0;::::2;::::0;::::2;::::0;:46:::2;::::0;65982:7;;65991;;65953:46:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65945:85;;;;-1:-1:-1::0;;;65945:85:0::2;;;;;;;:::i;:::-;66130:12;::::0;-1:-1:-1;;;;;66099:44:0;;::::2;66130:12:::0;::::2;66099:44;66091:78;;;;-1:-1:-1::0;;;66091:78:0::2;;;;;;;:::i;:::-;66232:12;66246:16:::0;66266:10:::2;-1:-1:-1::0;;;;;66266:15:0::2;66282:8;66266:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66231:60;;;;66318:7;66334:61;66375:18;:3;:16;:18::i;66334:61::-;66310:87;;;;;-1:-1:-1::0;;;66310:87:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;;66471:44:0::2;::::0;-1:-1:-1;;;66471:44:0;;66509:4:::2;66471:44;::::0;::::2;160:51:1::0;66518:7:0;;-1:-1:-1;;;;;;66471:29:0;::::2;::::0;::::2;::::0;133:18:1;;66471:44:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;66461:64;;65674:863;66678:42;::::0;;24377:6:1;24365:19;;66678:42:0::2;::::0;::::2;24347:38:1::0;-1:-1:-1;;;;;24421:32:1;;24401:18;;;24394:60;;;;24470:18;;;24463:34;;;66600:20:0::2;::::0;66623:139:::2;::::0;66660:3;;24320:18:1;;66678:42:0::2;;;;;;;;;;;;66735:16;66623:22;:139::i;:::-;66847:11;::::0;66818:50:::2;::::0;-1:-1:-1;;;66818:50:0;;66600:162;;-1:-1:-1;;;;;;66818:28:0;;::::2;::::0;::::2;::::0;:50:::2;::::0;66847:11:::2;::::0;66860:7;;66818:50:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;67006:11:0::2;::::0;66987:166:::2;::::0;-1:-1:-1;;;66987:166:0;;-1:-1:-1;;;;;67006:11:0;;::::2;::::0;66987:40:::2;::::0;67035:9:::2;::::0;66987:166:::2;::::0;67060:10:::2;::::0;67085:12;;67113:7;;67135;;66987:166:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;40000:1:0;41131:7;:22;-1:-1:-1;;;;;;;;;;;;;;;;;64012:3149:0:o;24660:201::-;23640:13;:11;:13::i;:::-;-1:-1:-1;;;;;24749:22:0;::::1;24741:73;;;::::0;-1:-1:-1;;;24741:73:0;;25264:2:1;24741:73:0::1;::::0;::::1;25246:21:1::0;25303:2;25283:18;;;25276:30;25342:34;25322:18;;;25315:62;-1:-1:-1;;;25393:18:1;;;25386:36;25439:19;;24741:73:0::1;25062:402:1::0;24741:73:0::1;24825:28;24844:8;24825:18;:28::i;60955:2618::-:0;40044:1;40819:7;;:19;40811:63;;;;-1:-1:-1;;;40811:63:0;;;;;;;:::i;:::-;40044:1;40952:7;:18;20629:19:::1;:17;:19::i;:::-;61232:17:::2;::::0;::::2;;61229:109;;;61288:10;61274:25;::::0;;;:13:::2;:25;::::0;;;;;::::2;;61266:60;;;;-1:-1:-1::0;;;61266:60:0::2;;;;;;;:::i;:::-;61350:11;-1:-1:-1::0;;;;;61391:24:0;::::2;61387:605;;61459:11;::::0;61440:59:::2;::::0;-1:-1:-1;;;61440:59:0;;61488:10:::2;61440:59;::::0;::::2;160:51:1::0;61511:1:0::2;::::0;-1:-1:-1;;;;;61459:11:0::2;::::0;61440:47:::2;::::0;133:18:1;;61440:59:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;61440:73:0::2;;61436:234;;61563:11;::::0;61590:59:::2;::::0;-1:-1:-1;;;61590:59:0;;61638:10:::2;61590:59;::::0;::::2;160:51:1::0;-1:-1:-1;;;;;61563:11:0;;::::2;::::0;61544:45:::2;::::0;61563:11;;61590:47:::2;::::0;133:18:1;;61590:59:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61544:106;::::0;-1:-1:-1;;;;;;61544:106:0::2;::::0;;;;;;-1:-1:-1;;;;;178:32:1;;;61544:106:0::2;::::0;::::2;160:51:1::0;133:18;;61544:106:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61538:112;;61436:234;61387:605;;;61737:11;::::0;61718:57:::2;::::0;-1:-1:-1;;;61718:57:0;;-1:-1:-1;;;;;178:32:1;;;61718:57:0::2;::::0;::::2;160:51:1::0;61737:11:0;;::::2;::::0;61718:45:::2;::::0;133:18:1;;61718:57:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61779:1;61718:62:::0;61710:95:::2;;;::::0;-1:-1:-1;;;61710:95:0;;23345:2:1;61710:95:0::2;::::0;::::2;23327:21:1::0;23384:2;23364:18;;;23357:30;-1:-1:-1;;;23403:18:1;;;23396:50;23463:18;;61710:95:0::2;23143:344:1::0;61710:95:0::2;61843:11;::::0;61824:70:::2;::::0;-1:-1:-1;;;61824:70:0;;61872:10:::2;61824:70;::::0;::::2;23704:34:1::0;-1:-1:-1;;;;;23774:15:1;;;23754:18;;;23747:43;61843:11:0;;::::2;::::0;61824:47:::2;::::0;23639:18:1;;61824:70:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;61938:11:0::2;::::0;61919:57:::2;::::0;-1:-1:-1;;;61919:57:0;;-1:-1:-1;;;;;178:32:1;;;61919:57:0::2;::::0;::::2;160:51:1::0;61938:11:0;;::::2;::::0;-1:-1:-1;61919:45:0::2;::::0;-1:-1:-1;133:18:1;;61919:57:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61913:63;;61387:605;62072:15;62102:19:::0;62136:18:::2;62169:21:::0;62215:16:::2;62204:64;;;;;;;;;;;;:::i;:::-;62299:44;::::0;-1:-1:-1;;;62299:44:0;;62337:4:::2;62299:44;::::0;::::2;160:51:1::0;62057:211:0;;-1:-1:-1;62057:211:0;;-1:-1:-1;62057:211:0;-1:-1:-1;62057:211:0;-1:-1:-1;62281:15:0::2;::::0;-1:-1:-1;;;;;62299:29:0;::::2;::::0;::::2;::::0;133:18:1;;62299:44:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;62364:27:0;::::2;;::::0;;;:14:::2;:27;::::0;;;;;62281:62;;-1:-1:-1;62364:27:0::2;;62356:56;;;::::0;-1:-1:-1;;;62356:56:0;;24003:2:1;62356:56:0::2;::::0;::::2;23985:21:1::0;24042:2;24022:18;;;24015:30;-1:-1:-1;;;24061:18:1;;;24054:47;24118:18;;62356:56:0::2;23801:341:1::0;62356:56:0::2;62557:12;::::0;-1:-1:-1;;;;;62526:44:0;;::::2;62557:12:::0;::::2;62526:44;62518:78;;;;-1:-1:-1::0;;;62518:78:0::2;;;;;;;:::i;:::-;62652:12;62666:16:::0;62686:10:::2;-1:-1:-1::0;;;;;62686:15:0::2;62709:7;62718:8;62686:41;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62651:76;;;;62750:7;62766:61;62807:18;:3;:16;:18::i;62766:61::-;62742:87;;;;;-1:-1:-1::0;;;62742:87:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;;62891:44:0::2;::::0;-1:-1:-1;;;62891:44:0;;62929:4:::2;62891:44;::::0;::::2;160:51:1::0;62938:7:0;;-1:-1:-1;;;;;;62891:29:0;::::2;::::0;::::2;::::0;133:18:1;;62891:44:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;63079:42;::::0;;24377:6:1;24365:19;;63079:42:0::2;::::0;::::2;24347:38:1::0;-1:-1:-1;;;;;24421:32:1;;24401:18;;;24394:60;;;;24470:18;;;24463:34;;;62881:64:0;;-1:-1:-1;63001:20:0::2;::::0;63024:140:::2;::::0;63061:3;;24320:18:1;;63079:42:0::2;;;;;;;;;;;;63137:16;63024:22;:140::i;:::-;63249:11;::::0;63220:50:::2;::::0;-1:-1:-1;;;63220:50:0;;63001:163;;-1:-1:-1;;;;;;63220:28:0;;::::2;::::0;::::2;::::0;:50:::2;::::0;63249:11:::2;::::0;63262:7;;63220:50:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;63406:11:0::2;::::0;-1:-1:-1;;;;;63406:11:0::2;63387:40;63435:19;63447:7:::0;63435:9:::2;:19;:::i;:::-;63470:10;63495:12;63523:7;63545;63387:176;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;40000:1:0;41131:7;:22;-1:-1:-1;;;;;;;;;;;;;;;60955:2618:0:o;46405:76::-;23640:13;:11;:13::i;:::-;20888:16:::1;:14;:16::i;:::-;46463:10:::2;:8;:10::i;52433:1911::-:0;40044:1;40819:7;;:19;40811:63;;;;-1:-1:-1;;;40811:63:0;;;;;;;:::i;:::-;40044:1;40952:7;:18;20629:19:::1;:17;:19::i;:::-;52722:17:::2;::::0;::::2;;52719:109;;;52778:10;52764:25;::::0;;;:13:::2;:25;::::0;;;;;::::2;;52756:60;;;;-1:-1:-1::0;;;52756:60:0::2;;;;;;;:::i;:::-;52900:11;::::0;-1:-1:-1;;;;;52900:11:0::2;52886:10;:25;52882:192;;52944:16;::::0;-1:-1:-1;;;;;52944:16:0::2;52930:10;:30;52927:136;;52981:66;::::0;-1:-1:-1;;;52981:66:0;;53012:10:::2;52981:66;::::0;::::2;10453:34:1::0;53032:4:0::2;10503:18:1::0;;;10496:43;10555:18;;;10548:34;;;-1:-1:-1;;;;;52981:30:0;::::2;::::0;::::2;::::0;10388:18:1;;52981:66:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;52927:136;53160:42;::::0;-1:-1:-1;;;53160:42:0;;53196:4:::2;53160:42;::::0;::::2;160:51:1::0;53206:7:0;;-1:-1:-1;;;;;53160:27:0;::::2;::::0;::::2;::::0;133:18:1;;53160:42:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;53152:86;;;;-1:-1:-1::0;;;53152:86:0::2;;;;;;;:::i;:::-;53289:43;::::0;-1:-1:-1;;;53289:43:0;;-1:-1:-1;;;;;53289:25:0;::::2;::::0;::::2;::::0;:43:::2;::::0;53315:7;;53324;;53289:43:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53281:82;;;;-1:-1:-1::0;;;53281:82:0::2;;;;;;;:::i;:::-;53397:41;::::0;-1:-1:-1;;;53397:41:0;;53432:4:::2;53397:41;::::0;::::2;160:51:1::0;53376:18:0::2;::::0;-1:-1:-1;;;;;53397:26:0;::::2;::::0;::::2;::::0;133:18:1;;53397:41:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53522:12;::::0;53376:62;;-1:-1:-1;;;;;;53491:44:0;;::::2;53522:12:::0;::::2;53491:44;53483:78;;;;-1:-1:-1::0;;;53483:78:0::2;;;;;;;:::i;:::-;53608:12;53622:16:::0;53642:10:::2;-1:-1:-1::0;;;;;53642:15:0::2;53658:8;53642:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53607:60;;;;53686:7;53702:61;53743:18;:3;:16;:18::i;53702:61::-;53678:87;;;;;-1:-1:-1::0;;;53678:87:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;53801:41:0::2;::::0;-1:-1:-1;;;53801:41:0;;53836:4:::2;53801:41;::::0;::::2;160:51:1::0;53778:20:0::2;::::0;53845:10;;-1:-1:-1;;;;;53801:26:0;::::2;::::0;::::2;::::0;133:18:1;;53801:41:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;53778:77;;53921:11;;;;;;;;;-1:-1:-1::0;;;;;53921:11:0::2;-1:-1:-1::0;;;;;53902:42:0::2;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53976:11;::::0;53957:68:::2;::::0;-1:-1:-1;;;53957:68:0;;::::2;::::0;::::2;14135:25:1::0;;;53976:11:0;14176:18:1;;;14169:50;-1:-1:-1;;;;;53894:62:0;;::::2;::::0;:132:::2;::::0;53976:11:::2;::::0;53957:53:::2;::::0;14108:18:1;;53957:68:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53894:132;::::0;;::::2;::::0;;::::2;::::0;::::2;::::0;;;;;;::::2;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;54105:49:0::2;::::0;-1:-1:-1;;;54105:49:0;;-1:-1:-1;;;;;54105:25:0;::::2;::::0;::::2;::::0;:49:::2;::::0;54131:8;;54141:12;;54105:49:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;54172:164;54191:10;54217:8;54241:12;54269:9;54294:7;54317:8;54172:164;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;40000:1:0;41131:7;:22;-1:-1:-1;;;;;;;;;52433:1911:0:o;23919:132::-;23827:6;;-1:-1:-1;;;;;23827:6:0;18701:10;23983:23;23975:68;;;;-1:-1:-1;;;23975:68:0;;26351:2:1;23975:68:0;;;26333:21:1;;;26370:18;;;26363:30;26429:34;26409:18;;;26402:62;26481:18;;23975:68:0;26149:356:1;21183:108:0;21095:7;;;;21253:9;21245:38;;;;-1:-1:-1;;;21245:38:0;;26712:2:1;21245:38:0;;;26694:21:1;26751:2;26731:18;;;26724:30;-1:-1:-1;;;26770:18:1;;;26763:46;26826:18;;21245:38:0;26510:340:1;43723:305:0;43794:13;43845:2;43824:11;:18;:23;43820:67;;;-1:-1:-1;;43849:38:0;;;;;;;;;;;;;;;;;;43723:305::o;43820:67::-;43954:4;43941:11;43937:22;43922:37;;43998:11;43987:33;;;;;;;;;;;;:::i;:::-;43980:40;43723:305;-1:-1:-1;;43723:305:0:o;43553:158::-;43649:12;43698:1;43701;43681:22;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43674:29;;43553:158;;;;:::o;45006:117::-;23640:13;:11;:13::i;28374:992::-;26327:66;28828:59;;;28824:535;;;28904:37;28923:17;28904:18;:37::i;28824:535::-;29007:17;-1:-1:-1;;;;;28978:61:0;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28978:63:0;;;;;;;;-1:-1:-1;;28978:63:0;;;;;;;;;;;;:::i;:::-;;;28974:306;;29208:56;;-1:-1:-1;;;29208:56:0;;28206:2:1;29208:56:0;;;28188:21:1;28245:2;28225:18;;;28218:30;28284:34;28264:18;;;28257:62;-1:-1:-1;;;28335:18:1;;;28328:44;28389:19;;29208:56:0;28004:410:1;28974:306:0;-1:-1:-1;;;;;;;;;;;29092:28:0;;29084:82;;;;-1:-1:-1;;;29084:82:0;;28621:2:1;29084:82:0;;;28603:21:1;28660:2;28640:18;;;28633:30;28699:34;28679:18;;;28672:62;-1:-1:-1;;;28750:18:1;;;28743:39;28799:19;;29084:82:0;28419:405:1;29084:82:0;29042:140;29294:53;29312:17;29331:4;29337:9;29294:17;:53::i;23297:97::-;16965:13;;;;;;;16957:69;;;;-1:-1:-1;;;16957:69:0;;;;;;;:::i;:::-;23360:26:::1;:24;:26::i;34377:68::-:0;16965:13;;;;;;;16957:69;;;;-1:-1:-1;;;16957:69:0;;;;;;;:::i;20194:99::-;16965:13;;;;;;;16957:69;;;;-1:-1:-1;;;16957:69:0;;;;;;;:::i;:::-;20258:27:::1;:25;:27::i;40086:113::-:0;16965:13;;;;;;;16957:69;;;;-1:-1:-1;;;16957:69:0;;;;;;;:::i;:::-;40157:34:::1;:32;:34::i;25021:191::-:0;25114:6;;;-1:-1:-1;;;;;25131:17:0;;;-1:-1:-1;;;;;;25131:17:0;;;;;;;25164:40;;25114:6;;;25131:17;25114:6;;25164:40;;25095:16;;25164:40;25084:128;25021:191;:::o;21620:118::-;20629:19;:17;:19::i;:::-;21680:7:::1;:14:::0;;-1:-1:-1;;21680:14:0::1;21690:4;21680:14;::::0;;21710:20:::1;21717:12;18701:10:::0;;18621:98;21717:12:::1;21710:20;::::0;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;21710:20:0::1;;;;;;;21620:118::o:0;57205:3296::-;57365:20;57413:28;57456:21;57492:22;57529:15;57559:18;57592:27;57634:21;57680:16;57669:91;;;;;;;;;;;;:::i;:::-;57398:362;;;;;;;;;;;;;;57842:17;57861:21;57884:26;57925:12;57914:50;;;;;;;;;;;;:::i;:::-;57841:123;;;;;;58094:13;-1:-1:-1;;;;;58087:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58083:36;;:2;:36;:::i;:::-;58053:26;:18;58074:5;58053:26;:::i;:::-;:67;;;;:::i;:::-;58182:11;;58163:205;;-1:-1:-1;;;58163:205:0;;31987:6:1;31975:19;;58163:205:0;;;31957:38:1;-1:-1:-1;;;;;32069:15:1;;;32049:18;;;32042:43;32121:15;;;32101:18;;;32094:43;32153:18;;;32146:34;;;58032:88:0;;-1:-1:-1;58135:25:0;;58182:11;;;;58163:53;;31929:19:1;;58163:205:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58478:11;;58459:79;;-1:-1:-1;;;58459:79:0;;;;;14135:25:1;;;58478:11:0;14176:18:1;;;14169:50;58135:233:0;;-1:-1:-1;;;;;;58478:11:0;;58459:53;;14108:18:1;;58459:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58439:99;;:17;:99;:::i;:::-;58419:119;;58689:5;58634:17;:29;58652:10;58634:29;;;;;;;;;;;;;;;:51;58664:20;-1:-1:-1;;;;;58634:51:0;-1:-1:-1;;;;;58634:51:0;;;;;;;;;;;;;;;;;;;;;;58630:2;:55;;;;:::i;:::-;58609:77;;:17;:77;:::i;:::-;:85;;;;:::i;:::-;58589:105;;58833:14;58812:17;:35;;58804:78;;;;-1:-1:-1;;;58804:78:0;;32393:2:1;58804:78:0;;;32375:21:1;32432:2;32412:18;;;32405:30;32471:33;32451:18;;;32444:61;32522:18;;58804:78:0;32191:355:1;58804:78:0;-1:-1:-1;;;;;;;;58911:27:0;;;-1:-1:-1;58908:1586:0;;58992:25;59049:20;59088:14;59121:7;59147:10;59176:11;59206:8;59020:209;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58992:237;;59305:10;59345:1;59370:3;59396:12;59272:155;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59246:196;;;;;;;;;;;;58908:1586;59480:20;-1:-1:-1;;;;;59463:37:0;:13;-1:-1:-1;;;;;59463:37:0;;59460:1034;;59590:127;;;-1:-1:-1;;;;;33972:15:1;;;59590:127:0;;;33954:34:1;34004:18;;;33997:34;;;34067:15;;34047:18;;;;34040:43;;;;59590:127:0;;;;;;;;;;33889:18:1;;;59590:127:0;;;59760:155;;59793:10;;59833:1;;59858:3;;59590:127;;59760:155;;;:::i;59460:1034::-;60000:25;60057:13;60089:20;60128:14;60161:7;60187:10;60216:11;60246:8;60028:241;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60000:269;;60345:10;60385:1;60410:3;60436:12;60312:155;;;;;;;;;;;:::i;57205:3296::-;;;;;;:::o;21368:108::-;21095:7;;;;21427:41;;;;-1:-1:-1;;;21427:41:0;;35049:2:1;21427:41:0;;;35031:21:1;35088:2;35068:18;;;35061:30;-1:-1:-1;;;35107:18:1;;;35100:50;35167:18;;21427:41:0;34847:344:1;21879:120:0;20888:16;:14;:16::i;:::-;21938:7:::1;:15:::0;;-1:-1:-1;;21938:15:0::1;::::0;;21969:22:::1;18701:10:::0;21978:12:::1;18621:98:::0;27205:284;-1:-1:-1;;;;;5886:19:0;;;27279:106;;;;-1:-1:-1;;;27279:106:0;;35398:2:1;27279:106:0;;;35380:21:1;35437:2;35417:18;;;35410:30;35476:34;35456:18;;;35449:62;-1:-1:-1;;;35527:18:1;;;35520:43;35580:19;;27279:106:0;35196:409:1;27279:106:0;-1:-1:-1;;;;;;;;;;;27396:85:0;;-1:-1:-1;;;;;;27396:85:0;-1:-1:-1;;;;;27396:85:0;;;;;;;;;;27205:284::o;27898:297::-;28041:29;28052:17;28041:10;:29::i;:::-;28099:1;28085:4;:11;:15;:28;;;;28104:9;28085:28;28081:107;;;28130:46;28152:17;28171:4;28130:21;:46::i;:::-;;27898:297;;;:::o;23402:113::-;16965:13;;;;;;;16957:69;;;;-1:-1:-1;;;16957:69:0;;;;;;;:::i;:::-;23475:32:::1;18701:10:::0;23475:18:::1;:32::i;20301:97::-:0;16965:13;;;;;;;16957:69;;;;-1:-1:-1;;;16957:69:0;;;;;;;:::i;:::-;20375:7:::1;:15:::0;;-1:-1:-1;;20375:15:0::1;::::0;;20301:97::o;40207:111::-;16965:13;;;;;;;16957:69;;;;-1:-1:-1;;;16957:69:0;;;;;;;:::i;:::-;40000:1:::1;40288:7;:22:::0;40207:111::o;27602:155::-;27669:37;27688:17;27669:18;:37::i;:::-;27722:27;;-1:-1:-1;;;;;27722:27:0;;;;;;;;27602:155;:::o;32635:461::-;32718:12;-1:-1:-1;;;;;5886:19:0;;;32743:88;;;;-1:-1:-1;;;32743:88:0;;35812:2:1;32743:88:0;;;35794:21:1;35851:2;35831:18;;;35824:30;35890:34;35870:18;;;35863:62;-1:-1:-1;;;35941:18:1;;;35934:36;35987:19;;32743:88:0;35610:402:1;32743:88:0;32905:12;32919:23;32946:6;-1:-1:-1;;;;;32946:19:0;32966:4;32946:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32904:67;;;;32989:99;33025:7;33034:10;32989:99;;;;;;;;;;;;;;;;;:35;:99::i;:::-;32982:106;32635:461;-1:-1:-1;;;;;32635:461:0:o;11165:762::-;11315:12;11344:7;11340:580;;;-1:-1:-1;11375:10:0;11368:17;;11340:580;11489:17;;:21;11485:424;;11737:10;11731:17;11798:15;11785:10;11781:2;11777:19;11770:44;11485:424;11880:12;11873:20;;-1:-1:-1;;;11873:20:0;;;;;;;;:::i;222:131:1:-;-1:-1:-1;;;;;297:31:1;;287:42;;277:70;;343:1;340;333:12;358:247;417:6;470:2;458:9;449:7;445:23;441:32;438:52;;;486:1;483;476:12;438:52;525:9;512:23;544:31;569:5;544:31;:::i;610:117::-;695:6;688:5;684:18;677:5;674:29;664:57;;717:1;714;707:12;732:386;799:6;807;860:2;848:9;839:7;835:23;831:32;828:52;;;876:1;873;866:12;828:52;915:9;902:23;934:30;958:5;934:30;:::i;:::-;983:5;-1:-1:-1;1040:2:1;1025:18;;1012:32;1053:33;1012:32;1053:33;:::i;:::-;1105:7;1095:17;;;732:386;;;;;:::o;1312:127::-;1373:10;1368:3;1364:20;1361:1;1354:31;1404:4;1401:1;1394:15;1428:4;1425:1;1418:15;1444:275;1515:2;1509:9;1580:2;1561:13;;-1:-1:-1;;1557:27:1;1545:40;;-1:-1:-1;;;;;1600:34:1;;1636:22;;;1597:62;1594:88;;;1662:18;;:::i;:::-;1698:2;1691:22;1444:275;;-1:-1:-1;1444:275:1:o;1724:186::-;1772:4;-1:-1:-1;;;;;1797:6:1;1794:30;1791:56;;;1827:18;;:::i;:::-;-1:-1:-1;1893:2:1;1872:15;-1:-1:-1;;1868:29:1;1899:4;1864:40;;1724:186::o;1915:462::-;1957:5;2010:3;2003:4;1995:6;1991:17;1987:27;1977:55;;2028:1;2025;2018:12;1977:55;2064:6;2051:20;2095:48;2111:31;2139:2;2111:31;:::i;:::-;2095:48;:::i;:::-;2168:2;2159:7;2152:19;2214:3;2207:4;2202:2;2194:6;2190:15;2186:26;2183:35;2180:55;;;2231:1;2228;2221:12;2180:55;2296:2;2289:4;2281:6;2277:17;2270:4;2261:7;2257:18;2244:55;2344:1;2319:16;;;2337:4;2315:27;2308:38;;;;2323:7;1915:462;-1:-1:-1;;;1915:462:1:o;2382:957::-;2503:6;2511;2519;2527;2535;2543;2596:3;2584:9;2575:7;2571:23;2567:33;2564:53;;;2613:1;2610;2603:12;2564:53;2652:9;2639:23;2671:31;2696:5;2671:31;:::i;:::-;2721:5;-1:-1:-1;2773:2:1;2758:18;;2745:32;;-1:-1:-1;2829:2:1;2814:18;;2801:32;2842:33;2801:32;2842:33;:::i;:::-;2894:7;-1:-1:-1;2953:2:1;2938:18;;2925:32;2966:33;2925:32;2966:33;:::i;:::-;3018:7;-1:-1:-1;3077:3:1;3062:19;;3049:33;3091;3049;3091;:::i;:::-;3143:7;-1:-1:-1;3201:3:1;3186:19;;3173:33;-1:-1:-1;;;;;3218:30:1;;3215:50;;;3261:1;3258;3251:12;3215:50;3284:49;3325:7;3316:6;3305:9;3301:22;3284:49;:::i;:::-;3274:59;;;2382:957;;;;;;;;:::o;3344:807::-;3448:6;3456;3464;3472;3480;3533:3;3521:9;3512:7;3508:23;3504:33;3501:53;;;3550:1;3547;3540:12;3501:53;3589:9;3576:23;3608:31;3633:5;3608:31;:::i;:::-;3658:5;-1:-1:-1;3710:2:1;3695:18;;3682:32;;-1:-1:-1;3766:2:1;3751:18;;3738:32;3779:33;3738:32;3779:33;:::i;:::-;3831:7;-1:-1:-1;3890:2:1;3875:18;;3862:32;3903:33;3862:32;3903:33;:::i;:::-;3955:7;-1:-1:-1;4013:3:1;3998:19;;3985:33;-1:-1:-1;;;;;4030:30:1;;4027:50;;;4073:1;4070;4063:12;4027:50;4096:49;4137:7;4128:6;4117:9;4113:22;4096:49;:::i;:::-;4086:59;;;3344:807;;;;;;;;:::o;4348:388::-;4416:6;4424;4477:2;4465:9;4456:7;4452:23;4448:32;4445:52;;;4493:1;4490;4483:12;4445:52;4532:9;4519:23;4551:31;4576:5;4551:31;:::i;4741:455::-;4818:6;4826;4879:2;4867:9;4858:7;4854:23;4850:32;4847:52;;;4895:1;4892;4885:12;4847:52;4934:9;4921:23;4953:31;4978:5;4953:31;:::i;:::-;5003:5;-1:-1:-1;5059:2:1;5044:18;;5031:32;-1:-1:-1;;;;;5075:30:1;;5072:50;;;5118:1;5115;5108:12;5072:50;5141:49;5182:7;5173:6;5162:9;5158:22;5141:49;:::i;:::-;5131:59;;;4741:455;;;;;:::o;5383:615::-;5469:6;5477;5530:2;5518:9;5509:7;5505:23;5501:32;5498:52;;;5546:1;5543;5536:12;5498:52;5586:9;5573:23;-1:-1:-1;;;;;5656:2:1;5648:6;5645:14;5642:34;;;5672:1;5669;5662:12;5642:34;5710:6;5699:9;5695:22;5685:32;;5755:7;5748:4;5744:2;5740:13;5736:27;5726:55;;5777:1;5774;5767:12;5726:55;5817:2;5804:16;5843:2;5835:6;5832:14;5829:34;;;5859:1;5856;5849:12;5829:34;5912:7;5907:2;5897:6;5894:1;5890:14;5886:2;5882:23;5878:32;5875:45;5872:65;;;5933:1;5930;5923:12;5872:65;5964:2;5956:11;;;;;5986:6;;-1:-1:-1;5383:615:1;;-1:-1:-1;;;;5383:615:1:o;6003:388::-;6080:6;6088;6141:2;6129:9;6120:7;6116:23;6112:32;6109:52;;;6157:1;6154;6147:12;6109:52;6193:9;6180:23;6170:33;;6254:2;6243:9;6239:18;6226:32;-1:-1:-1;;;;;6273:6:1;6270:30;6267:50;;;6313:1;6310;6303:12;6396:114;6480:4;6473:5;6469:16;6462:5;6459:27;6449:55;;6500:1;6497;6490:12;6515:523;6589:6;6597;6605;6658:2;6646:9;6637:7;6633:23;6629:32;6626:52;;;6674:1;6671;6664:12;6626:52;6713:9;6700:23;6732:30;6756:5;6732:30;:::i;:::-;6781:5;-1:-1:-1;6838:2:1;6823:18;;6810:32;6851:33;6810:32;6851:33;:::i;:::-;6903:7;-1:-1:-1;6962:2:1;6947:18;;6934:32;6975:31;6934:32;6975:31;:::i;:::-;7025:7;7015:17;;;6515:523;;;;;:::o;7043:1013::-;7164:6;7172;7180;7188;7196;7249:3;7237:9;7228:7;7224:23;7220:33;7217:53;;;7266:1;7263;7256:12;7217:53;7305:9;7292:23;7324:30;7348:5;7324:30;:::i;:::-;7373:5;-1:-1:-1;7430:2:1;7415:18;;7402:32;7443:33;7402:32;7443:33;:::i;:::-;7495:7;-1:-1:-1;7553:2:1;7538:18;;7525:32;-1:-1:-1;;;;;7606:14:1;;;7603:34;;;7633:1;7630;7623:12;7603:34;7656:49;7697:7;7688:6;7677:9;7673:22;7656:49;:::i;:::-;7646:59;;7758:2;7747:9;7743:18;7730:32;7714:48;;7787:2;7777:8;7774:16;7771:36;;;7803:1;7800;7793:12;7771:36;7826:51;7869:7;7858:8;7847:9;7843:24;7826:51;:::i;:::-;7816:61;;7930:3;7919:9;7915:19;7902:33;7886:49;;7960:2;7950:8;7947:16;7944:36;;;7976:1;7973;7966:12;7944:36;;7999:51;8042:7;8031:8;8020:9;8016:24;7999:51;:::i;8061:1091::-;8183:6;8191;8199;8207;8215;8223;8231;8284:3;8272:9;8263:7;8259:23;8255:33;8252:53;;;8301:1;8298;8291:12;8252:53;8340:9;8327:23;8359:31;8384:5;8359:31;:::i;:::-;8409:5;-1:-1:-1;8466:2:1;8451:18;;8438:32;8479:33;8438:32;8479:33;:::i;:::-;8531:7;-1:-1:-1;8585:2:1;8570:18;;8557:32;;-1:-1:-1;8641:2:1;8626:18;;8613:32;8654:33;8613:32;8654:33;:::i;:::-;8706:7;-1:-1:-1;8765:3:1;8750:19;;8737:33;8779;8737;8779;:::i;:::-;8831:7;-1:-1:-1;8890:3:1;8875:19;;8862:33;8904;8862;8904;:::i;:::-;8956:7;-1:-1:-1;9014:3:1;8999:19;;8986:33;-1:-1:-1;;;;;9031:30:1;;9028:50;;;9074:1;9071;9064:12;9028:50;9097:49;9138:7;9129:6;9118:9;9114:22;9097:49;:::i;:::-;9087:59;;;8061:1091;;;;;;;;;;:::o;9157:339::-;9359:2;9341:21;;;9398:2;9378:18;;;9371:30;-1:-1:-1;;;9432:2:1;9417:18;;9410:45;9487:2;9472:18;;9157:339::o;9501:355::-;9703:2;9685:21;;;9742:2;9722:18;;;9715:30;9781:33;9776:2;9761:18;;9754:61;9847:2;9832:18;;9501:355::o;9861:347::-;10063:2;10045:21;;;10102:2;10082:18;;;10075:30;10141:25;10136:2;10121:18;;10114:53;10199:2;10184:18;;9861:347::o;10593:277::-;10660:6;10713:2;10701:9;10692:7;10688:23;10684:32;10681:52;;;10729:1;10726;10719:12;10681:52;10761:9;10755:16;10814:5;10807:13;10800:21;10793:5;10790:32;10780:60;;10836:1;10833;10826:12;10875:184;10945:6;10998:2;10986:9;10977:7;10973:23;10969:32;10966:52;;;11014:1;11011;11004:12;10966:52;-1:-1:-1;11037:16:1;;10875:184;-1:-1:-1;10875:184:1:o;11064:344::-;11266:2;11248:21;;;11305:2;11285:18;;;11278:30;-1:-1:-1;;;11339:2:1;11324:18;;11317:50;11399:2;11384:18;;11064:344::o;11413:274::-;-1:-1:-1;;;;;11605:32:1;;;;11587:51;;11669:2;11654:18;;11647:34;11575:2;11560:18;;11413:274::o;11692:350::-;11894:2;11876:21;;;11933:2;11913:18;;;11906:30;11972:28;11967:2;11952:18;;11945:56;12033:2;12018:18;;11692:350::o;12047:346::-;12249:2;12231:21;;;12288:2;12268:18;;;12261:30;-1:-1:-1;;;12322:2:1;12307:18;;12300:52;12384:2;12369:18;;12047:346::o;12398:250::-;12483:1;12493:113;12507:6;12504:1;12501:13;12493:113;;;12583:11;;;12577:18;12564:11;;;12557:39;12529:2;12522:10;12493:113;;;-1:-1:-1;;12640:1:1;12622:16;;12615:27;12398:250::o;12653:287::-;12782:3;12820:6;12814:13;12836:66;12895:6;12890:3;12883:4;12875:6;12871:17;12836:66;:::i;:::-;12918:16;;;;;12653:287;-1:-1:-1;;12653:287:1:o;12945:271::-;12987:3;13025:5;13019:12;13052:6;13047:3;13040:19;13068:76;13137:6;13130:4;13125:3;13121:14;13114:4;13107:5;13103:16;13068:76;:::i;:::-;13198:2;13177:15;-1:-1:-1;;13173:29:1;13164:39;;;;13205:4;13160:50;;12945:271;-1:-1:-1;;12945:271:1:o;13221:220::-;13370:2;13359:9;13352:21;13333:4;13390:45;13431:2;13420:9;13416:18;13408:6;13390:45;:::i;13446:127::-;13507:10;13502:3;13498:20;13495:1;13488:31;13538:4;13535:1;13528:15;13562:4;13559:1;13552:15;13578:128;13645:9;;;13666:11;;;13663:37;;;13680:18;;:::i;13711:251::-;13781:6;13834:2;13822:9;13813:7;13809:23;13805:32;13802:52;;;13850:1;13847;13840:12;13802:52;13882:9;13876:16;13901:31;13926:5;13901:31;:::i;14230:617::-;-1:-1:-1;;;;;14581:15:1;;;14563:34;;14633:15;;;14628:2;14613:18;;14606:43;14680:2;14665:18;;14658:34;;;;14728:15;;;14723:2;14708:18;;14701:43;14775:3;14760:19;;14753:35;14825:15;;;14543:3;14804:19;;14797:44;14512:3;14497:19;;14230:617::o;15466:408::-;15668:2;15650:21;;;15707:2;15687:18;;;15680:30;15746:34;15741:2;15726:18;;15719:62;-1:-1:-1;;;15812:2:1;15797:18;;15790:42;15864:3;15849:19;;15466:408::o;15879:::-;16081:2;16063:21;;;16120:2;16100:18;;;16093:30;16159:34;16154:2;16139:18;;16132:62;-1:-1:-1;;;16225:2:1;16210:18;;16203:42;16277:3;16262:19;;15879:408::o;16707:339::-;16909:2;16891:21;;;16948:2;16928:18;;;16921:30;-1:-1:-1;;;16982:2:1;16967:18;;16960:45;17037:2;17022:18;;16707:339::o;17675:401::-;17877:2;17859:21;;;17916:2;17896:18;;;17889:30;17955:34;17950:2;17935:18;;17928:62;-1:-1:-1;;;18021:2:1;18006:18;;17999:35;18066:3;18051:19;;17675:401::o;18081:127::-;18142:10;18137:3;18133:20;18130:1;18123:31;18173:4;18170:1;18163:15;18197:4;18194:1;18187:15;18213:135;18252:3;18273:17;;;18270:43;;18293:18;;:::i;:::-;-1:-1:-1;18340:1:1;18329:13;;18213:135::o;18705:320::-;18780:5;18809:52;18825:35;18853:6;18825:35;:::i;18809:52::-;18800:61;;18884:6;18877:5;18870:21;18924:3;18915:6;18910:3;18906:16;18903:25;18900:45;;;18941:1;18938;18931:12;18900:45;18954:65;19012:6;19005:4;18998:5;18994:16;18989:3;18954:65;:::i;19030:235::-;19083:5;19136:3;19129:4;19121:6;19117:17;19113:27;19103:55;;19154:1;19151;19144:12;19103:55;19176:83;19255:3;19246:6;19240:13;19233:4;19225:6;19221:17;19176:83;:::i;19270:665::-;19383:6;19391;19399;19407;19460:3;19448:9;19439:7;19435:23;19431:33;19428:53;;;19477:1;19474;19467:12;19428:53;19509:9;19503:16;19528:31;19553:5;19528:31;:::i;:::-;19628:2;19613:18;;19607:25;19578:5;;-1:-1:-1;19641:32:1;19607:25;19641:32;:::i;:::-;19739:2;19724:18;;19718:25;19787:2;19772:18;;19766:25;19692:7;;-1:-1:-1;19718:25:1;-1:-1:-1;;;;;;19803:30:1;;19800:50;;;19846:1;19843;19836:12;19800:50;19869:60;19921:7;19912:6;19901:9;19897:22;19869:60;:::i;:::-;19859:70;;;19270:665;;;;;;;:::o;19940:462::-;20044:6;20052;20060;20113:2;20101:9;20092:7;20088:23;20084:32;20081:52;;;20129:1;20126;20119:12;20081:52;20161:9;20155:16;20180:31;20205:5;20180:31;:::i;:::-;20275:2;20260:18;;20254:25;20324:2;20309:18;;20303:25;20230:5;;-1:-1:-1;20254:25:1;-1:-1:-1;20337:33:1;20303:25;20337:33;:::i;20589:1104::-;20762:6;20770;20778;20786;20794;20802;20810;20863:3;20851:9;20842:7;20838:23;20834:33;20831:53;;;20880:1;20877;20870:12;20831:53;20912:9;20906:16;20931:31;20956:5;20931:31;:::i;:::-;21031:2;21016:18;;21010:25;20981:5;;-1:-1:-1;21044:33:1;21010:25;21044:33;:::i;:::-;21143:2;21128:18;;21122:25;21192:2;21177:18;;21171:25;21096:7;;-1:-1:-1;21122:25:1;-1:-1:-1;21205:33:1;21171:25;21205:33;:::i;:::-;21309:3;21294:19;;21288:26;21257:7;;-1:-1:-1;21323:33:1;21288:26;21323:33;:::i;:::-;21427:3;21412:19;;21406:26;21375:7;;-1:-1:-1;21441:33:1;21406:26;21441:33;:::i;:::-;21544:3;21529:19;;21523:26;21493:7;;-1:-1:-1;;;;;;21561:30:1;;21558:50;;;21604:1;21601;21594:12;21558:50;21627:60;21679:7;21670:6;21659:9;21655:22;21627:60;:::i;21698:125::-;21763:9;;;21784:10;;;21781:36;;;21797:18;;:::i;22177:961::-;22333:6;22341;22349;22357;22365;22373;22426:3;22414:9;22405:7;22401:23;22397:33;22394:53;;;22443:1;22440;22433:12;22394:53;22475:9;22469:16;22494:31;22519:5;22494:31;:::i;:::-;22589:2;22574:18;;22568:25;22638:2;22623:18;;22617:25;22544:5;;-1:-1:-1;22568:25:1;-1:-1:-1;22651:33:1;22617:25;22651:33;:::i;:::-;22755:2;22740:18;;22734:25;22703:7;;-1:-1:-1;22768:33:1;22734:25;22768:33;:::i;:::-;22872:3;22857:19;;22851:26;22820:7;;-1:-1:-1;22886:33:1;22851:26;22886:33;:::i;:::-;22989:3;22974:19;;22968:26;22938:7;;-1:-1:-1;;;;;;23006:30:1;;23003:50;;;23049:1;23046;23039:12;23003:50;23072:60;23124:7;23115:6;23104:9;23100:22;23072:60;:::i;24508:549::-;-1:-1:-1;;;;;24757:32:1;;24739:51;;24826:3;24821:2;24806:18;;24799:31;;;-1:-1:-1;;24853:46:1;;24879:19;;24871:6;24853:46;:::i;:::-;24947:9;24939:6;24935:22;24930:2;24919:9;24915:18;24908:50;24975:33;25001:6;24993;24975:33;:::i;:::-;24967:41;;;25044:6;25039:2;25028:9;25024:18;25017:34;24508:549;;;;;;;:::o;25469:675::-;25591:6;25599;25607;25615;25668:3;25656:9;25647:7;25643:23;25639:33;25636:53;;;25685:1;25682;25675:12;25636:53;25714:9;25708:16;25698:26;;25767:2;25756:9;25752:18;25746:25;25780:31;25805:5;25780:31;:::i;:::-;25880:2;25865:18;;25859:25;25830:5;;-1:-1:-1;25893:33:1;25859:25;25893:33;:::i;:::-;25996:2;25981:18;;25975:25;25945:7;;-1:-1:-1;;;;;;26012:30:1;;26009:50;;;26055:1;26052;26045:12;26855:458;26935:6;26988:2;26976:9;26967:7;26963:23;26959:32;26956:52;;;27004:1;27001;26994:12;26956:52;27037:9;27031:16;-1:-1:-1;;;;;27062:6:1;27059:30;27056:50;;;27102:1;27099;27092:12;27056:50;27125:22;;27178:4;27170:13;;27166:27;-1:-1:-1;27156:55:1;;27207:1;27204;27197:12;27156:55;27230:77;27299:7;27294:2;27288:9;27283:2;27279;27275:11;27230:77;:::i;:::-;27220:87;26855:458;-1:-1:-1;;;;26855:458:1:o;27318:492::-;27493:3;27531:6;27525:13;27547:66;27606:6;27601:3;27594:4;27586:6;27582:17;27547:66;:::i;:::-;27676:13;;27635:16;;;;27698:70;27676:13;27635:16;27745:4;27733:17;;27698:70;:::i;:::-;27784:20;;27318:492;-1:-1:-1;;;;27318:492:1:o;28829:407::-;29031:2;29013:21;;;29070:2;29050:18;;;29043:30;29109:34;29104:2;29089:18;;29082:62;-1:-1:-1;;;29175:2:1;29160:18;;29153:41;29226:3;29211:19;;28829:407::o;29241:452::-;29336:6;29344;29352;29405:2;29393:9;29384:7;29380:23;29376:32;29373:52;;;29421:1;29418;29411:12;29373:52;29453:9;29447:16;29472:30;29496:5;29472:30;:::i;:::-;29571:2;29556:18;;29550:25;29521:5;;-1:-1:-1;29584:33:1;29550:25;29584:33;:::i;:::-;29636:7;29626:17;;;29683:2;29672:9;29668:18;29662:25;29652:35;;29241:452;;;;;:::o;29698:247::-;29766:6;29819:2;29807:9;29798:7;29794:23;29790:32;29787:52;;;29835:1;29832;29825:12;29787:52;29867:9;29861:16;29886:29;29909:5;29886:29;:::i;29950:422::-;30039:1;30082:5;30039:1;30096:270;30117:7;30107:8;30104:21;30096:270;;;30176:4;30172:1;30168:6;30164:17;30158:4;30155:27;30152:53;;;30185:18;;:::i;:::-;30235:7;30225:8;30221:22;30218:55;;;30255:16;;;;30218:55;30334:22;;;;30294:15;;;;30096:270;;;30100:3;29950:422;;;;;:::o;30377:806::-;30426:5;30456:8;30446:80;;-1:-1:-1;30497:1:1;30511:5;;30446:80;30545:4;30535:76;;-1:-1:-1;30582:1:1;30596:5;;30535:76;30627:4;30645:1;30640:59;;;;30713:1;30708:130;;;;30620:218;;30640:59;30670:1;30661:10;;30684:5;;;30708:130;30745:3;30735:8;30732:17;30729:43;;;30752:18;;:::i;:::-;-1:-1:-1;;30808:1:1;30794:16;;30823:5;;30620:218;;30922:2;30912:8;30909:16;30903:3;30897:4;30894:13;30890:36;30884:2;30874:8;30871:16;30866:2;30860:4;30857:12;30853:35;30850:77;30847:159;;;-1:-1:-1;30959:19:1;;;30991:5;;30847:159;31038:34;31063:8;31057:4;31038:34;:::i;:::-;31108:6;31104:1;31100:6;31096:19;31087:7;31084:32;31081:58;;;31119:18;;:::i;:::-;31157:20;;30377:806;-1:-1:-1;;;30377:806:1:o;31188:140::-;31246:5;31275:47;31316:4;31306:8;31302:19;31296:4;31275:47;:::i;31333:168::-;31406:9;;;31437;;31454:15;;;31448:22;;31434:37;31424:71;;31475:18;;:::i;31506:217::-;31546:1;31572;31562:132;;31616:10;31611:3;31607:20;31604:1;31597:31;31651:4;31648:1;31641:15;31679:4;31676:1;31669:15;31562:132;-1:-1:-1;31708:9:1;;31506:217::o;32551:667::-;-1:-1:-1;;;;;32892:15:1;;;32874:34;;32939:2;32924:18;;32917:34;;;32987:15;;;32982:2;32967:18;;32960:43;33039:15;;;33034:2;33019:18;;33012:43;33092:15;;33086:3;33071:19;;33064:44;33145:3;32854;33124:19;;33117:32;;;32817:4;;33166:46;;33192:19;;33184:6;33166:46;:::i;:::-;33158:54;32551:667;-1:-1:-1;;;;;;;;32551:667:1:o;33223:470::-;33481:1;33477;33472:3;33468:11;33464:19;33456:6;33452:32;33441:9;33434:51;33533:6;33525;33521:19;33516:2;33505:9;33501:18;33494:47;33577:6;33572:2;33561:9;33557:18;33550:34;33620:3;33615:2;33604:9;33600:18;33593:31;33415:4;33641:46;33682:3;33671:9;33667:19;33659:6;33641:46;:::i;:::-;33633:54;33223:470;-1:-1:-1;;;;;;33223:470:1:o;34094:748::-;-1:-1:-1;;;;;34463:15:1;;;34445:34;;34515:15;;;34510:2;34495:18;;34488:43;34562:2;34547:18;;34540:34;;;34610:15;;;34605:2;34590:18;;34583:43;34663:15;;;34657:3;34642:19;;34635:44;34716:15;;34425:3;34695:19;;34688:44;34769:3;34763;34748:19;;34741:32;;;34388:4;;34790:46;;34816:19;;34808:6;34790:46;:::i;:::-;34782:54;34094:748;-1:-1:-1;;;;;;;;;34094:748:1:o
Swarm Source
ipfs://3526d7c9227bf89336913b28d6f28c393359d4df96ecd8038e8c0e4fbe641ed1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.