Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60a06040 | 13752899 | 1077 days ago | IN | 0 ETH | 0.28032793 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ForwardRootToken
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-06 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.0 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol // OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.0 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts v4.4.0 (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File: lib/EIP712.sol pragma solidity ^0.8.0; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private _CACHED_DOMAIN_SEPARATOR; uint256 private _CACHED_CHAIN_ID; bytes32 private _HASHED_NAME; bytes32 private _HASHED_VERSION; bytes32 private _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ function initializeEIP712(string memory name, string memory version) internal { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator( typeHash, hashedName, hashedVersion ); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator( _TYPE_HASH, _HASHED_NAME, _HASHED_VERSION ); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256( abi.encode( typeHash, nameHash, versionHash, block.chainid, address(this) ) ); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.0 (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 Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: lib/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 Pausable is Context { /** * @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 initializePausable() internal { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { 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()); } } // File: lib/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 Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function initializeOwnable(address __owner) internal { _setOwner(__owner); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { 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 { _setOwner(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" ); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: lib/ERC20.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ function initializeERC20(string memory name_, string memory symbol_) internal { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require( currentAllowance >= amount, "ERC20: transfer amount exceeds allowance" ); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender] + addedValue ); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require( currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero" ); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require( senderBalance >= amount, "ERC20: transfer amount exceeds balance" ); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File: lib/ERC20Permit.sol pragma solidity ^0.8.0; /** * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * _Available since v3.4._ */ abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 { using Counters for Counters.Counter; mapping(address => Counters.Counter) private _nonces; // solhint-disable-next-line var-name-mixedcase bytes32 private immutable _PERMIT_TYPEHASH = keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ); /** * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`. * * It's a good idea to use the same `name` that is defined as the ERC20 token name. */ function initializeERC20Permit(string memory name) internal { initializeEIP712(name, "1"); } /** * @dev See {IERC20Permit-permit}. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual override { require(block.timestamp <= deadline, "ERC20Permit: expired deadline"); bytes32 structHash = keccak256( abi.encode( _PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline ) ); bytes32 hash = _hashTypedDataV4(structHash); address signer = ECDSA.recover(hash, v, r, s); require(signer == owner, "ERC20Permit: invalid signature"); _approve(owner, spender, value); } /** * @dev See {IERC20Permit-nonces}. */ function nonces(address owner) public view virtual override returns (uint256) { return _nonces[owner].current(); } /** * @dev See {IERC20Permit-DOMAIN_SEPARATOR}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view override returns (bytes32) { return _domainSeparatorV4(); } /** * @dev "Consume a nonce": return the current value and increment. * * _Available since v4.1._ */ function _useNonce(address owner) internal virtual returns (uint256 current) { Counters.Counter storage nonce = _nonces[owner]; current = nonce.current(); nonce.increment(); } } // File: ForwardRootToken.sol pragma solidity ^0.8.0; /** * Implementation of the Forward token */ contract ForwardRootToken is ERC20, Pausable, ERC20Permit, Ownable { bool public initialized; function initialize(address tokenowner) external { require(!initialized, "already initialized"); require(tokenowner != address(0), "Invalid address"); initializeERC20("Forward", "$FORWARD"); initializePausable(); initializeOwnable(tokenowner); initializeERC20Permit("Forward"); _mint(tokenowner, 5000000000 ether); // mint 5 bil $FORWARD tokens initialized = true; } function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual override { super._beforeTokenTransfer(from, to, amount); require(address(to) != address(this), "dont send to token contract"); require(!paused(), "ERC20Pausable: token transfer while paused"); } function refundTokens(IERC20 tokenAddress) external onlyOwner { tokenAddress.transfer(owner(), tokenAddress.balanceOf(address(this))); } function togglePause() external onlyOwner { if (!paused()) _pause(); else _unpause(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenowner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"tokenAddress","type":"address"}],"name":"refundTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960809081525034801561003757600080fd5b5060805161325b6100536000396000610dfa015261325b6000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c8063715018a6116100b8578063a9059cbb1161007c578063a9059cbb1461037d578063c4ae3168146103ad578063c4d66de8146103b7578063d505accf146103d3578063dd62ed3e146103ef578063f2fde38b1461041f57610142565b8063715018a6146102d75780637ecebe00146102e15780638da5cb5b1461031157806395d89b411461032f578063a457c2d71461034d57610142565b8063313ce5671161010a578063313ce567146102015780633644e5151461021f578063395093511461023d578063455ca9bd1461026d5780635c975abb1461028957806370a08231146102a757610142565b806306fdde0314610147578063095ea7b314610165578063158ef93e1461019557806318160ddd146101b357806323b872dd146101d1575b600080fd5b61014f61043b565b60405161015c9190612cb7565b60405180910390f35b61017f600480360381019061017a9190612259565b6104cd565b60405161018c9190612b88565b60405180910390f35b61019d6104eb565b6040516101aa9190612b88565b60405180910390f35b6101bb6104fe565b6040516101c89190612f99565b60405180910390f35b6101eb60048036038101906101e6919061216c565b610508565b6040516101f89190612b88565b60405180910390f35b610209610600565b6040516102169190612fb4565b60405180910390f35b610227610609565b6040516102349190612ba3565b60405180910390f35b61025760048036038101906102529190612259565b610618565b6040516102649190612b88565b60405180910390f35b610287600480360381019061028291906122be565b6106c4565b005b610291610860565b60405161029e9190612b88565b60405180910390f35b6102c160048036038101906102bc9190612107565b610877565b6040516102ce9190612f99565b60405180910390f35b6102df6108bf565b005b6102fb60048036038101906102f69190612107565b610947565b6040516103089190612f99565b60405180910390f35b610319610997565b6040516103269190612b44565b60405180910390f35b6103376109c1565b6040516103449190612cb7565b60405180910390f35b61036760048036038101906103629190612259565b610a53565b6040516103749190612b88565b60405180910390f35b61039760048036038101906103929190612259565b610b3e565b6040516103a49190612b88565b60405180910390f35b6103b5610b5c565b005b6103d160048036038101906103cc9190612107565b610bfc565b005b6103ed60048036038101906103e891906121bb565b610db3565b005b61040960048036038101906104049190612130565b610ef5565b6040516104169190612f99565b60405180910390f35b61043960048036038101906104349190612107565b610f7c565b005b60606003805461044a906130f0565b80601f0160208091040260200160405190810160405280929190818152602001828054610476906130f0565b80156104c35780601f10610498576101008083540402835291602001916104c3565b820191906000526020600020905b8154815290600101906020018083116104a657829003601f168201915b5050505050905090565b60006104e16104da611074565b848461107c565b6001905092915050565b600c60149054906101000a900460ff1681565b6000600254905090565b6000610515848484611247565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610560611074565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156105e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d790612eb9565b60405180910390fd5b6105f4856105ec611074565b85840361107c565b60019150509392505050565b60006012905090565b60006106136114c8565b905090565b60006106ba610625611074565b848460016000610633611074565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546106b59190612ff6565b61107c565b6001905092915050565b6106cc611074565b73ffffffffffffffffffffffffffffffffffffffff166106ea610997565b73ffffffffffffffffffffffffffffffffffffffff1614610740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073790612ed9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610764610997565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161079d9190612b44565b60206040518083038186803b1580156107b557600080fd5b505afa1580156107c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ed91906122e7565b6040518363ffffffff1660e01b815260040161080a929190612b5f565b602060405180830381600087803b15801561082457600080fd5b505af1158015610838573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085c9190612295565b5050565b6000600560009054906101000a900460ff16905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108c7611074565b73ffffffffffffffffffffffffffffffffffffffff166108e5610997565b73ffffffffffffffffffffffffffffffffffffffff161461093b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093290612ed9565b60405180910390fd5b61094560006114f5565b565b6000610990600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206115bb565b9050919050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546109d0906130f0565b80601f01602080910402602001604051908101604052809291908181526020018280546109fc906130f0565b8015610a495780601f10610a1e57610100808354040283529160200191610a49565b820191906000526020600020905b815481529060010190602001808311610a2c57829003601f168201915b5050505050905090565b60008060016000610a62611074565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610b1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1690612f39565b60405180910390fd5b610b33610b2a611074565b8585840361107c565b600191505092915050565b6000610b52610b4b611074565b8484611247565b6001905092915050565b610b64611074565b73ffffffffffffffffffffffffffffffffffffffff16610b82610997565b73ffffffffffffffffffffffffffffffffffffffff1614610bd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcf90612ed9565b60405180910390fd5b610be0610860565b610bf157610bec6115c9565b610bfa565b610bf961166c565b5b565b600c60149054906101000a900460ff1615610c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4390612e59565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb390612d39565b60405180910390fd5b610d306040518060400160405280600781526020017f466f7277617264000000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f24464f525741524400000000000000000000000000000000000000000000000081525061170e565b610d38611740565b610d418161175d565b610d7f6040518060400160405280600781526020017f466f727761726400000000000000000000000000000000000000000000000000815250611769565b610d95816b1027e72f1f128130880000006117ab565b6001600c60146101000a81548160ff02191690831515021790555050565b83421115610df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ded90612db9565b60405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000000888888610e258c61190b565b89604051602001610e3b96959493929190612bbe565b6040516020818303038152906040528051906020012090506000610e5e82611969565b90506000610e6e82878787611983565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed590612e99565b60405180910390fd5b610ee98a8a8a61107c565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610f84611074565b73ffffffffffffffffffffffffffffffffffffffff16610fa2610997565b73ffffffffffffffffffffffffffffffffffffffff1614610ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fef90612ed9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105f90612d79565b60405180910390fd5b611071816114f5565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e390612f19565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561115c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115390612d99565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161123a9190612f99565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ae90612ef9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e90612cf9565b60405180910390fd5b6113328383836119ae565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156113b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113af90612dd9565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461144b9190612ff6565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114af9190612f99565b60405180910390a36114c2848484611a75565b50505050565b60006007544614156114de5760065490506114f2565b6114ef600a54600854600954611a7a565b90505b90565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b6115d1610860565b15611611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160890612e39565b60405180910390fd5b6001600560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611655611074565b6040516116629190612b44565b60405180910390a1565b611674610860565b6116b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116aa90612d19565b60405180910390fd5b6000600560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6116f7611074565b6040516117049190612b44565b60405180910390a1565b8160039080519060200190611724929190611fd1565b50806004908051906020019061173b929190611fd1565b505050565b6000600560006101000a81548160ff021916908315150217905550565b611766816114f5565b50565b6117a8816040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611ab4565b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561181b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181290612f59565b60405180910390fd5b611827600083836119ae565b80600260008282546118399190612ff6565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461188e9190612ff6565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118f39190612f99565b60405180910390a361190760008383611a75565b5050565b600080600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611958816115bb565b915061196381611b25565b50919050565b600061197c6119766114c8565b83611b3b565b9050919050565b600080600061199487878787611b6e565b915091506119a181611c7b565b8192505050949350505050565b6119b9838383611fcc565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1f90612e19565b60405180910390fd5b611a30610860565b15611a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6790612f79565b60405180910390fd5b505050565b505050565b60008383834630604051602001611a95959493929190612c1f565b6040516020818303038152906040528051906020012090509392505050565b60008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f9050826008819055508160098190555046600781905550611b11818484611a7a565b60068190555080600a819055505050505050565b6001816000016000828254019250508190555050565b60008282604051602001611b50929190612b0d565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115611ba9576000600391509150611c72565b601b8560ff1614158015611bc15750601c8560ff1614155b15611bd3576000600491509150611c72565b600060018787878760405160008152602001604052604051611bf89493929190612c72565b6020604051602081039080840390855afa158015611c1a573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c6957600060019250925050611c72565b80600092509250505b94509492505050565b60006004811115611cb5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611cee577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611cf957611fc9565b60016004811115611d33577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611d6c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da490612cd9565b60405180910390fd5b60026004811115611de7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611e20577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5890612d59565b60405180910390fd5b60036004811115611e9b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611ed4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0c90612df9565b60405180910390fd5b600480811115611f4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611f87577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611fc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbf90612e79565b60405180910390fd5b5b50565b505050565b828054611fdd906130f0565b90600052602060002090601f016020900481019282611fff5760008555612046565b82601f1061201857805160ff1916838001178555612046565b82800160010185558215612046579182015b8281111561204557825182559160200191906001019061202a565b5b5090506120539190612057565b5090565b5b80821115612070576000816000905550600101612058565b5090565b6000813590506120838161319b565b92915050565b600081519050612098816131b2565b92915050565b6000813590506120ad816131c9565b92915050565b6000813590506120c2816131e0565b92915050565b6000813590506120d7816131f7565b92915050565b6000815190506120ec816131f7565b92915050565b6000813590506121018161320e565b92915050565b60006020828403121561211957600080fd5b600061212784828501612074565b91505092915050565b6000806040838503121561214357600080fd5b600061215185828601612074565b925050602061216285828601612074565b9150509250929050565b60008060006060848603121561218157600080fd5b600061218f86828701612074565b93505060206121a086828701612074565b92505060406121b1868287016120c8565b9150509250925092565b600080600080600080600060e0888a0312156121d657600080fd5b60006121e48a828b01612074565b97505060206121f58a828b01612074565b96505060406122068a828b016120c8565b95505060606122178a828b016120c8565b94505060806122288a828b016120f2565b93505060a06122398a828b0161209e565b92505060c061224a8a828b0161209e565b91505092959891949750929550565b6000806040838503121561226c57600080fd5b600061227a85828601612074565b925050602061228b858286016120c8565b9150509250929050565b6000602082840312156122a757600080fd5b60006122b584828501612089565b91505092915050565b6000602082840312156122d057600080fd5b60006122de848285016120b3565b91505092915050565b6000602082840312156122f957600080fd5b6000612307848285016120dd565b91505092915050565b6123198161304c565b82525050565b6123288161305e565b82525050565b6123378161306a565b82525050565b61234e6123498261306a565b613122565b82525050565b600061235f82612fcf565b6123698185612fda565b93506123798185602086016130bd565b6123828161318a565b840191505092915050565b600061239a601883612fda565b91507f45434453413a20696e76616c6964207369676e617475726500000000000000006000830152602082019050919050565b60006123da602383612fda565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612440601483612fda565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b6000612480600f83612fda565b91507f496e76616c6964206164647265737300000000000000000000000000000000006000830152602082019050919050565b60006124c0601f83612fda565b91507f45434453413a20696e76616c6964207369676e6174757265206c656e677468006000830152602082019050919050565b6000612500602683612fda565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612566602283612fda565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006125cc600283612feb565b91507f19010000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061260c601d83612fda565b91507f45524332305065726d69743a206578706972656420646561646c696e650000006000830152602082019050919050565b600061264c602683612fda565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006126b2602283612fda565b91507f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008301527f75650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612718601b83612fda565b91507f646f6e742073656e6420746f20746f6b656e20636f6e747261637400000000006000830152602082019050919050565b6000612758601083612fda565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b6000612798601383612fda565b91507f616c726561647920696e697469616c697a6564000000000000000000000000006000830152602082019050919050565b60006127d8602283612fda565b91507f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008301527f75650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061283e601e83612fda565b91507f45524332305065726d69743a20696e76616c6964207369676e617475726500006000830152602082019050919050565b600061287e602883612fda565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206160008301527f6c6c6f77616e63650000000000000000000000000000000000000000000000006020830152604082019050919050565b60006128e4602083612fda565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000612924602583612fda565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061298a602483612fda565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006129f0602583612fda565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612a56601f83612fda565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b6000612a96602a83612fda565b91507f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008301527f696c6520706175736564000000000000000000000000000000000000000000006020830152604082019050919050565b612af8816130a6565b82525050565b612b07816130b0565b82525050565b6000612b18826125bf565b9150612b24828561233d565b602082019150612b34828461233d565b6020820191508190509392505050565b6000602082019050612b596000830184612310565b92915050565b6000604082019050612b746000830185612310565b612b816020830184612aef565b9392505050565b6000602082019050612b9d600083018461231f565b92915050565b6000602082019050612bb8600083018461232e565b92915050565b600060c082019050612bd3600083018961232e565b612be06020830188612310565b612bed6040830187612310565b612bfa6060830186612aef565b612c076080830185612aef565b612c1460a0830184612aef565b979650505050505050565b600060a082019050612c34600083018861232e565b612c41602083018761232e565b612c4e604083018661232e565b612c5b6060830185612aef565b612c686080830184612310565b9695505050505050565b6000608082019050612c87600083018761232e565b612c946020830186612afe565b612ca1604083018561232e565b612cae606083018461232e565b95945050505050565b60006020820190508181036000830152612cd18184612354565b905092915050565b60006020820190508181036000830152612cf28161238d565b9050919050565b60006020820190508181036000830152612d12816123cd565b9050919050565b60006020820190508181036000830152612d3281612433565b9050919050565b60006020820190508181036000830152612d5281612473565b9050919050565b60006020820190508181036000830152612d72816124b3565b9050919050565b60006020820190508181036000830152612d92816124f3565b9050919050565b60006020820190508181036000830152612db281612559565b9050919050565b60006020820190508181036000830152612dd2816125ff565b9050919050565b60006020820190508181036000830152612df28161263f565b9050919050565b60006020820190508181036000830152612e12816126a5565b9050919050565b60006020820190508181036000830152612e328161270b565b9050919050565b60006020820190508181036000830152612e528161274b565b9050919050565b60006020820190508181036000830152612e728161278b565b9050919050565b60006020820190508181036000830152612e92816127cb565b9050919050565b60006020820190508181036000830152612eb281612831565b9050919050565b60006020820190508181036000830152612ed281612871565b9050919050565b60006020820190508181036000830152612ef2816128d7565b9050919050565b60006020820190508181036000830152612f1281612917565b9050919050565b60006020820190508181036000830152612f328161297d565b9050919050565b60006020820190508181036000830152612f52816129e3565b9050919050565b60006020820190508181036000830152612f7281612a49565b9050919050565b60006020820190508181036000830152612f9281612a89565b9050919050565b6000602082019050612fae6000830184612aef565b92915050565b6000602082019050612fc96000830184612afe565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b6000613001826130a6565b915061300c836130a6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156130415761304061312c565b5b828201905092915050565b600061305782613086565b9050919050565b60008115159050919050565b6000819050919050565b600061307f8261304c565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b838110156130db5780820151818401526020810190506130c0565b838111156130ea576000848401525b50505050565b6000600282049050600182168061310857607f821691505b6020821081141561311c5761311b61315b565b5b50919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b6131a48161304c565b81146131af57600080fd5b50565b6131bb8161305e565b81146131c657600080fd5b50565b6131d28161306a565b81146131dd57600080fd5b50565b6131e981613074565b81146131f457600080fd5b50565b613200816130a6565b811461320b57600080fd5b50565b613217816130b0565b811461322257600080fd5b5056fea264697066735822122043d5f46c62c18fd26d68fffc834267a42531c883f055b55d821f2196f3aa938464736f6c63430008000033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101425760003560e01c8063715018a6116100b8578063a9059cbb1161007c578063a9059cbb1461037d578063c4ae3168146103ad578063c4d66de8146103b7578063d505accf146103d3578063dd62ed3e146103ef578063f2fde38b1461041f57610142565b8063715018a6146102d75780637ecebe00146102e15780638da5cb5b1461031157806395d89b411461032f578063a457c2d71461034d57610142565b8063313ce5671161010a578063313ce567146102015780633644e5151461021f578063395093511461023d578063455ca9bd1461026d5780635c975abb1461028957806370a08231146102a757610142565b806306fdde0314610147578063095ea7b314610165578063158ef93e1461019557806318160ddd146101b357806323b872dd146101d1575b600080fd5b61014f61043b565b60405161015c9190612cb7565b60405180910390f35b61017f600480360381019061017a9190612259565b6104cd565b60405161018c9190612b88565b60405180910390f35b61019d6104eb565b6040516101aa9190612b88565b60405180910390f35b6101bb6104fe565b6040516101c89190612f99565b60405180910390f35b6101eb60048036038101906101e6919061216c565b610508565b6040516101f89190612b88565b60405180910390f35b610209610600565b6040516102169190612fb4565b60405180910390f35b610227610609565b6040516102349190612ba3565b60405180910390f35b61025760048036038101906102529190612259565b610618565b6040516102649190612b88565b60405180910390f35b610287600480360381019061028291906122be565b6106c4565b005b610291610860565b60405161029e9190612b88565b60405180910390f35b6102c160048036038101906102bc9190612107565b610877565b6040516102ce9190612f99565b60405180910390f35b6102df6108bf565b005b6102fb60048036038101906102f69190612107565b610947565b6040516103089190612f99565b60405180910390f35b610319610997565b6040516103269190612b44565b60405180910390f35b6103376109c1565b6040516103449190612cb7565b60405180910390f35b61036760048036038101906103629190612259565b610a53565b6040516103749190612b88565b60405180910390f35b61039760048036038101906103929190612259565b610b3e565b6040516103a49190612b88565b60405180910390f35b6103b5610b5c565b005b6103d160048036038101906103cc9190612107565b610bfc565b005b6103ed60048036038101906103e891906121bb565b610db3565b005b61040960048036038101906104049190612130565b610ef5565b6040516104169190612f99565b60405180910390f35b61043960048036038101906104349190612107565b610f7c565b005b60606003805461044a906130f0565b80601f0160208091040260200160405190810160405280929190818152602001828054610476906130f0565b80156104c35780601f10610498576101008083540402835291602001916104c3565b820191906000526020600020905b8154815290600101906020018083116104a657829003601f168201915b5050505050905090565b60006104e16104da611074565b848461107c565b6001905092915050565b600c60149054906101000a900460ff1681565b6000600254905090565b6000610515848484611247565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610560611074565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156105e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d790612eb9565b60405180910390fd5b6105f4856105ec611074565b85840361107c565b60019150509392505050565b60006012905090565b60006106136114c8565b905090565b60006106ba610625611074565b848460016000610633611074565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546106b59190612ff6565b61107c565b6001905092915050565b6106cc611074565b73ffffffffffffffffffffffffffffffffffffffff166106ea610997565b73ffffffffffffffffffffffffffffffffffffffff1614610740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073790612ed9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610764610997565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161079d9190612b44565b60206040518083038186803b1580156107b557600080fd5b505afa1580156107c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ed91906122e7565b6040518363ffffffff1660e01b815260040161080a929190612b5f565b602060405180830381600087803b15801561082457600080fd5b505af1158015610838573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085c9190612295565b5050565b6000600560009054906101000a900460ff16905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108c7611074565b73ffffffffffffffffffffffffffffffffffffffff166108e5610997565b73ffffffffffffffffffffffffffffffffffffffff161461093b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093290612ed9565b60405180910390fd5b61094560006114f5565b565b6000610990600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206115bb565b9050919050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546109d0906130f0565b80601f01602080910402602001604051908101604052809291908181526020018280546109fc906130f0565b8015610a495780601f10610a1e57610100808354040283529160200191610a49565b820191906000526020600020905b815481529060010190602001808311610a2c57829003601f168201915b5050505050905090565b60008060016000610a62611074565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610b1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1690612f39565b60405180910390fd5b610b33610b2a611074565b8585840361107c565b600191505092915050565b6000610b52610b4b611074565b8484611247565b6001905092915050565b610b64611074565b73ffffffffffffffffffffffffffffffffffffffff16610b82610997565b73ffffffffffffffffffffffffffffffffffffffff1614610bd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcf90612ed9565b60405180910390fd5b610be0610860565b610bf157610bec6115c9565b610bfa565b610bf961166c565b5b565b600c60149054906101000a900460ff1615610c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4390612e59565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb390612d39565b60405180910390fd5b610d306040518060400160405280600781526020017f466f7277617264000000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f24464f525741524400000000000000000000000000000000000000000000000081525061170e565b610d38611740565b610d418161175d565b610d7f6040518060400160405280600781526020017f466f727761726400000000000000000000000000000000000000000000000000815250611769565b610d95816b1027e72f1f128130880000006117ab565b6001600c60146101000a81548160ff02191690831515021790555050565b83421115610df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ded90612db9565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610e258c61190b565b89604051602001610e3b96959493929190612bbe565b6040516020818303038152906040528051906020012090506000610e5e82611969565b90506000610e6e82878787611983565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed590612e99565b60405180910390fd5b610ee98a8a8a61107c565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610f84611074565b73ffffffffffffffffffffffffffffffffffffffff16610fa2610997565b73ffffffffffffffffffffffffffffffffffffffff1614610ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fef90612ed9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105f90612d79565b60405180910390fd5b611071816114f5565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e390612f19565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561115c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115390612d99565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161123a9190612f99565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ae90612ef9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e90612cf9565b60405180910390fd5b6113328383836119ae565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156113b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113af90612dd9565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461144b9190612ff6565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114af9190612f99565b60405180910390a36114c2848484611a75565b50505050565b60006007544614156114de5760065490506114f2565b6114ef600a54600854600954611a7a565b90505b90565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b6115d1610860565b15611611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160890612e39565b60405180910390fd5b6001600560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611655611074565b6040516116629190612b44565b60405180910390a1565b611674610860565b6116b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116aa90612d19565b60405180910390fd5b6000600560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6116f7611074565b6040516117049190612b44565b60405180910390a1565b8160039080519060200190611724929190611fd1565b50806004908051906020019061173b929190611fd1565b505050565b6000600560006101000a81548160ff021916908315150217905550565b611766816114f5565b50565b6117a8816040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611ab4565b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561181b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181290612f59565b60405180910390fd5b611827600083836119ae565b80600260008282546118399190612ff6565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461188e9190612ff6565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118f39190612f99565b60405180910390a361190760008383611a75565b5050565b600080600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611958816115bb565b915061196381611b25565b50919050565b600061197c6119766114c8565b83611b3b565b9050919050565b600080600061199487878787611b6e565b915091506119a181611c7b565b8192505050949350505050565b6119b9838383611fcc565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1f90612e19565b60405180910390fd5b611a30610860565b15611a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6790612f79565b60405180910390fd5b505050565b505050565b60008383834630604051602001611a95959493929190612c1f565b6040516020818303038152906040528051906020012090509392505050565b60008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f9050826008819055508160098190555046600781905550611b11818484611a7a565b60068190555080600a819055505050505050565b6001816000016000828254019250508190555050565b60008282604051602001611b50929190612b0d565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115611ba9576000600391509150611c72565b601b8560ff1614158015611bc15750601c8560ff1614155b15611bd3576000600491509150611c72565b600060018787878760405160008152602001604052604051611bf89493929190612c72565b6020604051602081039080840390855afa158015611c1a573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c6957600060019250925050611c72565b80600092509250505b94509492505050565b60006004811115611cb5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611cee577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611cf957611fc9565b60016004811115611d33577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611d6c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da490612cd9565b60405180910390fd5b60026004811115611de7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611e20577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5890612d59565b60405180910390fd5b60036004811115611e9b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611ed4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0c90612df9565b60405180910390fd5b600480811115611f4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611f87577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611fc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbf90612e79565b60405180910390fd5b5b50565b505050565b828054611fdd906130f0565b90600052602060002090601f016020900481019282611fff5760008555612046565b82601f1061201857805160ff1916838001178555612046565b82800160010185558215612046579182015b8281111561204557825182559160200191906001019061202a565b5b5090506120539190612057565b5090565b5b80821115612070576000816000905550600101612058565b5090565b6000813590506120838161319b565b92915050565b600081519050612098816131b2565b92915050565b6000813590506120ad816131c9565b92915050565b6000813590506120c2816131e0565b92915050565b6000813590506120d7816131f7565b92915050565b6000815190506120ec816131f7565b92915050565b6000813590506121018161320e565b92915050565b60006020828403121561211957600080fd5b600061212784828501612074565b91505092915050565b6000806040838503121561214357600080fd5b600061215185828601612074565b925050602061216285828601612074565b9150509250929050565b60008060006060848603121561218157600080fd5b600061218f86828701612074565b93505060206121a086828701612074565b92505060406121b1868287016120c8565b9150509250925092565b600080600080600080600060e0888a0312156121d657600080fd5b60006121e48a828b01612074565b97505060206121f58a828b01612074565b96505060406122068a828b016120c8565b95505060606122178a828b016120c8565b94505060806122288a828b016120f2565b93505060a06122398a828b0161209e565b92505060c061224a8a828b0161209e565b91505092959891949750929550565b6000806040838503121561226c57600080fd5b600061227a85828601612074565b925050602061228b858286016120c8565b9150509250929050565b6000602082840312156122a757600080fd5b60006122b584828501612089565b91505092915050565b6000602082840312156122d057600080fd5b60006122de848285016120b3565b91505092915050565b6000602082840312156122f957600080fd5b6000612307848285016120dd565b91505092915050565b6123198161304c565b82525050565b6123288161305e565b82525050565b6123378161306a565b82525050565b61234e6123498261306a565b613122565b82525050565b600061235f82612fcf565b6123698185612fda565b93506123798185602086016130bd565b6123828161318a565b840191505092915050565b600061239a601883612fda565b91507f45434453413a20696e76616c6964207369676e617475726500000000000000006000830152602082019050919050565b60006123da602383612fda565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612440601483612fda565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b6000612480600f83612fda565b91507f496e76616c6964206164647265737300000000000000000000000000000000006000830152602082019050919050565b60006124c0601f83612fda565b91507f45434453413a20696e76616c6964207369676e6174757265206c656e677468006000830152602082019050919050565b6000612500602683612fda565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612566602283612fda565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006125cc600283612feb565b91507f19010000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061260c601d83612fda565b91507f45524332305065726d69743a206578706972656420646561646c696e650000006000830152602082019050919050565b600061264c602683612fda565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006126b2602283612fda565b91507f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008301527f75650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612718601b83612fda565b91507f646f6e742073656e6420746f20746f6b656e20636f6e747261637400000000006000830152602082019050919050565b6000612758601083612fda565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b6000612798601383612fda565b91507f616c726561647920696e697469616c697a6564000000000000000000000000006000830152602082019050919050565b60006127d8602283612fda565b91507f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008301527f75650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061283e601e83612fda565b91507f45524332305065726d69743a20696e76616c6964207369676e617475726500006000830152602082019050919050565b600061287e602883612fda565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206160008301527f6c6c6f77616e63650000000000000000000000000000000000000000000000006020830152604082019050919050565b60006128e4602083612fda565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000612924602583612fda565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061298a602483612fda565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006129f0602583612fda565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612a56601f83612fda565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b6000612a96602a83612fda565b91507f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008301527f696c6520706175736564000000000000000000000000000000000000000000006020830152604082019050919050565b612af8816130a6565b82525050565b612b07816130b0565b82525050565b6000612b18826125bf565b9150612b24828561233d565b602082019150612b34828461233d565b6020820191508190509392505050565b6000602082019050612b596000830184612310565b92915050565b6000604082019050612b746000830185612310565b612b816020830184612aef565b9392505050565b6000602082019050612b9d600083018461231f565b92915050565b6000602082019050612bb8600083018461232e565b92915050565b600060c082019050612bd3600083018961232e565b612be06020830188612310565b612bed6040830187612310565b612bfa6060830186612aef565b612c076080830185612aef565b612c1460a0830184612aef565b979650505050505050565b600060a082019050612c34600083018861232e565b612c41602083018761232e565b612c4e604083018661232e565b612c5b6060830185612aef565b612c686080830184612310565b9695505050505050565b6000608082019050612c87600083018761232e565b612c946020830186612afe565b612ca1604083018561232e565b612cae606083018461232e565b95945050505050565b60006020820190508181036000830152612cd18184612354565b905092915050565b60006020820190508181036000830152612cf28161238d565b9050919050565b60006020820190508181036000830152612d12816123cd565b9050919050565b60006020820190508181036000830152612d3281612433565b9050919050565b60006020820190508181036000830152612d5281612473565b9050919050565b60006020820190508181036000830152612d72816124b3565b9050919050565b60006020820190508181036000830152612d92816124f3565b9050919050565b60006020820190508181036000830152612db281612559565b9050919050565b60006020820190508181036000830152612dd2816125ff565b9050919050565b60006020820190508181036000830152612df28161263f565b9050919050565b60006020820190508181036000830152612e12816126a5565b9050919050565b60006020820190508181036000830152612e328161270b565b9050919050565b60006020820190508181036000830152612e528161274b565b9050919050565b60006020820190508181036000830152612e728161278b565b9050919050565b60006020820190508181036000830152612e92816127cb565b9050919050565b60006020820190508181036000830152612eb281612831565b9050919050565b60006020820190508181036000830152612ed281612871565b9050919050565b60006020820190508181036000830152612ef2816128d7565b9050919050565b60006020820190508181036000830152612f1281612917565b9050919050565b60006020820190508181036000830152612f328161297d565b9050919050565b60006020820190508181036000830152612f52816129e3565b9050919050565b60006020820190508181036000830152612f7281612a49565b9050919050565b60006020820190508181036000830152612f9281612a89565b9050919050565b6000602082019050612fae6000830184612aef565b92915050565b6000602082019050612fc96000830184612afe565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b6000613001826130a6565b915061300c836130a6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156130415761304061312c565b5b828201905092915050565b600061305782613086565b9050919050565b60008115159050919050565b6000819050919050565b600061307f8261304c565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b838110156130db5780820151818401526020810190506130c0565b838111156130ea576000848401525b50505050565b6000600282049050600182168061310857607f821691505b6020821081141561311c5761311b61315b565b5b50919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b6131a48161304c565b81146131af57600080fd5b50565b6131bb8161305e565b81146131c657600080fd5b50565b6131d28161306a565b81146131dd57600080fd5b50565b6131e981613074565b81146131f457600080fd5b50565b613200816130a6565b811461320b57600080fd5b50565b613217816130b0565b811461322257600080fd5b5056fea264697066735822122043d5f46c62c18fd26d68fffc834267a42531c883f055b55d821f2196f3aa938464736f6c63430008000033
Deployed Bytecode Sourcemap
45047:1187:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31489:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33797:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45121:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32609:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34489:529;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32451:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44428:115;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35427:297;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45963:150;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22259:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32780:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25126:94;;;:::i;:::-;;44120:178;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24475:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31708:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36227:482;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33170:216;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46121:110;;;:::i;:::-;;45153:445;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43268:786;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33449:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25375:229;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31489:100;31543:13;31576:5;31569:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31489:100;:::o;33797:210::-;33916:4;33938:39;33947:12;:10;:12::i;:::-;33961:7;33970:6;33938:8;:39::i;:::-;33995:4;33988:11;;33797:210;;;;:::o;45121:23::-;;;;;;;;;;;;;:::o;32609:108::-;32670:7;32697:12;;32690:19;;32609:108;:::o;34489:529::-;34629:4;34646:36;34656:6;34664:9;34675:6;34646:9;:36::i;:::-;34695:24;34722:11;:19;34734:6;34722:19;;;;;;;;;;;;;;;:33;34742:12;:10;:12::i;:::-;34722:33;;;;;;;;;;;;;;;;34695:60;;34808:6;34788:16;:26;;34766:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;34918:57;34927:6;34935:12;:10;:12::i;:::-;34968:6;34949:16;:25;34918:8;:57::i;:::-;35006:4;34999:11;;;34489:529;;;;;:::o;32451:93::-;32509:5;32534:2;32527:9;;32451:93;:::o;44428:115::-;44488:7;44515:20;:18;:20::i;:::-;44508:27;;44428:115;:::o;35427:297::-;35542:4;35564:130;35587:12;:10;:12::i;:::-;35614:7;35673:10;35636:11;:25;35648:12;:10;:12::i;:::-;35636:25;;;;;;;;;;;;;;;:34;35662:7;35636:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;35564:8;:130::i;:::-;35712:4;35705:11;;35427:297;;;;:::o;45963:150::-;24706:12;:10;:12::i;:::-;24695:23;;:7;:5;:7::i;:::-;:23;;;24687:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46036:12:::1;:21;;;46058:7;:5;:7::i;:::-;46067:12;:22;;;46098:4;46067:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46036:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45963:150:::0;:::o;22259:86::-;22306:4;22330:7;;;;;;;;;;;22323:14;;22259:86;:::o;32780:177::-;32899:7;32931:9;:18;32941:7;32931:18;;;;;;;;;;;;;;;;32924:25;;32780:177;;;:::o;25126:94::-;24706:12;:10;:12::i;:::-;24695:23;;:7;:5;:7::i;:::-;:23;;;24687:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25191:21:::1;25209:1;25191:9;:21::i;:::-;25126:94::o:0;44120:178::-;44234:7;44266:24;:7;:14;44274:5;44266:14;;;;;;;;;;;;;;;:22;:24::i;:::-;44259:31;;44120:178;;;:::o;24475:87::-;24521:7;24548:6;;;;;;;;;;;24541:13;;24475:87;:::o;31708:104::-;31764:13;31797:7;31790:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31708:104;:::o;36227:482::-;36347:4;36369:24;36396:11;:25;36408:12;:10;:12::i;:::-;36396:25;;;;;;;;;;;;;;;:34;36422:7;36396:34;;;;;;;;;;;;;;;;36369:61;;36483:15;36463:16;:35;;36441:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;36599:67;36608:12;:10;:12::i;:::-;36622:7;36650:15;36631:16;:34;36599:8;:67::i;:::-;36697:4;36690:11;;;36227:482;;;;:::o;33170:216::-;33292:4;33314:42;33324:12;:10;:12::i;:::-;33338:9;33349:6;33314:9;:42::i;:::-;33374:4;33367:11;;33170:216;;;;:::o;46121:110::-;24706:12;:10;:12::i;:::-;24695:23;;:7;:5;:7::i;:::-;:23;;;24687:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46179:8:::1;:6;:8::i;:::-;46174:49;;46189:8;:6;:8::i;:::-;46174:49;;;46213:10;:8;:10::i;:::-;46174:49;46121:110::o:0;45153:445::-;45222:11;;;;;;;;;;;45221:12;45213:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;45298:1;45276:24;;:10;:24;;;;45268:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;45331:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:38::i;:::-;45380:20;:18;:20::i;:::-;45411:29;45429:10;45411:17;:29::i;:::-;45451:32;;;;;;;;;;;;;;;;;;:21;:32::i;:::-;45496:35;45502:10;45514:16;45496:5;:35::i;:::-;45586:4;45572:11;;:18;;;;;;;;;;;;;;;;;;45153:445;:::o;43268:786::-;43512:8;43493:15;:27;;43485:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;43567:18;43641:16;43676:5;43700:7;43726:5;43750:16;43760:5;43750:9;:16::i;:::-;43785:8;43612:196;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43588:231;;;;;;43567:252;;43832:12;43847:28;43864:10;43847:16;:28::i;:::-;43832:43;;43888:14;43905:28;43919:4;43925:1;43928;43931;43905:13;:28::i;:::-;43888:45;;43962:5;43952:15;;:6;:15;;;43944:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;44015:31;44024:5;44031:7;44040:5;44015:8;:31::i;:::-;43268:786;;;;;;;;;;:::o;33449:201::-;33583:7;33615:11;:18;33627:5;33615:18;;;;;;;;;;;;;;;:27;33634:7;33615:27;;;;;;;;;;;;;;;;33608:34;;33449:201;;;;:::o;25375:229::-;24706:12;:10;:12::i;:::-;24695:23;;:7;:5;:7::i;:::-;:23;;;24687:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25498:1:::1;25478:22;;:8;:22;;;;25456:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;25577:19;25587:8;25577:9;:19::i;:::-;25375:229:::0;:::o;20975:98::-;21028:7;21055:10;21048:17;;20975:98;:::o;40017:380::-;40170:1;40153:19;;:5;:19;;;;40145:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40251:1;40232:21;;:7;:21;;;;40224:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40335:6;40305:11;:18;40317:5;40305:18;;;;;;;;;;;;;;;:27;40324:7;40305:27;;;;;;;;;;;;;;;:36;;;;40373:7;40357:32;;40366:5;40357:32;;;40382:6;40357:32;;;;;;:::i;:::-;;;;;;;;40017:380;;;:::o;37199:770::-;37357:1;37339:20;;:6;:20;;;;37331:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;37441:1;37420:23;;:9;:23;;;;37412:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;37496:47;37517:6;37525:9;37536:6;37496:20;:47::i;:::-;37556:21;37580:9;:17;37590:6;37580:17;;;;;;;;;;;;;;;;37556:41;;37647:6;37630:13;:23;;37608:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;37791:6;37775:13;:22;37755:9;:17;37765:6;37755:17;;;;;;;;;;;;;;;:42;;;;37843:6;37819:9;:20;37829:9;37819:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;37884:9;37867:35;;37876:6;37867:35;;;37895:6;37867:35;;;;;;:::i;:::-;;;;;;;;37915:46;37935:6;37943:9;37954:6;37915:19;:46::i;:::-;37199:770;;;;:::o;18619:380::-;18672:7;18713:16;;18696:13;:33;18692:300;;;18753:24;;18746:31;;;;18692:300;18834:146;18878:10;;18911:12;;18946:15;;18834:21;:146::i;:::-;18810:170;;18619:380;;:::o;25612:173::-;25668:16;25687:6;;;;;;;;;;;25668:25;;25713:8;25704:6;;:17;;;;;;;;;;;;;;;;;;25768:8;25737:40;;25758:8;25737:40;;;;;;;;;;;;25612:173;;:::o;905:114::-;970:7;997;:14;;;990:21;;905:114;;;:::o;23059:118::-;22585:8;:6;:8::i;:::-;22584:9;22576:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;23129:4:::1;23119:7;;:14;;;;;;;;;;;;;;;;;;23149:20;23156:12;:10;:12::i;:::-;23149:20;;;;;;:::i;:::-;;;;;;;;23059:118::o:0;23318:120::-;22862:8;:6;:8::i;:::-;22854:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;23387:5:::1;23377:7;;:15;;;;;;;;;;;;;;;;;;23408:22;23417:12;:10;:12::i;:::-;23408:22;;;;;;:::i;:::-;;;;;;;;23318:120::o:0;31267:152::-;31378:5;31370;:13;;;;;;;;;;;;:::i;:::-;;31404:7;31394;:17;;;;;;;;;;;;:::i;:::-;;31267:152;;:::o;22086:73::-;22146:5;22136:7;;:15;;;;;;;;;;;;;;;;;;22086:73::o;24304:90::-;24368:18;24378:7;24368:9;:18::i;:::-;24304:90;:::o;43096:106::-;43167:27;43184:4;43167:27;;;;;;;;;;;;;;;;;:16;:27::i;:::-;43096:106;:::o;38256:399::-;38359:1;38340:21;;:7;:21;;;;38332:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;38410:49;38439:1;38443:7;38452:6;38410:20;:49::i;:::-;38488:6;38472:12;;:22;;;;;;;:::i;:::-;;;;;;;;38527:6;38505:9;:18;38515:7;38505:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;38570:7;38549:37;;38566:1;38549:37;;;38579:6;38549:37;;;;;;:::i;:::-;;;;;;;;38599:48;38627:1;38631:7;38640:6;38599:19;:48::i;:::-;38256:399;;:::o;44681:239::-;44768:15;44801:30;44834:7;:14;44842:5;44834:14;;;;;;;;;;;;;;;44801:47;;44869:15;:5;:13;:15::i;:::-;44859:25;;44895:17;:5;:15;:17::i;:::-;44681:239;;;;:::o;20081:208::-;20194:7;20226:55;20248:20;:18;:20::i;:::-;20270:10;20226:21;:55::i;:::-;20219:62;;20081:208;;;:::o;13659:279::-;13787:7;13808:17;13827:18;13849:25;13860:4;13866:1;13869;13872;13849:10;:25::i;:::-;13807:67;;;;13885:18;13897:5;13885:11;:18::i;:::-;13921:9;13914:16;;;;13659:279;;;;;;:::o;45606:349::-;45749:44;45776:4;45782:2;45786:6;45749:26;:44::i;:::-;45835:4;45812:28;;45820:2;45812:28;;;;45804:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45892:8;:6;:8::i;:::-;45891:9;45883:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;45606:349;;;:::o;41726:124::-;;;;:::o;19007:432::-;19151:7;19252:8;19283;19314:11;19348:13;19392:4;19219:197;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;19191:240;;;;;;19171:260;;19007:432;;;;;:::o;17866:662::-;17969:18;18006:4;17990:22;;;;;;17969:43;;18023:21;18063:7;18047:25;;;;;;18023:49;;18083:16;18102:119;18083:138;;18247:10;18232:12;:25;;;;18286:13;18268:15;:31;;;;18329:13;18310:16;:32;;;;18380:108;18416:8;18439:10;18464:13;18380:21;:108::i;:::-;18353:24;:135;;;;18512:8;18499:10;:21;;;;17866:662;;;;;:::o;1027:127::-;1134:1;1116:7;:14;;;:19;;;;;;;;;;;1027:127;:::o;15350:196::-;15443:7;15509:15;15526:10;15480:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;15470:68;;;;;;15463:75;;15350:196;;;;:::o;11888:1632::-;12019:7;12028:12;12953:66;12948:1;12940:10;;:79;12936:163;;;13052:1;13056:30;13036:51;;;;;;12936:163;13118:2;13113:1;:7;;;;:18;;;;;13129:2;13124:1;:7;;;;13113:18;13109:102;;;13164:1;13168:30;13148:51;;;;;;13109:102;13308:14;13325:24;13335:4;13341:1;13344;13347;13325:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13308:41;;13382:1;13364:20;;:6;:20;;;13360:103;;;13417:1;13421:29;13401:50;;;;;;;13360:103;13483:6;13491:20;13475:37;;;;;11888:1632;;;;;;;;:::o;6550:643::-;6628:20;6619:29;;;;;;;;;;;;;;;;:5;:29;;;;;;;;;;;;;;;;;6615:571;;;6665:7;;6615:571;6726:29;6717:38;;;;;;;;;;;;;;;;:5;:38;;;;;;;;;;;;;;;;;6713:473;;;6772:34;;;;;;;;;;:::i;:::-;;;;;;;;6713:473;6837:35;6828:44;;;;;;;;;;;;;;;;:5;:44;;;;;;;;;;;;;;;;;6824:362;;;6889:41;;;;;;;;;;:::i;:::-;;;;;;;;6824:362;6961:30;6952:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;6948:238;;;7008:44;;;;;;;;;;:::i;:::-;;;;;;;;6948:238;7083:30;7074:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;7070:116;;;7130:44;;;;;;;;;;:::i;:::-;;;;;;;;7070:116;6550:643;;:::o;40997:125::-;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:139:1:-;;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:137::-;;237:6;231:13;222:22;;253:30;277:5;253:30;:::i;:::-;212:77;;;;:::o;295:139::-;;379:6;366:20;357:29;;395:33;422:5;395:33;:::i;:::-;347:87;;;;:::o;440:169::-;;539:6;526:20;517:29;;555:48;597:5;555:48;:::i;:::-;507:102;;;;:::o;615:139::-;;699:6;686:20;677:29;;715:33;742:5;715:33;:::i;:::-;667:87;;;;:::o;760:143::-;;848:6;842:13;833:22;;864:33;891:5;864:33;:::i;:::-;823:80;;;;:::o;909:135::-;;991:6;978:20;969:29;;1007:31;1032:5;1007:31;:::i;:::-;959:85;;;;:::o;1050:262::-;;1158:2;1146:9;1137:7;1133:23;1129:32;1126:2;;;1174:1;1171;1164:12;1126:2;1217:1;1242:53;1287:7;1278:6;1267:9;1263:22;1242:53;:::i;:::-;1232:63;;1188:117;1116:196;;;;:::o;1318:407::-;;;1443:2;1431:9;1422:7;1418:23;1414:32;1411:2;;;1459:1;1456;1449:12;1411:2;1502:1;1527:53;1572:7;1563:6;1552:9;1548:22;1527:53;:::i;:::-;1517:63;;1473:117;1629:2;1655:53;1700:7;1691:6;1680:9;1676:22;1655:53;:::i;:::-;1645:63;;1600:118;1401:324;;;;;:::o;1731:552::-;;;;1873:2;1861:9;1852:7;1848:23;1844:32;1841:2;;;1889:1;1886;1879:12;1841:2;1932:1;1957:53;2002:7;1993:6;1982:9;1978:22;1957:53;:::i;:::-;1947:63;;1903:117;2059:2;2085:53;2130:7;2121:6;2110:9;2106:22;2085:53;:::i;:::-;2075:63;;2030:118;2187:2;2213:53;2258:7;2249:6;2238:9;2234:22;2213:53;:::i;:::-;2203:63;;2158:118;1831:452;;;;;:::o;2289:1132::-;;;;;;;;2497:3;2485:9;2476:7;2472:23;2468:33;2465:2;;;2514:1;2511;2504:12;2465:2;2557:1;2582:53;2627:7;2618:6;2607:9;2603:22;2582:53;:::i;:::-;2572:63;;2528:117;2684:2;2710:53;2755:7;2746:6;2735:9;2731:22;2710:53;:::i;:::-;2700:63;;2655:118;2812:2;2838:53;2883:7;2874:6;2863:9;2859:22;2838:53;:::i;:::-;2828:63;;2783:118;2940:2;2966:53;3011:7;3002:6;2991:9;2987:22;2966:53;:::i;:::-;2956:63;;2911:118;3068:3;3095:51;3138:7;3129:6;3118:9;3114:22;3095:51;:::i;:::-;3085:61;;3039:117;3195:3;3222:53;3267:7;3258:6;3247:9;3243:22;3222:53;:::i;:::-;3212:63;;3166:119;3324:3;3351:53;3396:7;3387:6;3376:9;3372:22;3351:53;:::i;:::-;3341:63;;3295:119;2455:966;;;;;;;;;;:::o;3427:407::-;;;3552:2;3540:9;3531:7;3527:23;3523:32;3520:2;;;3568:1;3565;3558:12;3520:2;3611:1;3636:53;3681:7;3672:6;3661:9;3657:22;3636:53;:::i;:::-;3626:63;;3582:117;3738:2;3764:53;3809:7;3800:6;3789:9;3785:22;3764:53;:::i;:::-;3754:63;;3709:118;3510:324;;;;;:::o;3840:278::-;;3956:2;3944:9;3935:7;3931:23;3927:32;3924:2;;;3972:1;3969;3962:12;3924:2;4015:1;4040:61;4093:7;4084:6;4073:9;4069:22;4040:61;:::i;:::-;4030:71;;3986:125;3914:204;;;;:::o;4124:292::-;;4247:2;4235:9;4226:7;4222:23;4218:32;4215:2;;;4263:1;4260;4253:12;4215:2;4306:1;4331:68;4391:7;4382:6;4371:9;4367:22;4331:68;:::i;:::-;4321:78;;4277:132;4205:211;;;;:::o;4422:284::-;;4541:2;4529:9;4520:7;4516:23;4512:32;4509:2;;;4557:1;4554;4547:12;4509:2;4600:1;4625:64;4681:7;4672:6;4661:9;4657:22;4625:64;:::i;:::-;4615:74;;4571:128;4499:207;;;;:::o;4712:118::-;4799:24;4817:5;4799:24;:::i;:::-;4794:3;4787:37;4777:53;;:::o;4836:109::-;4917:21;4932:5;4917:21;:::i;:::-;4912:3;4905:34;4895:50;;:::o;4951:118::-;5038:24;5056:5;5038:24;:::i;:::-;5033:3;5026:37;5016:53;;:::o;5075:157::-;5180:45;5200:24;5218:5;5200:24;:::i;:::-;5180:45;:::i;:::-;5175:3;5168:58;5158:74;;:::o;5238:364::-;;5354:39;5387:5;5354:39;:::i;:::-;5409:71;5473:6;5468:3;5409:71;:::i;:::-;5402:78;;5489:52;5534:6;5529:3;5522:4;5515:5;5511:16;5489:52;:::i;:::-;5566:29;5588:6;5566:29;:::i;:::-;5561:3;5557:39;5550:46;;5330:272;;;;;:::o;5608:322::-;;5771:67;5835:2;5830:3;5771:67;:::i;:::-;5764:74;;5868:26;5864:1;5859:3;5855:11;5848:47;5921:2;5916:3;5912:12;5905:19;;5754:176;;;:::o;5936:367::-;;6099:67;6163:2;6158:3;6099:67;:::i;:::-;6092:74;;6196:34;6192:1;6187:3;6183:11;6176:55;6262:5;6257:2;6252:3;6248:12;6241:27;6294:2;6289:3;6285:12;6278:19;;6082:221;;;:::o;6309:318::-;;6472:67;6536:2;6531:3;6472:67;:::i;:::-;6465:74;;6569:22;6565:1;6560:3;6556:11;6549:43;6618:2;6613:3;6609:12;6602:19;;6455:172;;;:::o;6633:313::-;;6796:67;6860:2;6855:3;6796:67;:::i;:::-;6789:74;;6893:17;6889:1;6884:3;6880:11;6873:38;6937:2;6932:3;6928:12;6921:19;;6779:167;;;:::o;6952:329::-;;7115:67;7179:2;7174:3;7115:67;:::i;:::-;7108:74;;7212:33;7208:1;7203:3;7199:11;7192:54;7272:2;7267:3;7263:12;7256:19;;7098:183;;;:::o;7287:370::-;;7450:67;7514:2;7509:3;7450:67;:::i;:::-;7443:74;;7547:34;7543:1;7538:3;7534:11;7527:55;7613:8;7608:2;7603:3;7599:12;7592:30;7648:2;7643:3;7639:12;7632:19;;7433:224;;;:::o;7663:366::-;;7826:67;7890:2;7885:3;7826:67;:::i;:::-;7819:74;;7923:34;7919:1;7914:3;7910:11;7903:55;7989:4;7984:2;7979:3;7975:12;7968:26;8020:2;8015:3;8011:12;8004:19;;7809:220;;;:::o;8035:396::-;;8216:84;8298:1;8293:3;8216:84;:::i;:::-;8209:91;;8330:66;8326:1;8321:3;8317:11;8310:87;8423:1;8418:3;8414:11;8407:18;;8199:232;;;:::o;8437:327::-;;8600:67;8664:2;8659:3;8600:67;:::i;:::-;8593:74;;8697:31;8693:1;8688:3;8684:11;8677:52;8755:2;8750:3;8746:12;8739:19;;8583:181;;;:::o;8770:370::-;;8933:67;8997:2;8992:3;8933:67;:::i;:::-;8926:74;;9030:34;9026:1;9021:3;9017:11;9010:55;9096:8;9091:2;9086:3;9082:12;9075:30;9131:2;9126:3;9122:12;9115:19;;8916:224;;;:::o;9146:366::-;;9309:67;9373:2;9368:3;9309:67;:::i;:::-;9302:74;;9406:34;9402:1;9397:3;9393:11;9386:55;9472:4;9467:2;9462:3;9458:12;9451:26;9503:2;9498:3;9494:12;9487:19;;9292:220;;;:::o;9518:325::-;;9681:67;9745:2;9740:3;9681:67;:::i;:::-;9674:74;;9778:29;9774:1;9769:3;9765:11;9758:50;9834:2;9829:3;9825:12;9818:19;;9664:179;;;:::o;9849:314::-;;10012:67;10076:2;10071:3;10012:67;:::i;:::-;10005:74;;10109:18;10105:1;10100:3;10096:11;10089:39;10154:2;10149:3;10145:12;10138:19;;9995:168;;;:::o;10169:317::-;;10332:67;10396:2;10391:3;10332:67;:::i;:::-;10325:74;;10429:21;10425:1;10420:3;10416:11;10409:42;10477:2;10472:3;10468:12;10461:19;;10315:171;;;:::o;10492:366::-;;10655:67;10719:2;10714:3;10655:67;:::i;:::-;10648:74;;10752:34;10748:1;10743:3;10739:11;10732:55;10818:4;10813:2;10808:3;10804:12;10797:26;10849:2;10844:3;10840:12;10833:19;;10638:220;;;:::o;10864:328::-;;11027:67;11091:2;11086:3;11027:67;:::i;:::-;11020:74;;11124:32;11120:1;11115:3;11111:11;11104:53;11183:2;11178:3;11174:12;11167:19;;11010:182;;;:::o;11198:372::-;;11361:67;11425:2;11420:3;11361:67;:::i;:::-;11354:74;;11458:34;11454:1;11449:3;11445:11;11438:55;11524:10;11519:2;11514:3;11510:12;11503:32;11561:2;11556:3;11552:12;11545:19;;11344:226;;;:::o;11576:330::-;;11739:67;11803:2;11798:3;11739:67;:::i;:::-;11732:74;;11836:34;11832:1;11827:3;11823:11;11816:55;11897:2;11892:3;11888:12;11881:19;;11722:184;;;:::o;11912:369::-;;12075:67;12139:2;12134:3;12075:67;:::i;:::-;12068:74;;12172:34;12168:1;12163:3;12159:11;12152:55;12238:7;12233:2;12228:3;12224:12;12217:29;12272:2;12267:3;12263:12;12256:19;;12058:223;;;:::o;12287:368::-;;12450:67;12514:2;12509:3;12450:67;:::i;:::-;12443:74;;12547:34;12543:1;12538:3;12534:11;12527:55;12613:6;12608:2;12603:3;12599:12;12592:28;12646:2;12641:3;12637:12;12630:19;;12433:222;;;:::o;12661:369::-;;12824:67;12888:2;12883:3;12824:67;:::i;:::-;12817:74;;12921:34;12917:1;12912:3;12908:11;12901:55;12987:7;12982:2;12977:3;12973:12;12966:29;13021:2;13016:3;13012:12;13005:19;;12807:223;;;:::o;13036:329::-;;13199:67;13263:2;13258:3;13199:67;:::i;:::-;13192:74;;13296:33;13292:1;13287:3;13283:11;13276:54;13356:2;13351:3;13347:12;13340:19;;13182:183;;;:::o;13371:374::-;;13534:67;13598:2;13593:3;13534:67;:::i;:::-;13527:74;;13631:34;13627:1;13622:3;13618:11;13611:55;13697:12;13692:2;13687:3;13683:12;13676:34;13736:2;13731:3;13727:12;13720:19;;13517:228;;;:::o;13751:118::-;13838:24;13856:5;13838:24;:::i;:::-;13833:3;13826:37;13816:53;;:::o;13875:112::-;13958:22;13974:5;13958:22;:::i;:::-;13953:3;13946:35;13936:51;;:::o;13993:663::-;;14256:148;14400:3;14256:148;:::i;:::-;14249:155;;14414:75;14485:3;14476:6;14414:75;:::i;:::-;14514:2;14509:3;14505:12;14498:19;;14527:75;14598:3;14589:6;14527:75;:::i;:::-;14627:2;14622:3;14618:12;14611:19;;14647:3;14640:10;;14238:418;;;;;:::o;14662:222::-;;14793:2;14782:9;14778:18;14770:26;;14806:71;14874:1;14863:9;14859:17;14850:6;14806:71;:::i;:::-;14760:124;;;;:::o;14890:332::-;;15049:2;15038:9;15034:18;15026:26;;15062:71;15130:1;15119:9;15115:17;15106:6;15062:71;:::i;:::-;15143:72;15211:2;15200:9;15196:18;15187:6;15143:72;:::i;:::-;15016:206;;;;;:::o;15228:210::-;;15353:2;15342:9;15338:18;15330:26;;15366:65;15428:1;15417:9;15413:17;15404:6;15366:65;:::i;:::-;15320:118;;;;:::o;15444:222::-;;15575:2;15564:9;15560:18;15552:26;;15588:71;15656:1;15645:9;15641:17;15632:6;15588:71;:::i;:::-;15542:124;;;;:::o;15672:775::-;;15943:3;15932:9;15928:19;15920:27;;15957:71;16025:1;16014:9;16010:17;16001:6;15957:71;:::i;:::-;16038:72;16106:2;16095:9;16091:18;16082:6;16038:72;:::i;:::-;16120;16188:2;16177:9;16173:18;16164:6;16120:72;:::i;:::-;16202;16270:2;16259:9;16255:18;16246:6;16202:72;:::i;:::-;16284:73;16352:3;16341:9;16337:19;16328:6;16284:73;:::i;:::-;16367;16435:3;16424:9;16420:19;16411:6;16367:73;:::i;:::-;15910:537;;;;;;;;;:::o;16453:664::-;;16696:3;16685:9;16681:19;16673:27;;16710:71;16778:1;16767:9;16763:17;16754:6;16710:71;:::i;:::-;16791:72;16859:2;16848:9;16844:18;16835:6;16791:72;:::i;:::-;16873;16941:2;16930:9;16926:18;16917:6;16873:72;:::i;:::-;16955;17023:2;17012:9;17008:18;16999:6;16955:72;:::i;:::-;17037:73;17105:3;17094:9;17090:19;17081:6;17037:73;:::i;:::-;16663:454;;;;;;;;:::o;17123:545::-;;17334:3;17323:9;17319:19;17311:27;;17348:71;17416:1;17405:9;17401:17;17392:6;17348:71;:::i;:::-;17429:68;17493:2;17482:9;17478:18;17469:6;17429:68;:::i;:::-;17507:72;17575:2;17564:9;17560:18;17551:6;17507:72;:::i;:::-;17589;17657:2;17646:9;17642:18;17633:6;17589:72;:::i;:::-;17301:367;;;;;;;:::o;17674:313::-;;17825:2;17814:9;17810:18;17802:26;;17874:9;17868:4;17864:20;17860:1;17849:9;17845:17;17838:47;17902:78;17975:4;17966:6;17902:78;:::i;:::-;17894:86;;17792:195;;;;:::o;17993:419::-;;18197:2;18186:9;18182:18;18174:26;;18246:9;18240:4;18236:20;18232:1;18221:9;18217:17;18210:47;18274:131;18400:4;18274:131;:::i;:::-;18266:139;;18164:248;;;:::o;18418:419::-;;18622:2;18611:9;18607:18;18599:26;;18671:9;18665:4;18661:20;18657:1;18646:9;18642:17;18635:47;18699:131;18825:4;18699:131;:::i;:::-;18691:139;;18589:248;;;:::o;18843:419::-;;19047:2;19036:9;19032:18;19024:26;;19096:9;19090:4;19086:20;19082:1;19071:9;19067:17;19060:47;19124:131;19250:4;19124:131;:::i;:::-;19116:139;;19014:248;;;:::o;19268:419::-;;19472:2;19461:9;19457:18;19449:26;;19521:9;19515:4;19511:20;19507:1;19496:9;19492:17;19485:47;19549:131;19675:4;19549:131;:::i;:::-;19541:139;;19439:248;;;:::o;19693:419::-;;19897:2;19886:9;19882:18;19874:26;;19946:9;19940:4;19936:20;19932:1;19921:9;19917:17;19910:47;19974:131;20100:4;19974:131;:::i;:::-;19966:139;;19864:248;;;:::o;20118:419::-;;20322:2;20311:9;20307:18;20299:26;;20371:9;20365:4;20361:20;20357:1;20346:9;20342:17;20335:47;20399:131;20525:4;20399:131;:::i;:::-;20391:139;;20289:248;;;:::o;20543:419::-;;20747:2;20736:9;20732:18;20724:26;;20796:9;20790:4;20786:20;20782:1;20771:9;20767:17;20760:47;20824:131;20950:4;20824:131;:::i;:::-;20816:139;;20714:248;;;:::o;20968:419::-;;21172:2;21161:9;21157:18;21149:26;;21221:9;21215:4;21211:20;21207:1;21196:9;21192:17;21185:47;21249:131;21375:4;21249:131;:::i;:::-;21241:139;;21139:248;;;:::o;21393:419::-;;21597:2;21586:9;21582:18;21574:26;;21646:9;21640:4;21636:20;21632:1;21621:9;21617:17;21610:47;21674:131;21800:4;21674:131;:::i;:::-;21666:139;;21564:248;;;:::o;21818:419::-;;22022:2;22011:9;22007:18;21999:26;;22071:9;22065:4;22061:20;22057:1;22046:9;22042:17;22035:47;22099:131;22225:4;22099:131;:::i;:::-;22091:139;;21989:248;;;:::o;22243:419::-;;22447:2;22436:9;22432:18;22424:26;;22496:9;22490:4;22486:20;22482:1;22471:9;22467:17;22460:47;22524:131;22650:4;22524:131;:::i;:::-;22516:139;;22414:248;;;:::o;22668:419::-;;22872:2;22861:9;22857:18;22849:26;;22921:9;22915:4;22911:20;22907:1;22896:9;22892:17;22885:47;22949:131;23075:4;22949:131;:::i;:::-;22941:139;;22839:248;;;:::o;23093:419::-;;23297:2;23286:9;23282:18;23274:26;;23346:9;23340:4;23336:20;23332:1;23321:9;23317:17;23310:47;23374:131;23500:4;23374:131;:::i;:::-;23366:139;;23264:248;;;:::o;23518:419::-;;23722:2;23711:9;23707:18;23699:26;;23771:9;23765:4;23761:20;23757:1;23746:9;23742:17;23735:47;23799:131;23925:4;23799:131;:::i;:::-;23791:139;;23689:248;;;:::o;23943:419::-;;24147:2;24136:9;24132:18;24124:26;;24196:9;24190:4;24186:20;24182:1;24171:9;24167:17;24160:47;24224:131;24350:4;24224:131;:::i;:::-;24216:139;;24114:248;;;:::o;24368:419::-;;24572:2;24561:9;24557:18;24549:26;;24621:9;24615:4;24611:20;24607:1;24596:9;24592:17;24585:47;24649:131;24775:4;24649:131;:::i;:::-;24641:139;;24539:248;;;:::o;24793:419::-;;24997:2;24986:9;24982:18;24974:26;;25046:9;25040:4;25036:20;25032:1;25021:9;25017:17;25010:47;25074:131;25200:4;25074:131;:::i;:::-;25066:139;;24964:248;;;:::o;25218:419::-;;25422:2;25411:9;25407:18;25399:26;;25471:9;25465:4;25461:20;25457:1;25446:9;25442:17;25435:47;25499:131;25625:4;25499:131;:::i;:::-;25491:139;;25389:248;;;:::o;25643:419::-;;25847:2;25836:9;25832:18;25824:26;;25896:9;25890:4;25886:20;25882:1;25871:9;25867:17;25860:47;25924:131;26050:4;25924:131;:::i;:::-;25916:139;;25814:248;;;:::o;26068:419::-;;26272:2;26261:9;26257:18;26249:26;;26321:9;26315:4;26311:20;26307:1;26296:9;26292:17;26285:47;26349:131;26475:4;26349:131;:::i;:::-;26341:139;;26239:248;;;:::o;26493:419::-;;26697:2;26686:9;26682:18;26674:26;;26746:9;26740:4;26736:20;26732:1;26721:9;26717:17;26710:47;26774:131;26900:4;26774:131;:::i;:::-;26766:139;;26664:248;;;:::o;26918:419::-;;27122:2;27111:9;27107:18;27099:26;;27171:9;27165:4;27161:20;27157:1;27146:9;27142:17;27135:47;27199:131;27325:4;27199:131;:::i;:::-;27191:139;;27089:248;;;:::o;27343:222::-;;27474:2;27463:9;27459:18;27451:26;;27487:71;27555:1;27544:9;27540:17;27531:6;27487:71;:::i;:::-;27441:124;;;;:::o;27571:214::-;;27698:2;27687:9;27683:18;27675:26;;27711:67;27775:1;27764:9;27760:17;27751:6;27711:67;:::i;:::-;27665:120;;;;:::o;27791:99::-;;27877:5;27871:12;27861:22;;27850:40;;;:::o;27896:169::-;;28014:6;28009:3;28002:19;28054:4;28049:3;28045:14;28030:29;;27992:73;;;;:::o;28071:148::-;;28210:3;28195:18;;28185:34;;;;:::o;28225:305::-;;28284:20;28302:1;28284:20;:::i;:::-;28279:25;;28318:20;28336:1;28318:20;:::i;:::-;28313:25;;28472:1;28404:66;28400:74;28397:1;28394:81;28391:2;;;28478:18;;:::i;:::-;28391:2;28522:1;28519;28515:9;28508:16;;28269:261;;;;:::o;28536:96::-;;28602:24;28620:5;28602:24;:::i;:::-;28591:35;;28581:51;;;:::o;28638:90::-;;28715:5;28708:13;28701:21;28690:32;;28680:48;;;:::o;28734:77::-;;28800:5;28789:16;;28779:32;;;:::o;28817:111::-;;28898:24;28916:5;28898:24;:::i;:::-;28887:35;;28877:51;;;:::o;28934:126::-;;29011:42;29004:5;29000:54;28989:65;;28979:81;;;:::o;29066:77::-;;29132:5;29121:16;;29111:32;;;:::o;29149:86::-;;29224:4;29217:5;29213:16;29202:27;;29192:43;;;:::o;29241:307::-;29309:1;29319:113;29333:6;29330:1;29327:13;29319:113;;;29418:1;29413:3;29409:11;29403:18;29399:1;29394:3;29390:11;29383:39;29355:2;29352:1;29348:10;29343:15;;29319:113;;;29450:6;29447:1;29444:13;29441:2;;;29530:1;29521:6;29516:3;29512:16;29505:27;29441:2;29290:258;;;;:::o;29554:320::-;;29635:1;29629:4;29625:12;29615:22;;29682:1;29676:4;29672:12;29703:18;29693:2;;29759:4;29751:6;29747:17;29737:27;;29693:2;29821;29813:6;29810:14;29790:18;29787:38;29784:2;;;29840:18;;:::i;:::-;29784:2;29605:269;;;;:::o;29880:79::-;;29948:5;29937:16;;29927:32;;;:::o;29965:180::-;30013:77;30010:1;30003:88;30110:4;30107:1;30100:15;30134:4;30131:1;30124:15;30151:180;30199:77;30196:1;30189:88;30296:4;30293:1;30286:15;30320:4;30317:1;30310:15;30337:102;;30429:2;30425:7;30420:2;30413:5;30409:14;30405:28;30395:38;;30385:54;;;:::o;30445:122::-;30518:24;30536:5;30518:24;:::i;:::-;30511:5;30508:35;30498:2;;30557:1;30554;30547:12;30498:2;30488:79;:::o;30573:116::-;30643:21;30658:5;30643:21;:::i;:::-;30636:5;30633:32;30623:2;;30679:1;30676;30669:12;30623:2;30613:76;:::o;30695:122::-;30768:24;30786:5;30768:24;:::i;:::-;30761:5;30758:35;30748:2;;30807:1;30804;30797:12;30748:2;30738:79;:::o;30823:152::-;30911:39;30944:5;30911:39;:::i;:::-;30904:5;30901:50;30891:2;;30965:1;30962;30955:12;30891:2;30881:94;:::o;30981:122::-;31054:24;31072:5;31054:24;:::i;:::-;31047:5;31044:35;31034:2;;31093:1;31090;31083:12;31034:2;31024:79;:::o;31109:118::-;31180:22;31196:5;31180:22;:::i;:::-;31173:5;31170:33;31160:2;;31217:1;31214;31207:12;31160:2;31150:77;:::o
Swarm Source
ipfs://43d5f46c62c18fd26d68fffc834267a42531c883f055b55d821f2196f3aa9384
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
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.