Polygon Sponsored slots available. Book your slot here!
ERC-20
Overview
Max Total Supply
19,347,953.765669722203705168 XMT
Holders
3,288 (0.00%)
Market
Price
$0.0147 @ 0.020507 POL (+12.49%)
Onchain Market Cap
$285,198.32
Circulating Supply Market Cap
$0.00
Other Info
Token Contract (WITH 18 Decimals)
Balance
330.574275191066949363 XMTValue
$4.87 ( ~6.7752 POL) [0.0017%]Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
MetalSwap
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-03-31 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/math/SafeCast.sol // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) pragma solidity ^0.8.0; /** * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow * checks. * * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can * easily result in undesired exploitation or bugs, since developers usually * assume that overflows raise errors. `SafeCast` restores this intuition by * reverting the transaction when such an operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. * * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing * all math on `uint256` and `int256` and then downcasting. */ library SafeCast { /** * @dev Returns the downcasted uint224 from uint256, reverting on * overflow (when the input is greater than largest uint224). * * Counterpart to Solidity's `uint224` operator. * * Requirements: * * - input must fit into 224 bits */ function toUint224(uint256 value) internal pure returns (uint224) { require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); return uint224(value); } /** * @dev Returns the downcasted uint128 from uint256, reverting on * overflow (when the input is greater than largest uint128). * * Counterpart to Solidity's `uint128` operator. * * Requirements: * * - input must fit into 128 bits */ function toUint128(uint256 value) internal pure returns (uint128) { require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); return uint128(value); } /** * @dev Returns the downcasted uint96 from uint256, reverting on * overflow (when the input is greater than largest uint96). * * Counterpart to Solidity's `uint96` operator. * * Requirements: * * - input must fit into 96 bits */ function toUint96(uint256 value) internal pure returns (uint96) { require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); return uint96(value); } /** * @dev Returns the downcasted uint64 from uint256, reverting on * overflow (when the input is greater than largest uint64). * * Counterpart to Solidity's `uint64` operator. * * Requirements: * * - input must fit into 64 bits */ function toUint64(uint256 value) internal pure returns (uint64) { require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); return uint64(value); } /** * @dev Returns the downcasted uint32 from uint256, reverting on * overflow (when the input is greater than largest uint32). * * Counterpart to Solidity's `uint32` operator. * * Requirements: * * - input must fit into 32 bits */ function toUint32(uint256 value) internal pure returns (uint32) { require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); return uint32(value); } /** * @dev Returns the downcasted uint16 from uint256, reverting on * overflow (when the input is greater than largest uint16). * * Counterpart to Solidity's `uint16` operator. * * Requirements: * * - input must fit into 16 bits */ function toUint16(uint256 value) internal pure returns (uint16) { require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); return uint16(value); } /** * @dev Returns the downcasted uint8 from uint256, reverting on * overflow (when the input is greater than largest uint8). * * Counterpart to Solidity's `uint8` operator. * * Requirements: * * - input must fit into 8 bits. */ function toUint8(uint256 value) internal pure returns (uint8) { require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); return uint8(value); } /** * @dev Converts a signed int256 into an unsigned uint256. * * Requirements: * * - input must be greater than or equal to 0. */ function toUint256(int256 value) internal pure returns (uint256) { require(value >= 0, "SafeCast: value must be positive"); return uint256(value); } /** * @dev Returns the downcasted int128 from int256, reverting on * overflow (when the input is less than smallest int128 or * greater than largest int128). * * Counterpart to Solidity's `int128` operator. * * Requirements: * * - input must fit into 128 bits * * _Available since v3.1._ */ function toInt128(int256 value) internal pure returns (int128) { require(value >= type(int128).min && value <= type(int128).max, "SafeCast: value doesn't fit in 128 bits"); return int128(value); } /** * @dev Returns the downcasted int64 from int256, reverting on * overflow (when the input is less than smallest int64 or * greater than largest int64). * * Counterpart to Solidity's `int64` operator. * * Requirements: * * - input must fit into 64 bits * * _Available since v3.1._ */ function toInt64(int256 value) internal pure returns (int64) { require(value >= type(int64).min && value <= type(int64).max, "SafeCast: value doesn't fit in 64 bits"); return int64(value); } /** * @dev Returns the downcasted int32 from int256, reverting on * overflow (when the input is less than smallest int32 or * greater than largest int32). * * Counterpart to Solidity's `int32` operator. * * Requirements: * * - input must fit into 32 bits * * _Available since v3.1._ */ function toInt32(int256 value) internal pure returns (int32) { require(value >= type(int32).min && value <= type(int32).max, "SafeCast: value doesn't fit in 32 bits"); return int32(value); } /** * @dev Returns the downcasted int16 from int256, reverting on * overflow (when the input is less than smallest int16 or * greater than largest int16). * * Counterpart to Solidity's `int16` operator. * * Requirements: * * - input must fit into 16 bits * * _Available since v3.1._ */ function toInt16(int256 value) internal pure returns (int16) { require(value >= type(int16).min && value <= type(int16).max, "SafeCast: value doesn't fit in 16 bits"); return int16(value); } /** * @dev Returns the downcasted int8 from int256, reverting on * overflow (when the input is less than smallest int8 or * greater than largest int8). * * Counterpart to Solidity's `int8` operator. * * Requirements: * * - input must fit into 8 bits. * * _Available since v3.1._ */ function toInt8(int256 value) internal pure returns (int8) { require(value >= type(int8).min && value <= type(int8).max, "SafeCast: value doesn't fit in 8 bits"); return int8(value); } /** * @dev Converts an unsigned uint256 into a signed int256. * * Requirements: * * - input must be less than or equal to maxInt256. */ function toInt256(uint256 value) internal pure returns (int256) { // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); return int256(value); } } // File: @openzeppelin/contracts/governance/utils/IVotes.sol // OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol) pragma solidity ^0.8.0; /** * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts. * * _Available since v4.5._ */ interface IVotes { /** * @dev Emitted when an account changes their delegate. */ event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); /** * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes. */ event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance); /** * @dev Returns the current amount of votes that `account` has. */ function getVotes(address account) external view returns (uint256); /** * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`). */ function getPastVotes(address account, uint256 blockNumber) external view returns (uint256); /** * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`). * * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes. * Votes that have not been delegated are still part of total supply, even though they would not participate in a * vote. */ function getPastTotalSupply(uint256 blockNumber) external view returns (uint256); /** * @dev Returns the delegate that `account` has chosen. */ function delegates(address account) external view returns (address); /** * @dev Delegates votes from the sender to `delegatee`. */ function delegate(address delegatee) external; /** * @dev Delegates votes from signer to `delegatee`. */ function delegateBySig( address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s ) external; } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a / b + (a % b == 0 ? 0 : 1); } } // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (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/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (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 (last updated v4.5.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 = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 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: @openzeppelin/contracts/utils/cryptography/draft-EIP712.sol // OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-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 immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; address private immutable _CACHED_THIS; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _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]. */ constructor(string memory name, string memory version) { 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); _CACHED_THIS = address(this); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _CACHED_THIS && 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.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.5.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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, 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.1 (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: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/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 Contracts guidelines: functions revert * instead 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. */ constructor(string memory name_, string memory symbol_) { _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: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, 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}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, 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}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, 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) { address owner = _msgSender(); _approve(owner, spender, _allowances[owner][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) { address owner = _msgSender(); uint256 currentAllowance = _allowances[owner][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, 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: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, 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 Spend `amount` form the allowance of `owner` toward `spender`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - 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: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { _spendAllowance(account, _msgSender(), amount); _burn(account, amount); } } // File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol // OpenZeppelin Contracts v4.4.1 (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/token/ERC20/extensions/draft-ERC20Permit.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-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. */ constructor(string memory name) EIP712(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: @openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Votes.sol) pragma solidity ^0.8.0; /** * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's, * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1. * * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module. * * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting * power can be queried through the public accessors {getVotes} and {getPastVotes}. * * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked. * * _Available since v4.2._ */ abstract contract ERC20Votes is IVotes, ERC20Permit { struct Checkpoint { uint32 fromBlock; uint224 votes; } bytes32 private constant _DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); mapping(address => address) private _delegates; mapping(address => Checkpoint[]) private _checkpoints; Checkpoint[] private _totalSupplyCheckpoints; /** * @dev Get the `pos`-th checkpoint for `account`. */ function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) { return _checkpoints[account][pos]; } /** * @dev Get number of checkpoints for `account`. */ function numCheckpoints(address account) public view virtual returns (uint32) { return SafeCast.toUint32(_checkpoints[account].length); } /** * @dev Get the address `account` is currently delegating to. */ function delegates(address account) public view virtual override returns (address) { return _delegates[account]; } /** * @dev Gets the current votes balance for `account` */ function getVotes(address account) public view virtual override returns (uint256) { uint256 pos = _checkpoints[account].length; return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes; } /** * @dev Retrieve the number of votes for `account` at the end of `blockNumber`. * * Requirements: * * - `blockNumber` must have been already mined */ function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) { require(blockNumber < block.number, "ERC20Votes: block not yet mined"); return _checkpointsLookup(_checkpoints[account], blockNumber); } /** * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. * It is but NOT the sum of all the delegated votes! * * Requirements: * * - `blockNumber` must have been already mined */ function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) { require(blockNumber < block.number, "ERC20Votes: block not yet mined"); return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber); } /** * @dev Lookup a value in a list of (sorted) checkpoints. */ function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) { // We run a binary search to look for the earliest checkpoint taken after `blockNumber`. // // During the loop, the index of the wanted checkpoint remains in the range [low-1, high). // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant. // - If the middle checkpoint is after `blockNumber`, we look in [low, mid) // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high) // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not // out of bounds (in which case we're looking too far in the past and the result is 0). // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out // the same. uint256 high = ckpts.length; uint256 low = 0; while (low < high) { uint256 mid = Math.average(low, high); if (ckpts[mid].fromBlock > blockNumber) { high = mid; } else { low = mid + 1; } } return high == 0 ? 0 : ckpts[high - 1].votes; } /** * @dev Delegate votes from the sender to `delegatee`. */ function delegate(address delegatee) public virtual override { _delegate(_msgSender(), delegatee); } /** * @dev Delegates votes from signer to `delegatee` */ function delegateBySig( address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s ) public virtual override { require(block.timestamp <= expiry, "ERC20Votes: signature expired"); address signer = ECDSA.recover( _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))), v, r, s ); require(nonce == _useNonce(signer), "ERC20Votes: invalid nonce"); _delegate(signer, delegatee); } /** * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1). */ function _maxSupply() internal view virtual returns (uint224) { return type(uint224).max; } /** * @dev Snapshots the totalSupply after it has been increased. */ function _mint(address account, uint256 amount) internal virtual override { super._mint(account, amount); require(totalSupply() <= _maxSupply(), "ERC20Votes: total supply risks overflowing votes"); _writeCheckpoint(_totalSupplyCheckpoints, _add, amount); } /** * @dev Snapshots the totalSupply after it has been decreased. */ function _burn(address account, uint256 amount) internal virtual override { super._burn(account, amount); _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount); } /** * @dev Move voting power when tokens are transferred. * * Emits a {DelegateVotesChanged} event. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual override { super._afterTokenTransfer(from, to, amount); _moveVotingPower(delegates(from), delegates(to), amount); } /** * @dev Change delegation for `delegator` to `delegatee`. * * Emits events {DelegateChanged} and {DelegateVotesChanged}. */ function _delegate(address delegator, address delegatee) internal virtual { address currentDelegate = delegates(delegator); uint256 delegatorBalance = balanceOf(delegator); _delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveVotingPower(currentDelegate, delegatee, delegatorBalance); } function _moveVotingPower( address src, address dst, uint256 amount ) private { if (src != dst && amount > 0) { if (src != address(0)) { (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount); emit DelegateVotesChanged(src, oldWeight, newWeight); } if (dst != address(0)) { (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount); emit DelegateVotesChanged(dst, oldWeight, newWeight); } } } function _writeCheckpoint( Checkpoint[] storage ckpts, function(uint256, uint256) view returns (uint256) op, uint256 delta ) private returns (uint256 oldWeight, uint256 newWeight) { uint256 pos = ckpts.length; oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes; newWeight = op(oldWeight, delta); if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) { ckpts[pos - 1].votes = SafeCast.toUint224(newWeight); } else { ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)})); } } function _add(uint256 a, uint256 b) private pure returns (uint256) { return a + b; } function _subtract(uint256 a, uint256 b) private pure returns (uint256) { return a - b; } } // File: contracts/XMT_Polygon.sol pragma solidity ^0.8.7; interface IApprovalReceiver { function onTokenApproval(address, uint, bytes calldata) external returns (bool); } interface ITransferReceiver { function onTokenTransfer(address, uint, bytes calldata) external returns (bool); } contract MetalSwap is ERC20, ERC20Permit, ERC20Votes, ERC20Burnable { // set of minters, can be this bridge or other bridges mapping(address => bool) public isMinter; address[] public minters; bytes32 public constant PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 public constant TRANSFER_TYPEHASH = keccak256("Transfer(address owner,address to,uint256 value,uint256 nonce,uint256 deadline)"); // flag to enable/disable swapout vs vault.burn so multiple events are triggered bool private _vaultOnly; address public vault; uint public delay = 0; address public pendingMinter; uint public delayMinter; address public pendingVault; uint public delayVault; bool private _init; event LogChangeVault(address indexed oldVault, address indexed newVault, uint indexed effectiveTime); event LogSwapin(bytes32 indexed txhash, address indexed account, uint amount); event LogSwapout(address indexed account, address indexed bindaddr, uint amount); constructor (address _vault) ERC20("MetalSwap", "XMT") ERC20Permit("MetalSwap") { // Use init to allow for CREATE2 accross all chains _init = true; // Disable/Enable swapout for v1 tokens vs mint/burn for v3 tokens _vaultOnly = false; vault = _vault; pendingVault = _vault; delayVault = block.timestamp; } function changeDelay(uint256 newDelay) public onlyVault { delay = newDelay; } // The functions below are overrides required by Solidity. function _afterTokenTransfer(address from, address to, uint256 amount) internal override(ERC20, ERC20Votes) { super._afterTokenTransfer(from, to, amount); } function _mint(address to, uint256 amount) internal override(ERC20, ERC20Votes) { super._mint(to, amount); } function _burn(address account, uint256 amount) internal override(ERC20, ERC20Votes) { super._burn(account, amount); } function burn(address from, uint256 amount) external onlyAuth returns (bool) { require(from != address(0), "AnyswapV3ERC20: address(0x0)"); _burn(from, amount); return true; } function Swapin(bytes32 txhash, address account, uint256 amount) public onlyAuth returns (bool) { _mint(account, amount); emit LogSwapin(txhash, account, amount); return true; } function Swapout(uint256 amount, address bindaddr) public returns (bool) { require(!_vaultOnly, "AnyswapV4ERC20: onlyAuth"); require(bindaddr != address(0), "AnyswapV3ERC20: address(0x0)"); _burn(msg.sender, amount); emit LogSwapout(msg.sender, bindaddr, amount); return true; } function mint(address to, uint256 amount) external onlyAuth returns (bool) { _mint(to, amount); return true; } function mpc() public view returns (address) { if (block.timestamp >= delayVault) { return pendingVault; } return vault; } function owner() public view returns (address) { return mpc(); } function setVaultOnly(bool enabled) external onlyVault { _vaultOnly = enabled; } function initVault(address _vault) external onlyVault { require(_init); vault = _vault; pendingVault = _vault; isMinter[_vault] = true; minters.push(_vault); delayVault = block.timestamp; _init = false; } function setVault(address _vault) external onlyVault { require(_vault != address(0), "AnyswapV3ERC20: address(0x0)"); pendingVault = _vault; delayVault = block.timestamp + delay; } function applyVault() external onlyVault { require(block.timestamp >= delayVault); vault = pendingVault; } function setMinter(address _auth) external onlyVault { require(_auth != address(0), "AnyswapV3ERC20: address(0x0)"); pendingMinter = _auth; delayMinter = block.timestamp + delay; } function applyMinter() external onlyVault { require(block.timestamp >= delayMinter); isMinter[pendingMinter] = true; minters.push(pendingMinter); } // No time delay revoke minter emergency function function revokeMinter(address _auth) external onlyVault { isMinter[_auth] = false; } function getAllMinters() external view returns (address[] memory) { return minters; } function changeVault(address newVault) external onlyVault returns (bool) { require(newVault != address(0), "AnyswapV3ERC20: address(0x0)"); vault = newVault; pendingVault = newVault; emit LogChangeVault(vault, pendingVault, block.timestamp); return true; } function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool) { _approve(msg.sender, spender, value); return IApprovalReceiver(spender).onTokenApproval(msg.sender, value, data); } /// @dev Sets `value` as allowance of `spender` account over `owner` account's AnyswapV3ERC20 token, given `owner` account's signed approval. /// Emits {Approval} event. /// Requirements: /// - `deadline` must be timestamp in future. /// - `v`, `r` and `s` must be valid `secp256k1` signature from `owner` account over EIP712-formatted function arguments. /// - the signature must use `owner` account's current nonce (see {nonces}). /// - the signer cannot be zero address and must be `owner` account. /// For more information on signature format, see https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP section]. /// AnyswapV3ERC20 token implementation adapted from https://github.com/albertocuestacanada/ERC20Permit/blob/master/contracts/ERC20Permit.sol. function permit(address target, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public override { require(block.timestamp <= deadline, "AnyswapV3ERC20: Expired permit"); bytes32 hashStruct = keccak256( abi.encode( PERMIT_TYPEHASH, target, spender, value, _useNonce(target), deadline)); require(verifyEIP712(target, hashStruct, v, r, s) || verifyPersonalSign(target, hashStruct, v, r, s)); // _approve(owner, spender, value); _approve(msg.sender, spender, value); } function transferWithPermit(address target, address to, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public returns (bool) { require(block.timestamp <= deadline, "AnyswapV3ERC20: Expired permit"); bytes32 hashStruct = keccak256( abi.encode( TRANSFER_TYPEHASH, target, to, value, _useNonce(target), deadline)); require(verifyEIP712(target, hashStruct, v, r, s) || verifyPersonalSign(target, hashStruct, v, r, s)); require(to != address(0) || to != address(this)); super.transfer(to, value); return true; } function transferAndCall(address to, uint value, bytes calldata data) external returns (bool) { require(to != address(0) || to != address(this)); super.transfer(to, value); return ITransferReceiver(to).onTokenTransfer(msg.sender, value, data); } function verifyEIP712(address target, bytes32 hashStruct, uint8 v, bytes32 r, bytes32 s) internal view returns (bool) { bytes32 hash = keccak256( abi.encodePacked( "\x19\x01", _domainSeparatorV4(), hashStruct)); address signer = ecrecover(hash, v, r, s); return (signer != address(0) && signer == target); } function verifyPersonalSign(address target, bytes32 hashStruct, uint8 v, bytes32 r, bytes32 s) internal view returns (bool) { bytes32 hash = keccak256( abi.encodePacked( "\x19Ethereum Signed Message:\n32", _domainSeparatorV4(), hashStruct)); address signer = ecrecover(hash, v, r, s); return (signer != address(0) && signer == target); } modifier onlyAuth() { require(isMinter[msg.sender], "AnyswapV4ERC20: FORBIDDEN"); _; } modifier onlyVault() { require(msg.sender == mpc(), "AnyswapV3ERC20: FORBIDDEN"); _; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldVault","type":"address"},{"indexed":true,"internalType":"address","name":"newVault","type":"address"},{"indexed":true,"internalType":"uint256","name":"effectiveTime","type":"uint256"}],"name":"LogChangeVault","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"txhash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogSwapin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"bindaddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogSwapout","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"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"txhash","type":"bytes32"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Swapin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"bindaddr","type":"address"}],"name":"Swapout","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TRANSFER_TYPEHASH","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":[],"name":"applyMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyVault","outputs":[],"stateMutability":"nonpayable","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":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"approveAndCall","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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDelay","type":"uint256"}],"name":"changeDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newVault","type":"address"}],"name":"changeVault","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint32","name":"pos","type":"uint32"}],"name":"checkpoints","outputs":[{"components":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint224","name":"votes","type":"uint224"}],"internalType":"struct ERC20Votes.Checkpoint","name":"","type":"tuple"}],"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":[],"name":"delay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delayMinter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delayVault","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllMinters","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPastTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPastVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"_vault","type":"address"}],"name":"initVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"minters","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mpc","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"internalType":"address","name":"account","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingMinter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","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":"address","name":"_auth","type":"address"}],"name":"revokeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_auth","type":"address"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"setVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setVaultOnly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"transferAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"address","name":"to","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":"transferWithPermit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101606040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610140526000600c553480156200003c57600080fd5b50604051620036a0380380620036a08339810160408190526200005f9162000295565b6040518060400160405280600981526020016804d6574616c537761760bc1b81525080604051806040016040528060018152602001603160f81b8152506040518060400160405280600981526020016804d6574616c537761760bc1b8152506040518060400160405280600381526020016216135560ea1b8152508160039080519060200190620000f2929190620001ef565b50805162000108906004906020840190620001ef565b5050825160208085019190912083518483012060e08290526101008190524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81880181905281830187905260608201869052608082019490945230818401528151808203909301835260c0019052805194019390932091935091906080523060601b60c05261012052505060118054600160ff199091161790555050600b80546001600160a81b0319166101006001600160a01b039490941693840217905550600f80546001600160a01b03191690911790554260105562000304565b828054620001fd90620002c7565b90600052602060002090601f0160209004810192826200022157600085556200026c565b82601f106200023c57805160ff19168380011785556200026c565b828001600101855582156200026c579182015b828111156200026c5782518255916020019190600101906200024f565b506200027a9291506200027e565b5090565b5b808211156200027a57600081556001016200027f565b600060208284031215620002a857600080fd5b81516001600160a01b0381168114620002c057600080fd5b9392505050565b600181811c90821680620002dc57607f821691505b60208210811415620002fe57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160601c60e0516101005161012051610140516133416200035f6000396000505060006120a3015260006120f2015260006120cd01526000612026015260006120500152600061207a01526133416000f3fe608060405234801561001057600080fd5b50600436106103565760003560e01c806379cc6790116101c8578063aa271e1a11610104578063d93f2445116100a2578063f1127ed81161007c578063f1127ed81461077d578063f75c2664146107ba578063fbfa77cf146107c2578063fca3b5aa146107da57600080fd5b8063d93f244514610729578063dd62ed3e14610731578063ec126c771461076a57600080fd5b8063c4b740f5116100de578063c4b740f5146106dd578063cae9ca51146106f0578063cfbd488514610703578063d505accf1461071657600080fd5b8063aa271e1a1461069e578063c3081240146106c1578063c3cda520146106ca57600080fd5b806391c5df49116101715780639dc29fac1161014b5780639dc29fac14610650578063a045442c14610663578063a457c2d714610678578063a9059cbb1461068b57600080fd5b806391c5df491461062257806395d89b41146106355780639ab24eb01461063d57600080fd5b806387689e28116101a257806387689e28146105fe5780638da5cb5b146106075780638e539e8c1461060f57600080fd5b806379cc6790146105c55780637ecebe00146105d85780638623ec7b146105eb57600080fd5b806340c10f1911610297578063605629d6116102405780636817031b1161021a5780636817031b146105585780636a42b8f81461056b5780636fcfff451461057457806370a082311461059c57600080fd5b8063605629d61461051f57806360e232a914610532578063628d6cba1461054557600080fd5b806352113ba71161027157806352113ba7146104b5578063587cde1e146104e05780635c19a95c1461050c57600080fd5b806340c10f191461047c57806342966c681461048f5780635037ec62146104a257600080fd5b80632ebe3fbb116103045780633644e515116102de5780633644e5151461043b57806339509351146104435780633a46b1a8146104565780634000aea01461046957600080fd5b80632ebe3fbb146103f257806330adf81f14610405578063313ce5671461042c57600080fd5b80630d707df8116103355780630d707df8146103cd57806318160ddd146103d757806323b872dd146103df57600080fd5b8062bf26f41461035b57806306fdde0314610395578063095ea7b3146103aa575b600080fd5b6103827f42ce63790c28229c123925d83266e77c04d28784552ab68b350a9003226cbd5981565b6040519081526020015b60405180910390f35b61039d6107ed565b60405161038c91906131e0565b6103bd6103b8366004612f69565b61087f565b604051901515815260200161038c565b6103d5610897565b005b600254610382565b6103bd6103ed366004612ec3565b610995565b6103d5610400366004612e75565b6109b9565b6103827f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6040516012815260200161038c565b610382610ae8565b6103bd610451366004612f69565b610af7565b610382610464366004612f69565b610b36565b6103bd610477366004612f93565b610bb0565b6103bd61048a366004612f69565b610c8c565b6103d561049d366004613111565b610cfe565b6103d56104b0366004613111565b610d0b565b600f546104c8906001600160a01b031681565b6040516001600160a01b03909116815260200161038c565b6104c86104ee366004612e75565b6001600160a01b039081166000908152600660205260409020541690565b6103d561051a366004612e75565b610d78565b6103bd61052d366004612eff565b610d82565b6103bd610540366004612e75565b610ebf565b6103bd61055336600461312a565b61100d565b6103d5610566366004612e75565b61110c565b610382600c5481565b610587610582366004612e75565b611205565b60405163ffffffff909116815260200161038c565b6103826105aa366004612e75565b6001600160a01b031660009081526020819052604090205490565b6103d56105d3366004612f69565b61122d565b6103826105e6366004612e75565b611246565b6104c86105f9366004613111565b611264565b61038260105481565b6104c861128e565b61038261061d366004613111565b611298565b600d546104c8906001600160a01b031681565b61039d6112f4565b61038261064b366004612e75565b611303565b6103bd61065e366004612f69565b61138a565b61066b611449565b60405161038c9190613193565b6103bd610686366004612f69565b6114aa565b6103bd610699366004612f69565b611554565b6103bd6106ac366004612e75565b60096020526000908152604090205460ff1681565b610382600e5481565b6103d56106d836600461301a565b611562565b6103d56106eb3660046130b2565b611698565b6103bd6106fe366004612f93565b611713565b6103d5610711366004612e75565b611769565b6103d5610724366004612eff565b6117f2565b6103d56118ff565b61038261073f366004612e90565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6103bd6107783660046130ec565b6119ae565b61079061078b366004613072565b611a65565b60408051825163ffffffff1681526020928301516001600160e01b0316928101929092520161038c565b6104c8611ae9565b600b546104c89061010090046001600160a01b031681565b6103d56107e8366004612e75565b611b19565b6060600380546107fc90613286565b80601f016020809104026020016040519081016040528092919081815260200182805461082890613286565b80156108755780601f1061084a57610100808354040283529160200191610875565b820191906000526020600020905b81548152906001019060200180831161085857829003601f168201915b5050505050905090565b60003361088d818585611c12565b5060019392505050565b61089f611ae9565b6001600160a01b0316336001600160a01b0316146109045760405162461bcd60e51b815260206004820152601960248201527f416e7973776170563345524332303a20464f5242494444454e0000000000000060448201526064015b60405180910390fd5b600e5442101561091357600080fd5b600d80546001600160a01b039081166000908152600960205260408120805460ff191660019081179091559254600a805494850181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8909201805473ffffffffffffffffffffffffffffffffffffffff191692909116919091179055565b6000336109a3858285611d6a565b6109ae858585611dfc565b506001949350505050565b6109c1611ae9565b6001600160a01b0316336001600160a01b031614610a215760405162461bcd60e51b815260206004820152601960248201527f416e7973776170563345524332303a20464f5242494444454e0000000000000060448201526064016108fb565b60115460ff16610a3057600080fd5b600b805474ffffffffffffffffffffffffffffffffffffffff0019166101006001600160a01b0393909316928302179055600f805473ffffffffffffffffffffffffffffffffffffffff1990811683179091556000828152600960205260408120805460ff199081166001908117909255600a805492830181559092527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8018054909216909217905542601055601180549091169055565b6000610af2612019565b905090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919061088d9082908690610b31908790613235565b611c12565b6000438210610b875760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e65640060448201526064016108fb565b6001600160a01b0383166000908152600760205260409020610ba99083612140565b9392505050565b60006001600160a01b038516151580610bd257506001600160a01b0385163014155b610bdb57600080fd5b610be58585611554565b506040517fa4c0ed360000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063a4c0ed3690610c3190339088908890889060040161314d565b602060405180830381600087803b158015610c4b57600080fd5b505af1158015610c5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8391906130cf565b95945050505050565b3360009081526009602052604081205460ff16610ceb5760405162461bcd60e51b815260206004820152601960248201527f416e7973776170563445524332303a20464f5242494444454e0000000000000060448201526064016108fb565b610cf583836121fd565b50600192915050565b610d083382612207565b50565b610d13611ae9565b6001600160a01b0316336001600160a01b031614610d735760405162461bcd60e51b815260206004820152601960248201527f416e7973776170563345524332303a20464f5242494444454e0000000000000060448201526064016108fb565b600c55565b610d083382612211565b600084421115610dd45760405162461bcd60e51b815260206004820152601e60248201527f416e7973776170563345524332303a2045787069726564207065726d6974000060448201526064016108fb565b60007f42ce63790c28229c123925d83266e77c04d28784552ab68b350a9003226cbd59898989610e038d612297565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e001604051602081830303815290604052805190602001209050610e6089828787876122bf565b80610e735750610e738982878787612398565b610e7c57600080fd5b6001600160a01b038816151580610e9c57506001600160a01b0388163014155b610ea557600080fd5b610eaf8888611554565b5060019998505050505050505050565b6000610ec9611ae9565b6001600160a01b0316336001600160a01b031614610f295760405162461bcd60e51b815260206004820152601960248201527f416e7973776170563345524332303a20464f5242494444454e0000000000000060448201526064016108fb565b6001600160a01b038216610f7f5760405162461bcd60e51b815260206004820152601c60248201527f416e7973776170563345524332303a206164647265737328307830290000000060448201526064016108fb565b600b805474ffffffffffffffffffffffffffffffffffffffff0019166101006001600160a01b038581168281029390931793849055600f805473ffffffffffffffffffffffffffffffffffffffff19168417905560405142949290920416907f5c364079e7102c27c608f9b237c735a1b7bfa0b67f27c2ad26bad447bf965cac90600090a45060015b919050565b600b5460009060ff16156110635760405162461bcd60e51b815260206004820152601860248201527f416e7973776170563445524332303a206f6e6c7941757468000000000000000060448201526064016108fb565b6001600160a01b0382166110b95760405162461bcd60e51b815260206004820152601c60248201527f416e7973776170563345524332303a206164647265737328307830290000000060448201526064016108fb565b6110c33384612207565b6040518381526001600160a01b0383169033907f6b616089d04950dc06c45c6dd787d657980543f89651aec47924752c7d16c8889060200160405180910390a350600192915050565b611114611ae9565b6001600160a01b0316336001600160a01b0316146111745760405162461bcd60e51b815260206004820152601960248201527f416e7973776170563345524332303a20464f5242494444454e0000000000000060448201526064016108fb565b6001600160a01b0381166111ca5760405162461bcd60e51b815260206004820152601c60248201527f416e7973776170563345524332303a206164647265737328307830290000000060448201526064016108fb565b600f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038316179055600c546111ff9042613235565b60105550565b6001600160a01b038116600090815260076020526040812054611227906123e3565b92915050565b611238823383611d6a565b6112428282612207565b5050565b6001600160a01b038116600090815260056020526040812054611227565b600a818154811061127457600080fd5b6000918252602090912001546001600160a01b0316905081565b6000610af2611ae9565b60004382106112e95760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e65640060448201526064016108fb565b611227600883612140565b6060600480546107fc90613286565b6001600160a01b0381166000908152600760205260408120548015611377576001600160a01b038316600090815260076020526040902061134560018361326f565b81548110611355576113556132e7565b60009182526020909120015464010000000090046001600160e01b031661137a565b60005b6001600160e01b03169392505050565b3360009081526009602052604081205460ff166113e95760405162461bcd60e51b815260206004820152601960248201527f416e7973776170563445524332303a20464f5242494444454e0000000000000060448201526064016108fb565b6001600160a01b03831661143f5760405162461bcd60e51b815260206004820152601c60248201527f416e7973776170563345524332303a206164647265737328307830290000000060448201526064016108fb565b610cf58383612207565b6060600a80548060200260200160405190810160405280929190818152602001828054801561087557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611483575050505050905090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156115475760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016108fb565b6109ae8286868403611c12565b60003361088d818585611dfc565b834211156115b25760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e6174757265206578706972656400000060448201526064016108fb565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b03881691810191909152606081018690526080810185905260009061162c906116249060a00160405160208183030381529060405280519060200120612463565b8585856124b1565b905061163781612297565b86146116855760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e63650000000000000060448201526064016108fb565b61168f8188612211565b50505050505050565b6116a0611ae9565b6001600160a01b0316336001600160a01b0316146117005760405162461bcd60e51b815260206004820152601960248201527f416e7973776170563345524332303a20464f5242494444454e0000000000000060448201526064016108fb565b600b805460ff1916911515919091179055565b6000611720338686611c12565b6040517eba451f0000000000000000000000000000000000000000000000000000000081526001600160a01b0386169062ba451f90610c3190339088908890889060040161314d565b611771611ae9565b6001600160a01b0316336001600160a01b0316146117d15760405162461bcd60e51b815260206004820152601960248201527f416e7973776170563345524332303a20464f5242494444454e0000000000000060448201526064016108fb565b6001600160a01b03166000908152600960205260409020805460ff19169055565b834211156118425760405162461bcd60e51b815260206004820152601e60248201527f416e7973776170563345524332303a2045787069726564207065726d6974000060448201526064016108fb565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886118718c612297565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506118ce88828686866122bf565b806118e157506118e18882868686612398565b6118ea57600080fd5b6118f5338888611c12565b5050505050505050565b611907611ae9565b6001600160a01b0316336001600160a01b0316146119675760405162461bcd60e51b815260206004820152601960248201527f416e7973776170563345524332303a20464f5242494444454e0000000000000060448201526064016108fb565b60105442101561197657600080fd5b600f54600b80546001600160a01b039092166101000274ffffffffffffffffffffffffffffffffffffffff0019909216919091179055565b3360009081526009602052604081205460ff16611a0d5760405162461bcd60e51b815260206004820152601960248201527f416e7973776170563445524332303a20464f5242494444454e0000000000000060448201526064016108fb565b611a1783836121fd565b826001600160a01b0316847f05d0634fe981be85c22e2942a880821b70095d84e152c3ea3c17a4e4250d9d6184604051611a5391815260200190565b60405180910390a35060019392505050565b60408051808201909152600080825260208201526001600160a01b0383166000908152600760205260409020805463ffffffff8416908110611aa957611aa96132e7565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b60006010544210611b045750600f546001600160a01b031690565b50600b5461010090046001600160a01b031690565b611b21611ae9565b6001600160a01b0316336001600160a01b031614611b815760405162461bcd60e51b815260206004820152601960248201527f416e7973776170563345524332303a20464f5242494444454e0000000000000060448201526064016108fb565b6001600160a01b038116611bd75760405162461bcd60e51b815260206004820152601c60248201527f416e7973776170563345524332303a206164647265737328307830290000000060448201526064016108fb565b600d805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038316179055600c54611c0c9042613235565b600e5550565b6001600160a01b038316611c8d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016108fb565b6001600160a01b038216611d095760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016108fb565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114611df65781811015611de95760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016108fb565b611df68484848403611c12565b50505050565b6001600160a01b038316611e785760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016108fb565b6001600160a01b038216611ef45760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016108fb565b6001600160a01b03831660009081526020819052604090205481811015611f835760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016108fb565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611fba908490613235565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161200691815260200190565b60405180910390a3611df68484846124de565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561207257507f000000000000000000000000000000000000000000000000000000000000000046145b1561209c57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b8154600090815b818110156121a457600061215b82846124e9565b905084868281548110612170576121706132e7565b60009182526020909120015463ffffffff1611156121905780925061219e565b61219b816001613235565b91505b50612147565b81156121e857846121b660018461326f565b815481106121c6576121c66132e7565b60009182526020909120015464010000000090046001600160e01b03166121eb565b60005b6001600160e01b031695945050505050565b6112428282612504565b611242828261259b565b6001600160a01b0382811660008181526006602081815260408084208054858452828620549490935287871673ffffffffffffffffffffffffffffffffffffffff198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611df68284836125b3565b6001600160a01b03811660009081526005602052604090208054600181018255905b50919050565b6000806122ca612019565b60405161190160f01b60208201526022810191909152604281018790526062015b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015612356573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580159061238c5750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b6000806123a3612019565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c810191909152605c8101879052607c016122eb565b600063ffffffff82111561245f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f322062697473000000000000000000000000000000000000000000000000000060648201526084016108fb565b5090565b6000611227612470612019565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60008060006124c2878787876126f0565b915091506124cf816127dd565b5095945050505050565b505050565b6124d9838383612998565b60006124f8600284841861324d565b610ba990848416613235565b61250e82826129ca565b6002546001600160e01b03101561258d5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f7465730000000000000000000000000000000060648201526084016108fb565b611df66008612ab183612abd565b6125a58282612c36565b611df66008612dc283612abd565b816001600160a01b0316836001600160a01b0316141580156125d55750600081115b156124d9576001600160a01b03831615612663576001600160a01b0383166000908152600760205260408120819061261090612dc285612abd565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612658929190918252602082015260400190565b60405180910390a250505b6001600160a01b038216156124d9576001600160a01b0382166000908152600760205260408120819061269990612ab185612abd565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516126e1929190918252602082015260400190565b60405180910390a25050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561272757506000905060036127d4565b8460ff16601b1415801561273f57508460ff16601c14155b1561275057506000905060046127d4565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156127a4573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166127cd576000600192509250506127d4565b9150600090505b94509492505050565b60008160048111156127f1576127f16132d1565b14156127fa5750565b600181600481111561280e5761280e6132d1565b141561285c5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016108fb565b6002816004811115612870576128706132d1565b14156128be5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016108fb565b60038160048111156128d2576128d26132d1565b141561292b5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016108fb565b600481600481111561293f5761293f6132d1565b1415610d085760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016108fb565b6001600160a01b038381166000908152600660205260408082205485841683529120546124d9929182169116836125b3565b6001600160a01b038216612a205760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016108fb565b8060026000828254612a329190613235565b90915550506001600160a01b03821660009081526020819052604081208054839290612a5f908490613235565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3611242600083836124de565b6000610ba98284613235565b825460009081908015612b085785612ad660018361326f565b81548110612ae657612ae66132e7565b60009182526020909120015464010000000090046001600160e01b0316612b0b565b60005b6001600160e01b03169250612b2483858763ffffffff16565b9150600081118015612b6257504386612b3e60018461326f565b81548110612b4e57612b4e6132e7565b60009182526020909120015463ffffffff16145b15612bc257612b7082612dce565b86612b7c60018461326f565b81548110612b8c57612b8c6132e7565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b03160217905550612c2d565b856040518060400160405280612bd7436123e3565b63ffffffff168152602001612beb85612dce565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b6001600160a01b038216612cb25760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016108fb565b6001600160a01b03821660009081526020819052604090205481811015612d415760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016108fb565b6001600160a01b0383166000908152602081905260408120838303905560028054849290612d7090849061326f565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36124d9836000846124de565b6000610ba9828461326f565b60006001600160e01b0382111561245f5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f323420626974730000000000000000000000000000000000000000000000000060648201526084016108fb565b80356001600160a01b038116811461100857600080fd5b803560ff8116811461100857600080fd5b600060208284031215612e8757600080fd5b610ba982612e4d565b60008060408385031215612ea357600080fd5b612eac83612e4d565b9150612eba60208401612e4d565b90509250929050565b600080600060608486031215612ed857600080fd5b612ee184612e4d565b9250612eef60208501612e4d565b9150604084013590509250925092565b600080600080600080600060e0888a031215612f1a57600080fd5b612f2388612e4d565b9650612f3160208901612e4d565b95506040880135945060608801359350612f4d60808901612e64565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612f7c57600080fd5b612f8583612e4d565b946020939093013593505050565b60008060008060608587031215612fa957600080fd5b612fb285612e4d565b935060208501359250604085013567ffffffffffffffff80821115612fd657600080fd5b818701915087601f830112612fea57600080fd5b813581811115612ff957600080fd5b88602082850101111561300b57600080fd5b95989497505060200194505050565b60008060008060008060c0878903121561303357600080fd5b61303c87612e4d565b9550602087013594506040870135935061305860608801612e64565b92506080870135915060a087013590509295509295509295565b6000806040838503121561308557600080fd5b61308e83612e4d565b9150602083013563ffffffff811681146130a757600080fd5b809150509250929050565b6000602082840312156130c457600080fd5b8135610ba9816132fd565b6000602082840312156130e157600080fd5b8151610ba9816132fd565b60008060006060848603121561310157600080fd5b83359250612eef60208501612e4d565b60006020828403121561312357600080fd5b5035919050565b6000806040838503121561313d57600080fd5b82359150612eba60208401612e4d565b6001600160a01b038516815283602082015260606040820152816060820152818360808301376000818301608090810191909152601f909201601f191601019392505050565b6020808252825182820181905260009190848201906040850190845b818110156131d45783516001600160a01b0316835292840192918401916001016131af565b50909695505050505050565b600060208083528351808285015260005b8181101561320d578581018301518582016040015282016131f1565b8181111561321f576000604083870101525b50601f01601f1916929092016040019392505050565b60008219821115613248576132486132bb565b500190565b60008261326a57634e487b7160e01b600052601260045260246000fd5b500490565b600082821015613281576132816132bb565b500390565b600181811c9082168061329a57607f821691505b602082108114156122b957634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b8015158114610d0857600080fdfea26469706673582212207ed17593b540c87ddb130ba1c761ad8423086d4104a4cee371c00a42ada59fab64736f6c63430008070033000000000000000000000000fdf6fa86058d1eacb441adb5acfc143672e59a58
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103565760003560e01c806379cc6790116101c8578063aa271e1a11610104578063d93f2445116100a2578063f1127ed81161007c578063f1127ed81461077d578063f75c2664146107ba578063fbfa77cf146107c2578063fca3b5aa146107da57600080fd5b8063d93f244514610729578063dd62ed3e14610731578063ec126c771461076a57600080fd5b8063c4b740f5116100de578063c4b740f5146106dd578063cae9ca51146106f0578063cfbd488514610703578063d505accf1461071657600080fd5b8063aa271e1a1461069e578063c3081240146106c1578063c3cda520146106ca57600080fd5b806391c5df49116101715780639dc29fac1161014b5780639dc29fac14610650578063a045442c14610663578063a457c2d714610678578063a9059cbb1461068b57600080fd5b806391c5df491461062257806395d89b41146106355780639ab24eb01461063d57600080fd5b806387689e28116101a257806387689e28146105fe5780638da5cb5b146106075780638e539e8c1461060f57600080fd5b806379cc6790146105c55780637ecebe00146105d85780638623ec7b146105eb57600080fd5b806340c10f1911610297578063605629d6116102405780636817031b1161021a5780636817031b146105585780636a42b8f81461056b5780636fcfff451461057457806370a082311461059c57600080fd5b8063605629d61461051f57806360e232a914610532578063628d6cba1461054557600080fd5b806352113ba71161027157806352113ba7146104b5578063587cde1e146104e05780635c19a95c1461050c57600080fd5b806340c10f191461047c57806342966c681461048f5780635037ec62146104a257600080fd5b80632ebe3fbb116103045780633644e515116102de5780633644e5151461043b57806339509351146104435780633a46b1a8146104565780634000aea01461046957600080fd5b80632ebe3fbb146103f257806330adf81f14610405578063313ce5671461042c57600080fd5b80630d707df8116103355780630d707df8146103cd57806318160ddd146103d757806323b872dd146103df57600080fd5b8062bf26f41461035b57806306fdde0314610395578063095ea7b3146103aa575b600080fd5b6103827f42ce63790c28229c123925d83266e77c04d28784552ab68b350a9003226cbd5981565b6040519081526020015b60405180910390f35b61039d6107ed565b60405161038c91906131e0565b6103bd6103b8366004612f69565b61087f565b604051901515815260200161038c565b6103d5610897565b005b600254610382565b6103bd6103ed366004612ec3565b610995565b6103d5610400366004612e75565b6109b9565b6103827f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6040516012815260200161038c565b610382610ae8565b6103bd610451366004612f69565b610af7565b610382610464366004612f69565b610b36565b6103bd610477366004612f93565b610bb0565b6103bd61048a366004612f69565b610c8c565b6103d561049d366004613111565b610cfe565b6103d56104b0366004613111565b610d0b565b600f546104c8906001600160a01b031681565b6040516001600160a01b03909116815260200161038c565b6104c86104ee366004612e75565b6001600160a01b039081166000908152600660205260409020541690565b6103d561051a366004612e75565b610d78565b6103bd61052d366004612eff565b610d82565b6103bd610540366004612e75565b610ebf565b6103bd61055336600461312a565b61100d565b6103d5610566366004612e75565b61110c565b610382600c5481565b610587610582366004612e75565b611205565b60405163ffffffff909116815260200161038c565b6103826105aa366004612e75565b6001600160a01b031660009081526020819052604090205490565b6103d56105d3366004612f69565b61122d565b6103826105e6366004612e75565b611246565b6104c86105f9366004613111565b611264565b61038260105481565b6104c861128e565b61038261061d366004613111565b611298565b600d546104c8906001600160a01b031681565b61039d6112f4565b61038261064b366004612e75565b611303565b6103bd61065e366004612f69565b61138a565b61066b611449565b60405161038c9190613193565b6103bd610686366004612f69565b6114aa565b6103bd610699366004612f69565b611554565b6103bd6106ac366004612e75565b60096020526000908152604090205460ff1681565b610382600e5481565b6103d56106d836600461301a565b611562565b6103d56106eb3660046130b2565b611698565b6103bd6106fe366004612f93565b611713565b6103d5610711366004612e75565b611769565b6103d5610724366004612eff565b6117f2565b6103d56118ff565b61038261073f366004612e90565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6103bd6107783660046130ec565b6119ae565b61079061078b366004613072565b611a65565b60408051825163ffffffff1681526020928301516001600160e01b0316928101929092520161038c565b6104c8611ae9565b600b546104c89061010090046001600160a01b031681565b6103d56107e8366004612e75565b611b19565b6060600380546107fc90613286565b80601f016020809104026020016040519081016040528092919081815260200182805461082890613286565b80156108755780601f1061084a57610100808354040283529160200191610875565b820191906000526020600020905b81548152906001019060200180831161085857829003601f168201915b5050505050905090565b60003361088d818585611c12565b5060019392505050565b61089f611ae9565b6001600160a01b0316336001600160a01b0316146109045760405162461bcd60e51b815260206004820152601960248201527f416e7973776170563345524332303a20464f5242494444454e0000000000000060448201526064015b60405180910390fd5b600e5442101561091357600080fd5b600d80546001600160a01b039081166000908152600960205260408120805460ff191660019081179091559254600a805494850181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8909201805473ffffffffffffffffffffffffffffffffffffffff191692909116919091179055565b6000336109a3858285611d6a565b6109ae858585611dfc565b506001949350505050565b6109c1611ae9565b6001600160a01b0316336001600160a01b031614610a215760405162461bcd60e51b815260206004820152601960248201527f416e7973776170563345524332303a20464f5242494444454e0000000000000060448201526064016108fb565b60115460ff16610a3057600080fd5b600b805474ffffffffffffffffffffffffffffffffffffffff0019166101006001600160a01b0393909316928302179055600f805473ffffffffffffffffffffffffffffffffffffffff1990811683179091556000828152600960205260408120805460ff199081166001908117909255600a805492830181559092527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8018054909216909217905542601055601180549091169055565b6000610af2612019565b905090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919061088d9082908690610b31908790613235565b611c12565b6000438210610b875760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e65640060448201526064016108fb565b6001600160a01b0383166000908152600760205260409020610ba99083612140565b9392505050565b60006001600160a01b038516151580610bd257506001600160a01b0385163014155b610bdb57600080fd5b610be58585611554565b506040517fa4c0ed360000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063a4c0ed3690610c3190339088908890889060040161314d565b602060405180830381600087803b158015610c4b57600080fd5b505af1158015610c5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8391906130cf565b95945050505050565b3360009081526009602052604081205460ff16610ceb5760405162461bcd60e51b815260206004820152601960248201527f416e7973776170563445524332303a20464f5242494444454e0000000000000060448201526064016108fb565b610cf583836121fd565b50600192915050565b610d083382612207565b50565b610d13611ae9565b6001600160a01b0316336001600160a01b031614610d735760405162461bcd60e51b815260206004820152601960248201527f416e7973776170563345524332303a20464f5242494444454e0000000000000060448201526064016108fb565b600c55565b610d083382612211565b600084421115610dd45760405162461bcd60e51b815260206004820152601e60248201527f416e7973776170563345524332303a2045787069726564207065726d6974000060448201526064016108fb565b60007f42ce63790c28229c123925d83266e77c04d28784552ab68b350a9003226cbd59898989610e038d612297565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e001604051602081830303815290604052805190602001209050610e6089828787876122bf565b80610e735750610e738982878787612398565b610e7c57600080fd5b6001600160a01b038816151580610e9c57506001600160a01b0388163014155b610ea557600080fd5b610eaf8888611554565b5060019998505050505050505050565b6000610ec9611ae9565b6001600160a01b0316336001600160a01b031614610f295760405162461bcd60e51b815260206004820152601960248201527f416e7973776170563345524332303a20464f5242494444454e0000000000000060448201526064016108fb565b6001600160a01b038216610f7f5760405162461bcd60e51b815260206004820152601c60248201527f416e7973776170563345524332303a206164647265737328307830290000000060448201526064016108fb565b600b805474ffffffffffffffffffffffffffffffffffffffff0019166101006001600160a01b038581168281029390931793849055600f805473ffffffffffffffffffffffffffffffffffffffff19168417905560405142949290920416907f5c364079e7102c27c608f9b237c735a1b7bfa0b67f27c2ad26bad447bf965cac90600090a45060015b919050565b600b5460009060ff16156110635760405162461bcd60e51b815260206004820152601860248201527f416e7973776170563445524332303a206f6e6c7941757468000000000000000060448201526064016108fb565b6001600160a01b0382166110b95760405162461bcd60e51b815260206004820152601c60248201527f416e7973776170563345524332303a206164647265737328307830290000000060448201526064016108fb565b6110c33384612207565b6040518381526001600160a01b0383169033907f6b616089d04950dc06c45c6dd787d657980543f89651aec47924752c7d16c8889060200160405180910390a350600192915050565b611114611ae9565b6001600160a01b0316336001600160a01b0316146111745760405162461bcd60e51b815260206004820152601960248201527f416e7973776170563345524332303a20464f5242494444454e0000000000000060448201526064016108fb565b6001600160a01b0381166111ca5760405162461bcd60e51b815260206004820152601c60248201527f416e7973776170563345524332303a206164647265737328307830290000000060448201526064016108fb565b600f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038316179055600c546111ff9042613235565b60105550565b6001600160a01b038116600090815260076020526040812054611227906123e3565b92915050565b611238823383611d6a565b6112428282612207565b5050565b6001600160a01b038116600090815260056020526040812054611227565b600a818154811061127457600080fd5b6000918252602090912001546001600160a01b0316905081565b6000610af2611ae9565b60004382106112e95760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e65640060448201526064016108fb565b611227600883612140565b6060600480546107fc90613286565b6001600160a01b0381166000908152600760205260408120548015611377576001600160a01b038316600090815260076020526040902061134560018361326f565b81548110611355576113556132e7565b60009182526020909120015464010000000090046001600160e01b031661137a565b60005b6001600160e01b03169392505050565b3360009081526009602052604081205460ff166113e95760405162461bcd60e51b815260206004820152601960248201527f416e7973776170563445524332303a20464f5242494444454e0000000000000060448201526064016108fb565b6001600160a01b03831661143f5760405162461bcd60e51b815260206004820152601c60248201527f416e7973776170563345524332303a206164647265737328307830290000000060448201526064016108fb565b610cf58383612207565b6060600a80548060200260200160405190810160405280929190818152602001828054801561087557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611483575050505050905090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156115475760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016108fb565b6109ae8286868403611c12565b60003361088d818585611dfc565b834211156115b25760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e6174757265206578706972656400000060448201526064016108fb565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b03881691810191909152606081018690526080810185905260009061162c906116249060a00160405160208183030381529060405280519060200120612463565b8585856124b1565b905061163781612297565b86146116855760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e63650000000000000060448201526064016108fb565b61168f8188612211565b50505050505050565b6116a0611ae9565b6001600160a01b0316336001600160a01b0316146117005760405162461bcd60e51b815260206004820152601960248201527f416e7973776170563345524332303a20464f5242494444454e0000000000000060448201526064016108fb565b600b805460ff1916911515919091179055565b6000611720338686611c12565b6040517eba451f0000000000000000000000000000000000000000000000000000000081526001600160a01b0386169062ba451f90610c3190339088908890889060040161314d565b611771611ae9565b6001600160a01b0316336001600160a01b0316146117d15760405162461bcd60e51b815260206004820152601960248201527f416e7973776170563345524332303a20464f5242494444454e0000000000000060448201526064016108fb565b6001600160a01b03166000908152600960205260409020805460ff19169055565b834211156118425760405162461bcd60e51b815260206004820152601e60248201527f416e7973776170563345524332303a2045787069726564207065726d6974000060448201526064016108fb565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886118718c612297565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506118ce88828686866122bf565b806118e157506118e18882868686612398565b6118ea57600080fd5b6118f5338888611c12565b5050505050505050565b611907611ae9565b6001600160a01b0316336001600160a01b0316146119675760405162461bcd60e51b815260206004820152601960248201527f416e7973776170563345524332303a20464f5242494444454e0000000000000060448201526064016108fb565b60105442101561197657600080fd5b600f54600b80546001600160a01b039092166101000274ffffffffffffffffffffffffffffffffffffffff0019909216919091179055565b3360009081526009602052604081205460ff16611a0d5760405162461bcd60e51b815260206004820152601960248201527f416e7973776170563445524332303a20464f5242494444454e0000000000000060448201526064016108fb565b611a1783836121fd565b826001600160a01b0316847f05d0634fe981be85c22e2942a880821b70095d84e152c3ea3c17a4e4250d9d6184604051611a5391815260200190565b60405180910390a35060019392505050565b60408051808201909152600080825260208201526001600160a01b0383166000908152600760205260409020805463ffffffff8416908110611aa957611aa96132e7565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b60006010544210611b045750600f546001600160a01b031690565b50600b5461010090046001600160a01b031690565b611b21611ae9565b6001600160a01b0316336001600160a01b031614611b815760405162461bcd60e51b815260206004820152601960248201527f416e7973776170563345524332303a20464f5242494444454e0000000000000060448201526064016108fb565b6001600160a01b038116611bd75760405162461bcd60e51b815260206004820152601c60248201527f416e7973776170563345524332303a206164647265737328307830290000000060448201526064016108fb565b600d805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038316179055600c54611c0c9042613235565b600e5550565b6001600160a01b038316611c8d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016108fb565b6001600160a01b038216611d095760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016108fb565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114611df65781811015611de95760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016108fb565b611df68484848403611c12565b50505050565b6001600160a01b038316611e785760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016108fb565b6001600160a01b038216611ef45760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016108fb565b6001600160a01b03831660009081526020819052604090205481811015611f835760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016108fb565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611fba908490613235565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161200691815260200190565b60405180910390a3611df68484846124de565b6000306001600160a01b037f000000000000000000000000adbe0eac80f955363f4ff47b0f70189093908c041614801561207257507f000000000000000000000000000000000000000000000000000000000000008946145b1561209c57507f4a514c59b061ec5615f9688a949cd0fe5d6140b5e0c6c0c39d20c21deac8ec1490565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527fd177aa1e7f031a8d21f6f16697c692c443b376cf51378be94a83ab0304572e2b828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b8154600090815b818110156121a457600061215b82846124e9565b905084868281548110612170576121706132e7565b60009182526020909120015463ffffffff1611156121905780925061219e565b61219b816001613235565b91505b50612147565b81156121e857846121b660018461326f565b815481106121c6576121c66132e7565b60009182526020909120015464010000000090046001600160e01b03166121eb565b60005b6001600160e01b031695945050505050565b6112428282612504565b611242828261259b565b6001600160a01b0382811660008181526006602081815260408084208054858452828620549490935287871673ffffffffffffffffffffffffffffffffffffffff198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611df68284836125b3565b6001600160a01b03811660009081526005602052604090208054600181018255905b50919050565b6000806122ca612019565b60405161190160f01b60208201526022810191909152604281018790526062015b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015612356573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580159061238c5750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b6000806123a3612019565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c810191909152605c8101879052607c016122eb565b600063ffffffff82111561245f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f322062697473000000000000000000000000000000000000000000000000000060648201526084016108fb565b5090565b6000611227612470612019565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60008060006124c2878787876126f0565b915091506124cf816127dd565b5095945050505050565b505050565b6124d9838383612998565b60006124f8600284841861324d565b610ba990848416613235565b61250e82826129ca565b6002546001600160e01b03101561258d5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f7465730000000000000000000000000000000060648201526084016108fb565b611df66008612ab183612abd565b6125a58282612c36565b611df66008612dc283612abd565b816001600160a01b0316836001600160a01b0316141580156125d55750600081115b156124d9576001600160a01b03831615612663576001600160a01b0383166000908152600760205260408120819061261090612dc285612abd565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612658929190918252602082015260400190565b60405180910390a250505b6001600160a01b038216156124d9576001600160a01b0382166000908152600760205260408120819061269990612ab185612abd565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516126e1929190918252602082015260400190565b60405180910390a25050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561272757506000905060036127d4565b8460ff16601b1415801561273f57508460ff16601c14155b1561275057506000905060046127d4565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156127a4573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166127cd576000600192509250506127d4565b9150600090505b94509492505050565b60008160048111156127f1576127f16132d1565b14156127fa5750565b600181600481111561280e5761280e6132d1565b141561285c5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016108fb565b6002816004811115612870576128706132d1565b14156128be5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016108fb565b60038160048111156128d2576128d26132d1565b141561292b5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016108fb565b600481600481111561293f5761293f6132d1565b1415610d085760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016108fb565b6001600160a01b038381166000908152600660205260408082205485841683529120546124d9929182169116836125b3565b6001600160a01b038216612a205760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016108fb565b8060026000828254612a329190613235565b90915550506001600160a01b03821660009081526020819052604081208054839290612a5f908490613235565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3611242600083836124de565b6000610ba98284613235565b825460009081908015612b085785612ad660018361326f565b81548110612ae657612ae66132e7565b60009182526020909120015464010000000090046001600160e01b0316612b0b565b60005b6001600160e01b03169250612b2483858763ffffffff16565b9150600081118015612b6257504386612b3e60018461326f565b81548110612b4e57612b4e6132e7565b60009182526020909120015463ffffffff16145b15612bc257612b7082612dce565b86612b7c60018461326f565b81548110612b8c57612b8c6132e7565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b03160217905550612c2d565b856040518060400160405280612bd7436123e3565b63ffffffff168152602001612beb85612dce565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b6001600160a01b038216612cb25760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016108fb565b6001600160a01b03821660009081526020819052604090205481811015612d415760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016108fb565b6001600160a01b0383166000908152602081905260408120838303905560028054849290612d7090849061326f565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36124d9836000846124de565b6000610ba9828461326f565b60006001600160e01b0382111561245f5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f323420626974730000000000000000000000000000000000000000000000000060648201526084016108fb565b80356001600160a01b038116811461100857600080fd5b803560ff8116811461100857600080fd5b600060208284031215612e8757600080fd5b610ba982612e4d565b60008060408385031215612ea357600080fd5b612eac83612e4d565b9150612eba60208401612e4d565b90509250929050565b600080600060608486031215612ed857600080fd5b612ee184612e4d565b9250612eef60208501612e4d565b9150604084013590509250925092565b600080600080600080600060e0888a031215612f1a57600080fd5b612f2388612e4d565b9650612f3160208901612e4d565b95506040880135945060608801359350612f4d60808901612e64565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612f7c57600080fd5b612f8583612e4d565b946020939093013593505050565b60008060008060608587031215612fa957600080fd5b612fb285612e4d565b935060208501359250604085013567ffffffffffffffff80821115612fd657600080fd5b818701915087601f830112612fea57600080fd5b813581811115612ff957600080fd5b88602082850101111561300b57600080fd5b95989497505060200194505050565b60008060008060008060c0878903121561303357600080fd5b61303c87612e4d565b9550602087013594506040870135935061305860608801612e64565b92506080870135915060a087013590509295509295509295565b6000806040838503121561308557600080fd5b61308e83612e4d565b9150602083013563ffffffff811681146130a757600080fd5b809150509250929050565b6000602082840312156130c457600080fd5b8135610ba9816132fd565b6000602082840312156130e157600080fd5b8151610ba9816132fd565b60008060006060848603121561310157600080fd5b83359250612eef60208501612e4d565b60006020828403121561312357600080fd5b5035919050565b6000806040838503121561313d57600080fd5b82359150612eba60208401612e4d565b6001600160a01b038516815283602082015260606040820152816060820152818360808301376000818301608090810191909152601f909201601f191601019392505050565b6020808252825182820181905260009190848201906040850190845b818110156131d45783516001600160a01b0316835292840192918401916001016131af565b50909695505050505050565b600060208083528351808285015260005b8181101561320d578581018301518582016040015282016131f1565b8181111561321f576000604083870101525b50601f01601f1916929092016040019392505050565b60008219821115613248576132486132bb565b500190565b60008261326a57634e487b7160e01b600052601260045260246000fd5b500490565b600082821015613281576132816132bb565b500390565b600181811c9082168061329a57607f821691505b602082108114156122b957634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b8015158114610d0857600080fdfea26469706673582212207ed17593b540c87ddb130ba1c761ad8423086d4104a4cee371c00a42ada59fab64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000fdf6fa86058d1eacb441adb5acfc143672e59a58
-----Decoded View---------------
Arg [0] : _vault (address): 0xFDf6Fa86058D1Eacb441aDB5aCfC143672E59A58
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000fdf6fa86058d1eacb441adb5acfc143672e59a58
Deployed Bytecode Sourcemap
62886:9034:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63251:136;;63295:92;63251:136;;;;;7672:25:1;;;7660:2;7645:18;63251:136:0;;;;;;;;35987:100;;;:::i;:::-;;;;;;;:::i;38338:201::-;;;;;;:::i;:::-;;:::i;:::-;;;7499:14:1;;7492:22;7474:41;;7462:2;7447:18;38338:201:0;7334:187:1;67300:179:0;;;:::i;:::-;;37107:108;37195:12;;37107:108;;39119:295;;;;;;:::i;:::-;;:::i;66443:272::-;;;;;;:::i;:::-;;:::i;63107:137::-;;63149:95;63107:137;;36949:93;;;37032:2;21012:36:1;;21000:2;20985:18;36949:93:0;20870:184:1;52743:115:0;;;:::i;39823:240::-;;;;;;:::i;:::-;;:::i;55945:268::-;;;;;;:::i;:::-;;:::i;70546:281::-;;;;;;:::i;:::-;;:::i;65939:133::-;;;;;;:::i;:::-;;:::i;47365:91::-;;;;;;:::i;:::-;;:::i;64397:::-;;;;;;:::i;:::-;;:::i;63632:27::-;;;;;-1:-1:-1;;;;;63632:27:0;;;;;;-1:-1:-1;;;;;5994:55:1;;;5976:74;;5964:2;5949:18;63632:27:0;5830:226:1;55319:128:0;;;;;;:::i;:::-;-1:-1:-1;;;;;55420:19:0;;;55393:7;55420:19;;;:10;:19;;;;;;;;55319:128;58418:114;;;;;;:::i;:::-;;:::i;69821:717::-;;;;;;:::i;:::-;;:::i;67755:306::-;;;;;;:::i;:::-;;:::i;65553:378::-;;;;;;:::i;:::-;;:::i;66723:212::-;;;;;;:::i;:::-;;:::i;63539:21::-;;;;;;55075:151;;;;;;:::i;:::-;;:::i;:::-;;;20847:10:1;20835:23;;;20817:42;;20805:2;20790:18;55075:151:0;20673:192:1;37278:127:0;;;;;;:::i;:::-;-1:-1:-1;;;;;37379:18:0;37352:7;37379:18;;;;;;;;;;;;37278:127;47775:164;;;;;;:::i;:::-;;:::i;52485:128::-;;;;;;:::i;:::-;;:::i;63074:24::-;;;;;;:::i;:::-;;:::i;63666:22::-;;;;;;66255:78;;;:::i;56502:259::-;;;;;;:::i;:::-;;:::i;63567:28::-;;;;;-1:-1:-1;;;;;63567:28:0;;;36206:104;;;:::i;55531:212::-;;;;;;:::i;:::-;;:::i;65079:207::-;;;;;;:::i;:::-;;:::i;67648:99::-;;;:::i;:::-;;;;;;;:::i;40566:438::-;;;;;;:::i;:::-;;:::i;37611:193::-;;;;;;:::i;:::-;;:::i;63027:40::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;63602:23;;;;;;58614:591;;;;;;:::i;:::-;;:::i;66341:94::-;;;;;;:::i;:::-;;:::i;68069:243::-;;;;;;:::i;:::-;;:::i;67542:98::-;;;;;;:::i;:::-;;:::i;69145:668::-;;;;;;:::i;:::-;;:::i;66943:129::-;;;:::i;37867:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;37983:18:0;;;37956:7;37983:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;37867:151;65294:241;;;;;;:::i;:::-;;:::i;54845:150::-;;;;;;:::i;:::-;;:::i;:::-;;;;20072:13:1;;20087:10;20068:30;20050:49;;20159:4;20147:17;;;20141:24;-1:-1:-1;;;;;20137:89:1;20115:20;;;20108:119;;;;20023:18;54845:150:0;19848:385:1;66080:167:0;;;:::i;63512:20::-;;;;;;;;-1:-1:-1;;;;;63512:20:0;;;67080:212;;;;;;:::i;:::-;;:::i;35987:100::-;36041:13;36074:5;36067:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35987:100;:::o;38338:201::-;38421:4;30093:10;38477:32;30093:10;38493:7;38502:6;38477:8;:32::i;:::-;-1:-1:-1;38527:4:0;;38338:201;-1:-1:-1;;;38338:201:0:o;67300:179::-;71860:5;:3;:5::i;:::-;-1:-1:-1;;;;;71846:19:0;:10;-1:-1:-1;;;;;71846:19:0;;71838:57;;;;-1:-1:-1;;;71838:57:0;;13491:2:1;71838:57:0;;;13473:21:1;13530:2;13510:18;;;13503:30;13569:27;13549:18;;;13542:55;13614:18;;71838:57:0;;;;;;;;;67380:11:::1;;67361:15;:30;;67353:39;;;::::0;::::1;;67412:13;::::0;;-1:-1:-1;;;;;67412:13:0;;::::1;67403:23;::::0;;;:8:::1;:23;::::0;;;;:30;;-1:-1:-1;;67403:30:0::1;67429:4;67403:30:::0;;::::1;::::0;;;67457:13;;67444:7:::1;:27:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;-1:-1:-1;;67444:27:0::1;67457:13:::0;;;::::1;67444:27:::0;;;::::1;::::0;;67300:179::o;39119:295::-;39250:4;30093:10;39308:38;39324:4;30093:10;39339:6;39308:15;:38::i;:::-;39357:27;39367:4;39373:2;39377:6;39357:9;:27::i;:::-;-1:-1:-1;39402:4:0;;39119:295;-1:-1:-1;;;;39119:295:0:o;66443:272::-;71860:5;:3;:5::i;:::-;-1:-1:-1;;;;;71846:19:0;:10;-1:-1:-1;;;;;71846:19:0;;71838:57;;;;-1:-1:-1;;;71838:57:0;;13491:2:1;71838:57:0;;;13473:21:1;13530:2;13510:18;;;13503:30;13569:27;13549:18;;;13542:55;13614:18;;71838:57:0;13289:349:1;71838:57:0;66516:5:::1;::::0;::::1;;66508:14;;;::::0;::::1;;66533:5;:14:::0;;-1:-1:-1;;66533:14:0::1;;-1:-1:-1::0;;;;;66533:14:0;;;::::1;::::0;;::::1;;::::0;;66558:12:::1;:21:::0;;-1:-1:-1;;66558:21:0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;66590:16:0;;;:8:::1;:16;::::0;;;;:23;;-1:-1:-1;;66590:23:0;;::::1;-1:-1:-1::0;66590:23:0;;::::1;::::0;;;66624:7:::1;:20:::0;;;;::::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;66668:15:::1;66655:10;:28:::0;66694:5:::1;:13:::0;;;;::::1;::::0;;66443:272::o;52743:115::-;52803:7;52830:20;:18;:20::i;:::-;52823:27;;52743:115;:::o;39823:240::-;30093:10;39911:4;39992:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;39992:27:0;;;;;;;;;;39911:4;;30093:10;39967:66;;30093:10;;39992:27;;:40;;40022:10;;39992:40;:::i;:::-;39967:8;:66::i;55945:268::-;56043:7;56085:12;56071:11;:26;56063:70;;;;-1:-1:-1;;;56063:70:0;;11253:2:1;56063:70:0;;;11235:21:1;11292:2;11272:18;;;11265:30;11331:33;11311:18;;;11304:61;11382:18;;56063:70:0;11051:355:1;56063:70:0;-1:-1:-1;;;;;56170:21:0;;;;;;:12;:21;;;;;56151:54;;56193:11;56151:18;:54::i;:::-;56144:61;55945:268;-1:-1:-1;;;55945:268:0:o;70546:281::-;70634:4;-1:-1:-1;;;;;70659:16:0;;;;;:39;;-1:-1:-1;;;;;;70679:19:0;;70693:4;70679:19;;70659:39;70651:48;;;;;;70712:25;70727:2;70731:5;70712:14;:25::i;:::-;-1:-1:-1;70757:62:0;;;;;-1:-1:-1;;;;;70757:37:0;;;;;:62;;70795:10;;70807:5;;70814:4;;;;70757:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70750:69;70546:281;-1:-1:-1;;;;;70546:281:0:o;65939:133::-;71737:10;66008:4;71728:20;;;:8;:20;;;;;;;;71720:58;;;;-1:-1:-1;;;71720:58:0;;17310:2:1;71720:58:0;;;17292:21:1;17349:2;17329:18;;;17322:30;17388:27;17368:18;;;17361:55;17433:18;;71720:58:0;17108:349:1;71720:58:0;66025:17:::1;66031:2;66035:6;66025:5;:17::i;:::-;-1:-1:-1::0;66060:4:0::1;65939:133:::0;;;;:::o;47365:91::-;47421:27;30093:10;47441:6;47421:5;:27::i;:::-;47365:91;:::o;64397:::-;71860:5;:3;:5::i;:::-;-1:-1:-1;;;;;71846:19:0;:10;-1:-1:-1;;;;;71846:19:0;;71838:57;;;;-1:-1:-1;;;71838:57:0;;13491:2:1;71838:57:0;;;13473:21:1;13530:2;13510:18;;;13503:30;13569:27;13549:18;;;13542:55;13614:18;;71838:57:0;13289:349:1;71838:57:0;64464:5:::1;:16:::0;64397:91::o;58418:114::-;58490:34;30093:10;58514:9;58490;:34::i;69821:717::-;69957:4;70011:8;69992:15;:27;;69984:70;;;;-1:-1:-1;;;69984:70:0;;15370:2:1;69984:70:0;;;15352:21:1;15409:2;15389:18;;;15382:30;15448:32;15428:18;;;15421:60;15498:18;;69984:70:0;15168:354:1;69984:70:0;70067:18;63295:92;70177:6;70202:2;70223:5;70247:17;70257:6;70247:9;:17::i;:::-;70112:180;;;;;;7995:25:1;;;;-1:-1:-1;;;;;8117:15:1;;;8097:18;;;8090:43;8169:15;;;;8149:18;;;8142:43;8201:18;;;8194:34;8244:19;;;8237:35;8288:19;;;8281:35;;;7967:19;;70112:180:0;;;;;;;;;;;;70088:205;;;;;;70067:226;;70314:41;70327:6;70335:10;70347:1;70350;70353;70314:12;:41::i;:::-;:92;;;;70359:47;70378:6;70386:10;70398:1;70401;70404;70359:18;:47::i;:::-;70306:101;;;;;;-1:-1:-1;;;;;70428:16:0;;;;;:39;;-1:-1:-1;;;;;;70448:19:0;;70462:4;70448:19;;70428:39;70420:48;;;;;;70481:25;70496:2;70500:5;70481:14;:25::i;:::-;-1:-1:-1;70526:4:0;;69821:717;-1:-1:-1;;;;;;;;;69821:717:0:o;67755:306::-;67822:4;71860:5;:3;:5::i;:::-;-1:-1:-1;;;;;71846:19:0;:10;-1:-1:-1;;;;;71846:19:0;;71838:57;;;;-1:-1:-1;;;71838:57:0;;13491:2:1;71838:57:0;;;13473:21:1;13530:2;13510:18;;;13503:30;13569:27;13549:18;;;13542:55;13614:18;;71838:57:0;13289:349:1;71838:57:0;-1:-1:-1;;;;;67847:22:0;::::1;67839:63;;;::::0;-1:-1:-1;;;67839:63:0;;13845:2:1;67839:63:0::1;::::0;::::1;13827:21:1::0;13884:2;13864:18;;;13857:30;13923;13903:18;;;13896:58;13971:18;;67839:63:0::1;13643:352:1::0;67839:63:0::1;67913:5;:16:::0;;-1:-1:-1;;67913:16:0::1;;-1:-1:-1::0;;;;;67913:16:0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;67940:12:::1;:23:::0;;-1:-1:-1;;67940:23:0::1;::::0;::::1;::::0;;67979:52:::1;::::0;68015:15:::1;::::0;67994:5;;;::::1;;::::0;67979:52:::1;::::0;-1:-1:-1;;67979:52:0::1;-1:-1:-1::0;68049:4:0::1;71906:1;67755:306:::0;;;:::o;65553:378::-;65655:10;;65620:4;;65655:10;;65654:11;65646:48;;;;-1:-1:-1;;;65646:48:0;;16957:2:1;65646:48:0;;;16939:21:1;16996:2;16976:18;;;16969:30;17035:26;17015:18;;;17008:54;17079:18;;65646:48:0;16755:348:1;65646:48:0;-1:-1:-1;;;;;65722:22:0;;65714:63;;;;-1:-1:-1;;;65714:63:0;;13845:2:1;65714:63:0;;;13827:21:1;13884:2;13864:18;;;13857:30;13923;13903:18;;;13896:58;13971:18;;65714:63:0;13643:352:1;65714:63:0;65797:25;65803:10;65815:6;65797:5;:25::i;:::-;65847:40;;7672:25:1;;;-1:-1:-1;;;;;65847:40:0;;;65858:10;;65847:40;;7660:2:1;7645:18;65847:40:0;;;;;;;-1:-1:-1;65914:4:0;65553:378;;;;:::o;66723:212::-;71860:5;:3;:5::i;:::-;-1:-1:-1;;;;;71846:19:0;:10;-1:-1:-1;;;;;71846:19:0;;71838:57;;;;-1:-1:-1;;;71838:57:0;;13491:2:1;71838:57:0;;;13473:21:1;13530:2;13510:18;;;13503:30;13569:27;13549:18;;;13542:55;13614:18;;71838:57:0;13289:349:1;71838:57:0;-1:-1:-1;;;;;66795:20:0;::::1;66787:61;;;::::0;-1:-1:-1;;;66787:61:0;;13845:2:1;66787:61:0::1;::::0;::::1;13827:21:1::0;13884:2;13864:18;;;13857:30;13923;13903:18;;;13896:58;13971:18;;66787:61:0::1;13643:352:1::0;66787:61:0::1;66859:12;:21:::0;;-1:-1:-1;;66859:21:0::1;-1:-1:-1::0;;;;;66859:21:0;::::1;;::::0;;66922:5:::1;::::0;66904:23:::1;::::0;:15:::1;:23;:::i;:::-;66891:10;:36:::0;-1:-1:-1;66723:212:0:o;55075:151::-;-1:-1:-1;;;;;55189:21:0;;55145:6;55189:21;;;:12;:21;;;;;:28;55171:47;;:17;:47::i;:::-;55164:54;55075:151;-1:-1:-1;;55075:151:0:o;47775:164::-;47852:46;47868:7;30093:10;47891:6;47852:15;:46::i;:::-;47909:22;47915:7;47924:6;47909:5;:22::i;:::-;47775:164;;:::o;52485:128::-;-1:-1:-1;;;;;52581:14:0;;52554:7;52581:14;;;:7;:14;;;;;12544;52581:24;12452:114;63074:24;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;63074:24:0;;-1:-1:-1;63074:24:0;:::o;66255:78::-;66293:7;66320:5;:3;:5::i;56502:259::-;56589:7;56631:12;56617:11;:26;56609:70;;;;-1:-1:-1;;;56609:70:0;;11253:2:1;56609:70:0;;;11235:21:1;11292:2;11272:18;;;11265:30;11331:33;11311:18;;;11304:61;11382:18;;56609:70:0;11051:355:1;56609:70:0;56697:56;56716:23;56741:11;56697:18;:56::i;36206:104::-;36262:13;36295:7;36288:14;;;;;:::i;55531:212::-;-1:-1:-1;;;;;55638:21:0;;55604:7;55638:21;;;:12;:21;;;;;:28;55684:8;;:51;;-1:-1:-1;;;;;55699:21:0;;;;;;:12;:21;;;;;55721:7;55727:1;55721:3;:7;:::i;:::-;55699:30;;;;;;;;:::i;:::-;;;;;;;;;;:36;;;;-1:-1:-1;;;;;55699:36:0;55684:51;;;55695:1;55684:51;-1:-1:-1;;;;;55677:58:0;;55531:212;-1:-1:-1;;;55531:212:0:o;65079:207::-;71737:10;65150:4;71728:20;;;:8;:20;;;;;;;;71720:58;;;;-1:-1:-1;;;71720:58:0;;17310:2:1;71720:58:0;;;17292:21:1;17349:2;17329:18;;;17322:30;17388:27;17368:18;;;17361:55;17433:18;;71720:58:0;17108:349:1;71720:58:0;-1:-1:-1;;;;;65175:18:0;::::1;65167:59;;;::::0;-1:-1:-1;;;65167:59:0;;13845:2:1;65167:59:0::1;::::0;::::1;13827:21:1::0;13884:2;13864:18;;;13857:30;13923;13903:18;;;13896:58;13971:18;;65167:59:0::1;13643:352:1::0;65167:59:0::1;65237:19;65243:4;65249:6;65237:5;:19::i;67648:99::-:0;67696:16;67732:7;67725:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67725:14:0;;;;;;;;;;;;;;;;;;;;;;67648:99;:::o;40566:438::-;30093:10;40659:4;40742:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;40742:27:0;;;;;;;;;;40659:4;;30093:10;40788:35;;;;40780:85;;;;-1:-1:-1;;;40780:85:0;;19284:2:1;40780:85:0;;;19266:21:1;19323:2;19303:18;;;19296:30;19362:34;19342:18;;;19335:62;19433:7;19413:18;;;19406:35;19458:19;;40780:85:0;19082:401:1;40780:85:0;40901:60;40910:5;40917:7;40945:15;40926:16;:34;40901:8;:60::i;37611:193::-;37690:4;30093:10;37746:28;30093:10;37763:2;37767:6;37746:9;:28::i;58614:591::-;58841:6;58822:15;:25;;58814:67;;;;-1:-1:-1;;;58814:67:0;;11613:2:1;58814:67:0;;;11595:21:1;11652:2;11632:18;;;11625:30;11691:31;11671:18;;;11664:59;11740:18;;58814:67:0;11411:353:1;58814:67:0;58964:58;;;54525:71;58964:58;;;8558:25:1;-1:-1:-1;;;;;8619:55:1;;8599:18;;;8592:83;;;;8691:18;;;8684:34;;;8734:18;;;8727:34;;;58892:14:0;;58909:174;;58937:87;;8530:19:1;;58964:58:0;;;;;;;;;;;;58954:69;;;;;;58937:16;:87::i;:::-;59039:1;59055;59071;58909:13;:174::i;:::-;58892:191;;59111:17;59121:6;59111:9;:17::i;:::-;59102:5;:26;59094:64;;;;-1:-1:-1;;;59094:64:0;;12734:2:1;59094:64:0;;;12716:21:1;12773:2;12753:18;;;12746:30;12812:27;12792:18;;;12785:55;12857:18;;59094:64:0;12532:349:1;59094:64:0;59169:28;59179:6;59187:9;59169;:28::i;:::-;58803:402;58614:591;;;;;;:::o;66341:94::-;71860:5;:3;:5::i;:::-;-1:-1:-1;;;;;71846:19:0;:10;-1:-1:-1;;;;;71846:19:0;;71838:57;;;;-1:-1:-1;;;71838:57:0;;13491:2:1;71838:57:0;;;13473:21:1;13530:2;13510:18;;;13503:30;13569:27;13549:18;;;13542:55;13614:18;;71838:57:0;13289:349:1;71838:57:0;66407:10:::1;:20:::0;;-1:-1:-1;;66407:20:0::1;::::0;::::1;;::::0;;;::::1;::::0;;66341:94::o;68069:243::-;68164:4;68181:36;68190:10;68202:7;68211:5;68181:8;:36::i;:::-;68237:67;;;;;-1:-1:-1;;;;;68237:42:0;;;;;:67;;68280:10;;68292:5;;68299:4;;;;68237:67;;;:::i;67542:98::-;71860:5;:3;:5::i;:::-;-1:-1:-1;;;;;71846:19:0;:10;-1:-1:-1;;;;;71846:19:0;;71838:57;;;;-1:-1:-1;;;71838:57:0;;13491:2:1;71838:57:0;;;13473:21:1;13530:2;13510:18;;;13503:30;13569:27;13549:18;;;13542:55;13614:18;;71838:57:0;13289:349:1;71838:57:0;-1:-1:-1;;;;;67609:15:0::1;67627:5;67609:15:::0;;;:8:::1;:15;::::0;;;;:23;;-1:-1:-1;;67609:23:0::1;::::0;;67542:98::o;69145:668::-;69312:8;69293:15;:27;;69285:70;;;;-1:-1:-1;;;69285:70:0;;15370:2:1;69285:70:0;;;15352:21:1;15409:2;15389:18;;;15382:30;15448:32;15428:18;;;15421:60;15498:18;;69285:70:0;15168:354:1;69285:70:0;69368:18;63149:95;69476:6;69501:7;69527:5;69551:17;69561:6;69551:9;:17::i;:::-;69413:183;;;;;;7995:25:1;;;;-1:-1:-1;;;;;8117:15:1;;;8097:18;;;8090:43;8169:15;;;;8149:18;;;8142:43;8201:18;;;8194:34;8244:19;;;8237:35;8288:19;;;8281:35;;;7967:19;;69413:183:0;;;;;;;;;;;;69389:208;;;;;;69368:229;;69618:41;69631:6;69639:10;69651:1;69654;69657;69618:12;:41::i;:::-;:92;;;;69663:47;69682:6;69690:10;69702:1;69705;69708;69663:18;:47::i;:::-;69610:101;;;;;;69769:36;69778:10;69790:7;69799:5;69769:8;:36::i;:::-;69274:539;69145:668;;;;;;;:::o;66943:129::-;71860:5;:3;:5::i;:::-;-1:-1:-1;;;;;71846:19:0;:10;-1:-1:-1;;;;;71846:19:0;;71838:57;;;;-1:-1:-1;;;71838:57:0;;13491:2:1;71838:57:0;;;13473:21:1;13530:2;13510:18;;;13503:30;13569:27;13549:18;;;13542:55;13614:18;;71838:57:0;13289:349:1;71838:57:0;67022:10:::1;;67003:15;:29;;66995:38;;;::::0;::::1;;67052:12;::::0;67044:5:::1;:20:::0;;-1:-1:-1;;;;;67052:12:0;;::::1;;67044:20;-1:-1:-1::0;;67044:20:0;;::::1;::::0;;;::::1;::::0;;66943:129::o;65294:241::-;71737:10;65384:4;71728:20;;;:8;:20;;;;;;;;71720:58;;;;-1:-1:-1;;;71720:58:0;;17310:2:1;71720:58:0;;;17292:21:1;17349:2;17329:18;;;17322:30;17388:27;17368:18;;;17361:55;17433:18;;71720:58:0;17108:349:1;71720:58:0;65410:22:::1;65416:7;65425:6;65410:5;:22::i;:::-;65475:7;-1:-1:-1::0;;;;;65457:34:0::1;65467:6;65457:34;65484:6;65457:34;;;;7672:25:1::0;;7660:2;7645:18;;7526:177;65457:34:0::1;;;;;;;;-1:-1:-1::0;65518:4:0::1;65294:241:::0;;;;;:::o;54845:150::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;54961:21:0;;;;;;:12;:21;;;;;:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;;54954:33;;;;;;;;;54961:26;;54954:33;;;;;;;;;-1:-1:-1;;;;;54954:33:0;;;;;;;;;54845:150;-1:-1:-1;;;54845:150:0:o;66080:167::-;66116:7;66159:10;;66140:15;:29;66136:81;;-1:-1:-1;66193:12:0;;-1:-1:-1;;;;;66193:12:0;;66080:167::o;66136:81::-;-1:-1:-1;66234:5:0;;;;;-1:-1:-1;;;;;66234:5:0;;66080:167::o;67080:212::-;71860:5;:3;:5::i;:::-;-1:-1:-1;;;;;71846:19:0;:10;-1:-1:-1;;;;;71846:19:0;;71838:57;;;;-1:-1:-1;;;71838:57:0;;13491:2:1;71838:57:0;;;13473:21:1;13530:2;13510:18;;;13503:30;13569:27;13549:18;;;13542:55;13614:18;;71838:57:0;13289:349:1;71838:57:0;-1:-1:-1;;;;;67152:19:0;::::1;67144:60;;;::::0;-1:-1:-1;;;67144:60:0;;13845:2:1;67144:60:0::1;::::0;::::1;13827:21:1::0;13884:2;13864:18;;;13857:30;13923;13903:18;;;13896:58;13971:18;;67144:60:0::1;13643:352:1::0;67144:60:0::1;67215:13;:21:::0;;-1:-1:-1;;67215:21:0::1;-1:-1:-1::0;;;;;67215:21:0;::::1;;::::0;;67279:5:::1;::::0;67261:23:::1;::::0;:15:::1;:23;:::i;:::-;67247:11;:37:::0;-1:-1:-1;67080:212:0:o;44202:380::-;-1:-1:-1;;;;;44338:19:0;;44330:68;;;;-1:-1:-1;;;44330:68:0;;18879:2:1;44330:68:0;;;18861:21:1;18918:2;18898:18;;;18891:30;18957:34;18937:18;;;18930:62;19028:6;19008:18;;;19001:34;19052:19;;44330:68:0;18677:400:1;44330:68:0;-1:-1:-1;;;;;44417:21:0;;44409:68;;;;-1:-1:-1;;;44409:68:0;;13088:2:1;44409:68:0;;;13070:21:1;13127:2;13107:18;;;13100:30;13166:34;13146:18;;;13139:62;13237:4;13217:18;;;13210:32;13259:19;;44409:68:0;12886:398:1;44409:68:0;-1:-1:-1;;;;;44490:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;44542:32;;7672:25:1;;;44542:32:0;;7645:18:1;44542:32:0;;;;;;;44202:380;;;:::o;44869:453::-;-1:-1:-1;;;;;37983:18:0;;;45004:24;37983:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;45071:37:0;;45067:248;;45153:6;45133:16;:26;;45125:68;;;;-1:-1:-1;;;45125:68:0;;14202:2:1;45125:68:0;;;14184:21:1;14241:2;14221:18;;;14214:30;14280:31;14260:18;;;14253:59;14329:18;;45125:68:0;14000:353:1;45125:68:0;45237:51;45246:5;45253:7;45281:6;45262:16;:25;45237:8;:51::i;:::-;44993:329;44869:453;;;:::o;41483:671::-;-1:-1:-1;;;;;41614:18:0;;41606:68;;;;-1:-1:-1;;;41606:68:0;;18066:2:1;41606:68:0;;;18048:21:1;18105:2;18085:18;;;18078:30;18144:34;18124:18;;;18117:62;18215:7;18195:18;;;18188:35;18240:19;;41606:68:0;17864:401:1;41606:68:0;-1:-1:-1;;;;;41693:16:0;;41685:64;;;;-1:-1:-1;;;41685:64:0;;10849:2:1;41685:64:0;;;10831:21:1;10888:2;10868:18;;;10861:30;10927:34;10907:18;;;10900:62;10998:5;10978:18;;;10971:33;11021:19;;41685:64:0;10647:399:1;41685:64:0;-1:-1:-1;;;;;41835:15:0;;41813:19;41835:15;;;;;;;;;;;41869:21;;;;41861:72;;;;-1:-1:-1;;;41861:72:0;;14560:2:1;41861:72:0;;;14542:21:1;14599:2;14579:18;;;14572:30;14638:34;14618:18;;;14611:62;14709:8;14689:18;;;14682:36;14735:19;;41861:72:0;14358:402:1;41861:72:0;-1:-1:-1;;;;;41969:15:0;;;:9;:15;;;;;;;;;;;41987:20;;;41969:38;;42029:13;;;;;;;;:23;;42001:6;;41969:9;42029:23;;42001:6;;42029:23;:::i;:::-;;;;;;;;42085:2;-1:-1:-1;;;;;42070:26:0;42079:4;-1:-1:-1;;;;;42070:26:0;;42089:6;42070:26;;;;7672:25:1;;7660:2;7645:18;;7526:177;42070:26:0;;;;;;;;42109:37;42129:4;42135:2;42139:6;42109:19;:37::i;27933:314::-;27986:7;28018:4;-1:-1:-1;;;;;28027:12:0;28010:29;;:66;;;;;28060:16;28043:13;:33;28010:66;28006:234;;;-1:-1:-1;28100:24:0;;27933:314::o;28006:234::-;-1:-1:-1;28436:73:0;;;28186:10;28436:73;;;;9031:25:1;;;;28198:12:0;9072:18:1;;;9065:34;28212:15:0;9115:18:1;;;9108:34;28480:13:0;9158:18:1;;;9151:34;28503:4:0;9201:19:1;;;;9194:84;;;;28436:73:0;;;;;;;;;;9003:19:1;;;;28436:73:0;;;28426:84;;;;;;52743:115::o;56850:1482::-;57983:12;;56949:7;;;58032:236;58045:4;58039:3;:10;58032:236;;;58066:11;58080:23;58093:3;58098:4;58080:12;:23::i;:::-;58066:37;;58145:11;58122:5;58128:3;58122:10;;;;;;;;:::i;:::-;;;;;;;;;;:20;;;:34;58118:139;;;58184:3;58177:10;;58118:139;;;58234:7;:3;58240:1;58234:7;:::i;:::-;58228:13;;58118:139;58051:217;58032:236;;;58287:9;;:37;;58303:5;58309:8;58316:1;58309:4;:8;:::i;:::-;58303:15;;;;;;;;:::i;:::-;;;;;;;;;;:21;;;;-1:-1:-1;;;;;58303:21:0;58287:37;;;58299:1;58287:37;-1:-1:-1;;;;;58280:44:0;;56850:1482;-1:-1:-1;;;;;56850:1482:0:o;64763:145::-;64877:23;64889:2;64893:6;64877:11;:23::i;64916:155::-;65035:28;65047:7;65056:6;65035:11;:28::i;60655:388::-;-1:-1:-1;;;;;55420:19:0;;;60740:23;55420:19;;;:10;:19;;;;;;;;;;37379:18;;;;;;;60855:21;;;;:33;;;-1:-1:-1;;60855:33:0;;;;;;;60906:54;;55420:19;;;;;37379:18;;60855:33;;55420:19;;;60906:54;;60740:23;60906:54;60973:62;60990:15;61007:9;61018:16;60973;:62::i;52996:207::-;-1:-1:-1;;;;;53117:14:0;;53056:15;53117:14;;;:7;:14;;;;;12544;;12681:1;12663:19;;;;12544:14;53178:17;53073:130;52996:207;;;:::o;70835:403::-;70947:4;70964:12;71067:20;:18;:20::i;:::-;71003:114;;-1:-1:-1;;;71003:114:0;;;5639:79:1;5734:11;;;5727:27;;;;5770:12;;;5763:28;;;5807:12;;71003:114:0;;;;-1:-1:-1;;71003:114:0;;;;;;;;;70979:139;;71003:114;70979:139;;;;71129:14;71146:24;;;;;;;;;9516:25:1;;;9589:4;9577:17;;9557:18;;;9550:45;;;;9611:18;;;9604:34;;;9654:18;;;9647:34;;;70979:139:0;;-1:-1:-1;71129:14:0;71146:24;;9488:19:1;;71146:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;71146:24:0;;-1:-1:-1;;71146:24:0;;;-1:-1:-1;;;;;;;71189:20:0;;;;;;:40;;;71223:6;-1:-1:-1;;;;;71213:16:0;:6;-1:-1:-1;;;;;71213:16:0;;71189:40;71181:49;70835:403;-1:-1:-1;;;;;;;;70835:403:0:o;71246:433::-;71364:4;71381:12;71508:20;:18;:20::i;:::-;71420:138;;5201:66:1;71420:138:0;;;5189:79:1;5284:12;;;5277:28;;;;5321:12;;;5314:28;;;5358:12;;71420:138:0;4931:445:1;3198:190:0;3254:6;3290:16;3281:25;;;3273:76;;;;-1:-1:-1;;;3273:76:0;;18472:2:1;3273:76:0;;;18454:21:1;18511:2;18491:18;;;18484:30;18550:34;18530:18;;;18523:62;18621:8;18601:18;;;18594:36;18647:19;;3273:76:0;18270:402:1;3273:76:0;-1:-1:-1;3374:5:0;3198:190::o;29160:167::-;29237:7;29264:55;29286:20;:18;:20::i;:::-;29308:10;24630:57;;-1:-1:-1;;;24630:57:0;;;5639:79:1;5734:11;;;5727:27;;;5770:12;;;5763:28;;;24593:7:0;;5807:12:1;;24630:57:0;;;;;;;;;;;;24620:68;;;;;;24613:75;;24500:196;;;;;22809:279;22937:7;22958:17;22977:18;22999:25;23010:4;23016:1;23019;23022;22999:10;:25::i;:::-;22957:67;;;;23035:18;23047:5;23035:11;:18::i;:::-;-1:-1:-1;23071:9:0;22809:279;-1:-1:-1;;;;;22809:279:0:o;45922:125::-;;;;:::o;64562:193::-;64704:43;64730:4;64736:2;64740:6;64704:25;:43::i;11013:156::-;11075:7;11150:11;11160:1;11151:5;;;11150:11;:::i;:::-;11140:21;;11141:5;;;11140:21;:::i;59511:290::-;59596:28;59608:7;59617:6;59596:11;:28::i;:::-;37195:12;;-1:-1:-1;;;;;;59643:29:0;59635:90;;;;-1:-1:-1;;;59635:90:0;;16132:2:1;59635:90:0;;;16114:21:1;16171:2;16151:18;;;16144:30;16210:34;16190:18;;;16183:62;16281:18;16261;;;16254:46;16317:19;;59635:90:0;15930:412:1;59635:90:0;59738:55;59755:23;59780:4;59786:6;59738:16;:55::i;59895:194::-;59980:28;59992:7;60001:6;59980:11;:28::i;:::-;60021:60;60038:23;60063:9;60074:6;60021:16;:60::i;61051:643::-;61183:3;-1:-1:-1;;;;;61176:10:0;:3;-1:-1:-1;;;;;61176:10:0;;;:24;;;;;61199:1;61190:6;:10;61176:24;61172:515;;;-1:-1:-1;;;;;61221:17:0;;;61217:224;;-1:-1:-1;;;;;61317:17:0;;61260;61317;;;:12;:17;;;;;61260;;61300:54;;61336:9;61347:6;61300:16;:54::i;:::-;61259:95;;;;61399:3;-1:-1:-1;;;;;61378:47:0;;61404:9;61415;61378:47;;;;;;20594:25:1;;;20650:2;20635:18;;20628:34;20582:2;20567:18;;20420:248;61378:47:0;;;;;;;;61240:201;;61217:224;-1:-1:-1;;;;;61461:17:0;;;61457:219;;-1:-1:-1;;;;;61557:17:0;;61500;61557;;;:12;:17;;;;;61500;;61540:49;;61576:4;61582:6;61540:16;:49::i;:::-;61499:90;;;;61634:3;-1:-1:-1;;;;;61613:47:0;;61639:9;61650;61613:47;;;;;;20594:25:1;;;20650:2;20635:18;;20628:34;20582:2;20567:18;;20420:248;61613:47:0;;;;;;;;61480:196;;61051:643;;;:::o;21038:1632::-;21169:7;;22103:66;22090:79;;22086:163;;;-1:-1:-1;22202:1:0;;-1:-1:-1;22206:30:0;22186:51;;22086:163;22263:1;:7;;22268:2;22263:7;;:18;;;;;22274:1;:7;;22279:2;22274:7;;22263:18;22259:102;;;-1:-1:-1;22314:1:0;;-1:-1:-1;22318:30:0;22298:51;;22259:102;22475:24;;;22458:14;22475:24;;;;;;;;;9516:25:1;;;9589:4;9577:17;;9557:18;;;9550:45;;;;9611:18;;;9604:34;;;9654:18;;;9647:34;;;22475:24:0;;9488:19:1;;22475:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22475:24:0;;-1:-1:-1;;22475:24:0;;;-1:-1:-1;;;;;;;22514:20:0;;22510:103;;22567:1;22571:29;22551:50;;;;;;;22510:103;22633:6;-1:-1:-1;22641:20:0;;-1:-1:-1;21038:1632:0;;;;;;;;:::o;15747:643::-;15825:20;15816:5;:29;;;;;;;;:::i;:::-;;15812:571;;;15747:643;:::o;15812:571::-;15923:29;15914:5;:38;;;;;;;;:::i;:::-;;15910:473;;;15969:34;;-1:-1:-1;;;15969:34:0;;10496:2:1;15969:34:0;;;10478:21:1;10535:2;10515:18;;;10508:30;10574:26;10554:18;;;10547:54;10618:18;;15969:34:0;10294:348:1;15910:473:0;16034:35;16025:5;:44;;;;;;;;:::i;:::-;;16021:362;;;16086:41;;-1:-1:-1;;;16086:41:0;;12374:2:1;16086:41:0;;;12356:21:1;12413:2;12393:18;;;12386:30;12452:33;12432:18;;;12425:61;12503:18;;16086:41:0;12172:355:1;16021:362:0;16158:30;16149:5;:39;;;;;;;;:::i;:::-;;16145:238;;;16205:44;;-1:-1:-1;;;16205:44:0;;14967:2:1;16205:44:0;;;14949:21:1;15006:2;14986:18;;;14979:30;15045:34;15025:18;;;15018:62;-1:-1:-1;;;15096:18:1;;;15089:32;15138:19;;16205:44:0;14765:398:1;16145:238:0;16280:30;16271:5;:39;;;;;;;;:::i;:::-;;16267:116;;;16327:44;;-1:-1:-1;;;16327:44:0;;15729:2:1;16327:44:0;;;15711:21:1;15768:2;15748:18;;;15741:30;15807:34;15787:18;;;15780:62;-1:-1:-1;;;15858:18:1;;;15851:32;15900:19;;16327:44:0;15527:398:1;60229:262:0;-1:-1:-1;;;;;55420:19:0;;;55393:7;55420:19;;;:10;:19;;;;;;;;;;;;;;;60427:56;;55420:19;;;;;60476:6;60427:16;:56::i;42441:399::-;-1:-1:-1;;;;;42525:21:0;;42517:65;;;;-1:-1:-1;;;42517:65:0;;19690:2:1;42517:65:0;;;19672:21:1;19729:2;19709:18;;;19702:30;19768:33;19748:18;;;19741:61;19819:18;;42517:65:0;19488:355:1;42517:65:0;42673:6;42657:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;42690:18:0;;:9;:18;;;;;;;;;;:28;;42712:6;;42690:9;:28;;42712:6;;42690:28;:::i;:::-;;;;-1:-1:-1;;42734:37:0;;7672:25:1;;;-1:-1:-1;;;;;42734:37:0;;;42751:1;;42734:37;;7660:2:1;7645:18;42734:37:0;;;;;;;42784:48;42812:1;42816:7;42825:6;42784:19;:48::i;62355:98::-;62413:7;62440:5;62444:1;62440;:5;:::i;61702:645::-;61939:12;;61876:17;;;;61974:8;;:35;;61989:5;61995:7;62001:1;61995:3;:7;:::i;:::-;61989:14;;;;;;;;:::i;:::-;;;;;;;;;;:20;;;;-1:-1:-1;;;;;61989:20:0;61974:35;;;61985:1;61974:35;-1:-1:-1;;;;;61962:47:0;;;62032:20;62035:9;62046:5;62032:2;:20;;:::i;:::-;62020:32;;62075:1;62069:3;:7;:51;;;;-1:-1:-1;62108:12:0;62080:5;62086:7;62092:1;62086:3;:7;:::i;:::-;62080:14;;;;;;;;:::i;:::-;;;;;;;;;;:24;;;:40;62069:51;62065:275;;;62160:29;62179:9;62160:18;:29::i;:::-;62137:5;62143:7;62149:1;62143:3;:7;:::i;:::-;62137:14;;;;;;;;:::i;:::-;;;;;;;;:20;;;:52;;;;;-1:-1:-1;;;;;62137:52:0;;;;;-1:-1:-1;;;;;62137:52:0;;;;;;62065:275;;;62222:5;62233:94;;;;;;;;62256:31;62274:12;62256:17;:31::i;:::-;62233:94;;;;;;62296:29;62315:9;62296:18;:29::i;:::-;-1:-1:-1;;;;;62233:94:0;;;;;;62222:106;;;;;;;-1:-1:-1;62222:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62065:275;61914:433;61702:645;;;;;;:::o;43173:591::-;-1:-1:-1;;;;;43257:21:0;;43249:67;;;;-1:-1:-1;;;43249:67:0;;17664:2:1;43249:67:0;;;17646:21:1;17703:2;17683:18;;;17676:30;17742:34;17722:18;;;17715:62;17813:3;17793:18;;;17786:31;17834:19;;43249:67:0;17462:397:1;43249:67:0;-1:-1:-1;;;;;43416:18:0;;43391:22;43416:18;;;;;;;;;;;43453:24;;;;43445:71;;;;-1:-1:-1;;;43445:71:0;;11971:2:1;43445:71:0;;;11953:21:1;12010:2;11990:18;;;11983:30;12049:34;12029:18;;;12022:62;12120:4;12100:18;;;12093:32;12142:19;;43445:71:0;11769:398:1;43445:71:0;-1:-1:-1;;;;;43552:18:0;;:9;:18;;;;;;;;;;43573:23;;;43552:44;;43618:12;:22;;43590:6;;43552:9;43618:22;;43590:6;;43618:22;:::i;:::-;;;;-1:-1:-1;;43658:37:0;;7672:25:1;;;43684:1:0;;-1:-1:-1;;;;;43658:37:0;;;;;7660:2:1;7645:18;43658:37:0;;;;;;;43708:48;43728:7;43745:1;43749:6;43708:19;:48::i;62461:103::-;62524:7;62551:5;62555:1;62551;:5;:::i;1228:195::-;1285:7;-1:-1:-1;;;;;1313:26:0;;;1305:78;;;;-1:-1:-1;;;1305:78:0;;16549:2:1;1305:78:0;;;16531:21:1;16588:2;16568:18;;;16561:30;16627:34;16607:18;;;16600:62;16698:9;16678:18;;;16671:37;16725:19;;1305:78:0;16347:403:1;14:196;82:20;;-1:-1:-1;;;;;131:54:1;;121:65;;111:93;;200:1;197;190:12;215:156;281:20;;341:4;330:16;;320:27;;310:55;;361:1;358;351:12;376:186;435:6;488:2;476:9;467:7;463:23;459:32;456:52;;;504:1;501;494:12;456:52;527:29;546:9;527:29;:::i;567:260::-;635:6;643;696:2;684:9;675:7;671:23;667:32;664:52;;;712:1;709;702:12;664:52;735:29;754:9;735:29;:::i;:::-;725:39;;783:38;817:2;806:9;802:18;783:38;:::i;:::-;773:48;;567:260;;;;;:::o;832:328::-;909:6;917;925;978:2;966:9;957:7;953:23;949:32;946:52;;;994:1;991;984:12;946:52;1017:29;1036:9;1017:29;:::i;:::-;1007:39;;1065:38;1099:2;1088:9;1084:18;1065:38;:::i;:::-;1055:48;;1150:2;1139:9;1135:18;1122:32;1112:42;;832:328;;;;;:::o;1165:606::-;1276:6;1284;1292;1300;1308;1316;1324;1377:3;1365:9;1356:7;1352:23;1348:33;1345:53;;;1394:1;1391;1384:12;1345:53;1417:29;1436:9;1417:29;:::i;:::-;1407:39;;1465:38;1499:2;1488:9;1484:18;1465:38;:::i;:::-;1455:48;;1550:2;1539:9;1535:18;1522:32;1512:42;;1601:2;1590:9;1586:18;1573:32;1563:42;;1624:37;1656:3;1645:9;1641:19;1624:37;:::i;:::-;1614:47;;1708:3;1697:9;1693:19;1680:33;1670:43;;1760:3;1749:9;1745:19;1732:33;1722:43;;1165:606;;;;;;;;;;:::o;1776:254::-;1844:6;1852;1905:2;1893:9;1884:7;1880:23;1876:32;1873:52;;;1921:1;1918;1911:12;1873:52;1944:29;1963:9;1944:29;:::i;:::-;1934:39;2020:2;2005:18;;;;1992:32;;-1:-1:-1;;;1776:254:1:o;2035:733::-;2123:6;2131;2139;2147;2200:2;2188:9;2179:7;2175:23;2171:32;2168:52;;;2216:1;2213;2206:12;2168:52;2239:29;2258:9;2239:29;:::i;:::-;2229:39;;2315:2;2304:9;2300:18;2287:32;2277:42;;2370:2;2359:9;2355:18;2342:32;2393:18;2434:2;2426:6;2423:14;2420:34;;;2450:1;2447;2440:12;2420:34;2488:6;2477:9;2473:22;2463:32;;2533:7;2526:4;2522:2;2518:13;2514:27;2504:55;;2555:1;2552;2545:12;2504:55;2595:2;2582:16;2621:2;2613:6;2610:14;2607:34;;;2637:1;2634;2627:12;2607:34;2682:7;2677:2;2668:6;2664:2;2660:15;2656:24;2653:37;2650:57;;;2703:1;2700;2693:12;2650:57;2035:733;;;;-1:-1:-1;;2734:2:1;2726:11;;-1:-1:-1;;;2035:733:1:o;2773:531::-;2875:6;2883;2891;2899;2907;2915;2968:3;2956:9;2947:7;2943:23;2939:33;2936:53;;;2985:1;2982;2975:12;2936:53;3008:29;3027:9;3008:29;:::i;:::-;2998:39;;3084:2;3073:9;3069:18;3056:32;3046:42;;3135:2;3124:9;3120:18;3107:32;3097:42;;3158:36;3190:2;3179:9;3175:18;3158:36;:::i;:::-;3148:46;;3241:3;3230:9;3226:19;3213:33;3203:43;;3293:3;3282:9;3278:19;3265:33;3255:43;;2773:531;;;;;;;;:::o;3309:350::-;3376:6;3384;3437:2;3425:9;3416:7;3412:23;3408:32;3405:52;;;3453:1;3450;3443:12;3405:52;3476:29;3495:9;3476:29;:::i;:::-;3466:39;;3555:2;3544:9;3540:18;3527:32;3599:10;3592:5;3588:22;3581:5;3578:33;3568:61;;3625:1;3622;3615:12;3568:61;3648:5;3638:15;;;3309:350;;;;;:::o;3664:241::-;3720:6;3773:2;3761:9;3752:7;3748:23;3744:32;3741:52;;;3789:1;3786;3779:12;3741:52;3828:9;3815:23;3847:28;3869:5;3847:28;:::i;3910:245::-;3977:6;4030:2;4018:9;4009:7;4005:23;4001:32;3998:52;;;4046:1;4043;4036:12;3998:52;4078:9;4072:16;4097:28;4119:5;4097:28;:::i;4160:322::-;4237:6;4245;4253;4306:2;4294:9;4285:7;4281:23;4277:32;4274:52;;;4322:1;4319;4312:12;4274:52;4358:9;4345:23;4335:33;;4387:38;4421:2;4410:9;4406:18;4387:38;:::i;4487:180::-;4546:6;4599:2;4587:9;4578:7;4574:23;4570:32;4567:52;;;4615:1;4612;4605:12;4567:52;-1:-1:-1;4638:23:1;;4487:180;-1:-1:-1;4487:180:1:o;4672:254::-;4740:6;4748;4801:2;4789:9;4780:7;4776:23;4772:32;4769:52;;;4817:1;4814;4807:12;4769:52;4853:9;4840:23;4830:33;;4882:38;4916:2;4905:9;4901:18;4882:38;:::i;6061:582::-;-1:-1:-1;;;;;6278:6:1;6274:55;6263:9;6256:74;6366:6;6361:2;6350:9;6346:18;6339:34;6409:2;6404;6393:9;6389:18;6382:30;6448:6;6443:2;6432:9;6428:18;6421:34;6506:6;6498;6492:3;6481:9;6477:19;6464:49;6563:1;6533:22;;;6557:3;6529:32;;;6522:43;;;;6626:2;6605:15;;;-1:-1:-1;;6601:29:1;6586:45;6582:55;;6061:582;-1:-1:-1;;;6061:582:1:o;6648:681::-;6819:2;6871:21;;;6941:13;;6844:18;;;6963:22;;;6790:4;;6819:2;7042:15;;;;7016:2;7001:18;;;6790:4;7085:218;7099:6;7096:1;7093:13;7085:218;;;7164:13;;-1:-1:-1;;;;;7160:62:1;7148:75;;7278:15;;;;7243:12;;;;7121:1;7114:9;7085:218;;;-1:-1:-1;7320:3:1;;6648:681;-1:-1:-1;;;;;;6648:681:1:o;9692:597::-;9804:4;9833:2;9862;9851:9;9844:21;9894:6;9888:13;9937:6;9932:2;9921:9;9917:18;9910:34;9962:1;9972:140;9986:6;9983:1;9980:13;9972:140;;;10081:14;;;10077:23;;10071:30;10047:17;;;10066:2;10043:26;10036:66;10001:10;;9972:140;;;10130:6;10127:1;10124:13;10121:91;;;10200:1;10195:2;10186:6;10175:9;10171:22;10167:31;10160:42;10121:91;-1:-1:-1;10273:2:1;10252:15;-1:-1:-1;;10248:29:1;10233:45;;;;10280:2;10229:54;;9692:597;-1:-1:-1;;;9692:597:1:o;21059:128::-;21099:3;21130:1;21126:6;21123:1;21120:13;21117:39;;;21136:18;;:::i;:::-;-1:-1:-1;21172:9:1;;21059:128::o;21192:274::-;21232:1;21258;21248:189;;-1:-1:-1;;;21290:1:1;21283:88;21394:4;21391:1;21384:15;21422:4;21419:1;21412:15;21248:189;-1:-1:-1;21451:9:1;;21192:274::o;21471:125::-;21511:4;21539:1;21536;21533:8;21530:34;;;21544:18;;:::i;:::-;-1:-1:-1;21581:9:1;;21471:125::o;21601:437::-;21680:1;21676:12;;;;21723;;;21744:61;;21798:4;21790:6;21786:17;21776:27;;21744:61;21851:2;21843:6;21840:14;21820:18;21817:38;21814:218;;;-1:-1:-1;;;21885:1:1;21878:88;21989:4;21986:1;21979:15;22017:4;22014:1;22007:15;22043:184;-1:-1:-1;;;22092:1:1;22085:88;22192:4;22189:1;22182:15;22216:4;22213:1;22206:15;22232:184;-1:-1:-1;;;22281:1:1;22274:88;22381:4;22378:1;22371:15;22405:4;22402:1;22395:15;22421:184;-1:-1:-1;;;22470:1:1;22463:88;22570:4;22567:1;22560:15;22594:4;22591:1;22584:15;22610:118;22696:5;22689:13;22682:21;22675:5;22672:32;22662:60;;22718:1;22715;22708:12
Swarm Source
ipfs://7ed17593b540c87ddb130ba1c761ad8423086d4104a4cee371c00a42ada59fab
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.