ERC-721
Overview
Max Total Supply
888 ELEV8
Holders
262
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 ELEV8Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Elev8
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-13 */ // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof} * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // 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/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: [email protected]/contracts/IERC721A.sol // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A is IERC721, IERC721Metadata { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); } // File: [email protected]/contracts/ERC721A.sol // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721A { using Address for address; using Strings for uint256; // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner) if(!isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract()) if(!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: contracts/Elev8.sol pragma solidity 0.8.13; contract Elev8 is ERC721A, Ownable, ReentrancyGuard { using Strings for uint256; uint256 public constant GENESIS_SUPPLY = 888; uint256 public constant MAX_PER_PUBLIC_GENESIS_TX = 5; uint256 public constant MAX_PER_GENESIS_ADDRESS = 2; uint256 public constant MAX_PER_PUBLIC_MINT_TX = 10; uint256 public constant RESERVE_QTY = 18; uint256 public publicSalePrice = 0.04 ether; uint256 public maxSupply = 8888; uint256 public genesisMintCount; uint256 public balanceAfterTeamPayments; bytes32 public genesisMerkleRoot; bool public genesisMintActive; bool public genesisPublicMintActive; bool public publicMintActive; bool public genesisMintsRevealed; bool public publicMintsRevealed; mapping(address => uint256) public genesisMintCounts; string private _baseUri; string private _contractURI; address[2] private _admins; address private constant _PROJECT = 0x15B31F13D09420c0ADCB3A9AF7be29d6AdCF31BA; address private constant _PICO = 0x86190c50d1dD3Eeb2Ab1dbb8E7195F2195AF321f; bool private _adminsSet = false; uint256 private _qtyReserved = 0; event GenesisMintStateChanged(address indexed caller, bool indexed active); event GenesisPublicMintStateChanged(address indexed caller, bool indexed active); event PublicMintStateChanged(address indexed caller, bool indexed active); event PublicSalePriceChanged(address indexed caller, uint256 indexed newPrice); event MaxSupplyChanged(address indexed caller, uint256 newValue); event TeamMemberPayment( address indexed recipient, uint256 totalSold, uint256 baseAmount, uint256 paymentAmount ); modifier canActivate(bool active) { if (active) { require( bytes(_baseUri).length > 0, "Metadata url has not been set" ); } _; } modifier onlyOwnerOrAdmin() { require( _msgSender() == owner() || (_adminsSet && (_msgSender() == _admins[0] || _msgSender() == _admins[1])), "Not owner or admin" ); _; } modifier validProof(bytes32[] calldata merkleProof) { require( MerkleProof.verify( merkleProof, genesisMerkleRoot, keccak256(abi.encodePacked(_msgSender())) ), "Invalid proof" ); _; } constructor(string memory name, string memory symbol) ERC721A(name, symbol) { require( bytes(name).length > 0 && bytes(symbol).length > 0, "Name and Symbol" ); } function genesisMint(uint256 qty, bytes32[] calldata merkleProof) external nonReentrant validProof(merkleProof) { require(genesisMintActive, "Genesis minting inactive"); require( genesisMintCount + qty + RESERVE_QTY <= GENESIS_SUPPLY, "Exceeds available supply" ); require(genesisMintCounts[_msgSender()] + qty <= MAX_PER_GENESIS_ADDRESS, "Exceeds address quantity limit"); genesisMintCount += qty; genesisMintCounts[_msgSender()] += qty; _internalMint(_msgSender(), qty); } function genesisPublicMint(uint256 qty) external nonReentrant { require( genesisPublicMintActive, "Genesis public minting inactive" ); require( genesisMintCount + qty + RESERVE_QTY <= GENESIS_SUPPLY, "Exceeds available supply" ); require(qty <= MAX_PER_PUBLIC_GENESIS_TX, "Exceeds tx quantity limit"); genesisMintCount += qty; _internalMint(_msgSender(), qty); } function mint(uint256 qty) external payable nonReentrant { require(publicMintActive, "Public minting inactive"); require(msg.value == (publicSalePrice * qty), "Incorrect payment amount"); require(qty <= MAX_PER_PUBLIC_MINT_TX, "Exceeds tx quantity limit"); _internalMint(_msgSender(), qty); } function distributeFromReserve(uint256 qty, address recipient) external nonReentrant onlyOwner { require(_qtyReserved + qty <= RESERVE_QTY, "Exceeds reserve quantity"); _qtyReserved += qty; _internalMint(recipient, qty); } function payTeam() external onlyOwnerOrAdmin nonReentrant { require( address(this).balance > balanceAfterTeamPayments, "No payable balance" ); uint256 payableBalance = address(this).balance - balanceAfterTeamPayments; uint256 paymentAmount = (payableBalance * 10) / 100; // 10% // Keep track of the balance after each time the team is paid so we don't pay the team // on amounts they've already been paid from balanceAfterTeamPayments += (payableBalance - paymentAmount); require(payable(_PICO).send(paymentAmount), "Team payment failed"); emit TeamMemberPayment( _PICO, totalSupply() - _qtyReserved - genesisMintCount, // This is the non-free mint qty payableBalance, paymentAmount ); } function withdrawToProjectAccount(uint256 amount) external onlyOwner nonReentrant { require(amount > 0, "Amount cannot be zero"); require( balanceAfterTeamPayments >= amount, "Exceeds withdrawable amount" ); balanceAfterTeamPayments -= amount; require(payable(_PROJECT).send(amount), "Project withdraw failed"); } function setBaseURI(string calldata baseURI) external onlyOwnerOrAdmin { require(bytes(baseURI).length > 0, "baseURI is required"); _baseUri = baseURI; } function setAdmins(address[2] calldata adminAddresses) external onlyOwner { require( adminAddresses[0] != address(0) && adminAddresses[1] != address(0), "Invalid address" ); _admins = adminAddresses; _adminsSet = true; } function setGenesisSaleActive(bool active) external onlyOwnerOrAdmin canActivate(active) { genesisMintActive = active; emit GenesisMintStateChanged(_msgSender(), active); } function setGenesisPublicSaleActive(bool active) external onlyOwnerOrAdmin canActivate(active) { genesisPublicMintActive = active; emit GenesisPublicMintStateChanged(_msgSender(), active); } function setPublicSaleActive(bool active) external onlyOwnerOrAdmin canActivate(active) { publicMintActive = active; emit GenesisMintStateChanged(_msgSender(), active); } function setPublicSalePrice(uint256 newPrice) external onlyOwnerOrAdmin { // The public sale price cannot be increased after the first public // mint, but it can be decreased. Any changes will be communicated beforehand require(newPrice <= publicSalePrice || totalSupply() <= GENESIS_SUPPLY, "Cannot increase price"); publicSalePrice = newPrice; emit PublicSalePriceChanged(_msgSender(), newPrice); } function setMaxSupply(uint256 newValue) external onlyOwnerOrAdmin { require(newValue < maxSupply, "Cannot increase supply"); require(newValue >= totalSupply(), "Total minted exceeds new value"); maxSupply = newValue; emit MaxSupplyChanged(_msgSender(), newValue); } function setGenesisMerkleRoot(bytes32 merkleRoot) external onlyOwnerOrAdmin { genesisMerkleRoot = merkleRoot; } function revealGenesisMints() external onlyOwnerOrAdmin { genesisMintsRevealed = true; } function revealPublicMints() external onlyOwnerOrAdmin { publicMintsRevealed = true; } /// @dev Returns the tokenIds of the address. O(totalSupply) in complexity. /// Inspired by https://github.com/chiru-labs/ERC721A/issues/115#issue-1140835245 /// Modified to bail out of the loop once we've found the expected number of tokens function tokensOfOwner(address owner) external view returns (uint256[] memory) { unchecked { uint256 ownerBalance = balanceOf(owner); uint256[] memory a = new uint256[](ownerBalance); uint256 end = _currentIndex; uint256 tokenIdsIdx; address currOwnershipAddr; for (uint256 i; i < end; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { a[tokenIdsIdx++] = i; } // No need to continue if we've already collected the expected number // of token ids for this owner, so let's bail if (tokenIdsIdx == ownerBalance) { break; } } return a; } } function burn(uint256 tokenId) public { require(_ownerships[tokenId].addr == _msgSender(), "Not owner"); _burn(tokenId); } function setContractURI(string memory newUri) public onlyOwner { _contractURI = newUri; } function tokenURI(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), "Nonexistent tokenId"); return string( abi.encodePacked(_baseUri, "/", tokenId.toString()) ); } function contractURI() public view returns (string memory) { return _contractURI; } function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return super.supportsInterface(interfaceId); } function _baseURI() internal view virtual override returns (string memory) { return _baseUri; } /// @notice By default, ERC721A starts minting from 0, which is undesirable in our case, so we'll /// override that to start from 1 function _startTokenId() internal view virtual override returns (uint256) { return 1; } function _internalMint(address recipient, uint256 qty) private { require(qty > 0, "Quantity cannot be zero"); require( (totalSupply() + qty + (RESERVE_QTY - _qtyReserved)) <= maxSupply, "Exceeds total supply" ); _safeMint(recipient, qty); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"bool","name":"active","type":"bool"}],"name":"GenesisMintStateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"bool","name":"active","type":"bool"}],"name":"GenesisPublicMintStateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"MaxSupplyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"bool","name":"active","type":"bool"}],"name":"PublicMintStateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"PublicSalePriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalSold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"baseAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paymentAmount","type":"uint256"}],"name":"TeamMemberPayment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"GENESIS_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_GENESIS_ADDRESS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_PUBLIC_GENESIS_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_PUBLIC_MINT_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVE_QTY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balanceAfterTeamPayments","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"distributeFromReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"genesisMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"genesisMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"genesisMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"genesisMintCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisMintsRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"genesisPublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"genesisPublicMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"publicMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintsRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealGenesisMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealPublicMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[2]","name":"adminAddresses","type":"address[2]"}],"name":"setAdmins","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newUri","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setGenesisMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"active","type":"bool"}],"name":"setGenesisPublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"active","type":"bool"}],"name":"setGenesisSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"active","type":"bool"}],"name":"setPublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPublicSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawToProjectAccount","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052668e1bc9bf040000600a556122b8600b556015805460ff1916905560006016553480156200003157600080fd5b5060405162003824380380620038248339810160408190526200005491620002bd565b8151829082906200006d9060029060208501906200014a565b508051620000839060039060208401906200014a565b50506001600055506200009633620000f8565b6001600955815115801590620000ad575060008151115b620000f05760405162461bcd60e51b815260206004820152600f60248201526e13985b5948185b990814de5b589bdb608a1b604482015260640160405180910390fd5b505062000363565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001589062000327565b90600052602060002090601f0160209004810192826200017c5760008555620001c7565b82601f106200019757805160ff1916838001178555620001c7565b82800160010185558215620001c7579182015b82811115620001c7578251825591602001919060010190620001aa565b50620001d5929150620001d9565b5090565b5b80821115620001d55760008155600101620001da565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200021857600080fd5b81516001600160401b0380821115620002355762000235620001f0565b604051601f8301601f19908116603f01168101908282118183101715620002605762000260620001f0565b816040528381526020925086838588010111156200027d57600080fd5b600091505b83821015620002a1578582018301518183018401529082019062000282565b83821115620002b35760008385830101525b9695505050505050565b60008060408385031215620002d157600080fd5b82516001600160401b0380821115620002e957600080fd5b620002f78683870162000206565b935060208501519150808211156200030e57600080fd5b506200031d8582860162000206565b9150509250929050565b600181811c908216806200033c57607f821691505b6020821081036200035d57634e487b7160e01b600052602260045260246000fd5b50919050565b6134b180620003736000396000f3fe60806040526004361061031a5760003560e01c80638da5cb5b116101ab578063bfa25026116100f7578063e2e06fa311610095578063eb50411e1161006f578063eb50411e1461090e578063f2fde38b1461092e578063f3fdf3751461094e578063f77e58ae1461096357600080fd5b8063e2e06fa314610890578063e8a3d485146108b0578063e985e9c5146108c557600080fd5b8063ccadd472116100d1578063ccadd47214610818578063d5abeb011461083a578063d642aad114610850578063dc6de2b21461087057600080fd5b8063bfa25026146107c2578063c87b56dd146107e3578063c9a1cb991461080357600080fd5b80639ba9116311610164578063a22cb4651161013e578063a22cb4651461074d578063ac78dc161461076d578063b67c25a314610782578063b88d4fde146107a257600080fd5b80639ba91163146107005780639fbebe811461071a578063a0712d681461073a57600080fd5b80638da5cb5b14610661578063938e3d7b1461067f57806394bc7a941461069f57806395d89b41146106bf57806399ec6765146106d45780639b6860c8146106ea57600080fd5b80635bc6b4011161026a57806370a0823111610223578063791a2519116101fd578063791a2519146105df5780638383f9cd146105ff5780638462151c1461061f5780638bdd1b951461064c57600080fd5b806370a0823114610595578063715018a6146105b5578063783a1d5a146105ca57600080fd5b80635bc6b401146104dc5780636352211e146104f2578063662111ae146105125780636f8b44b0146105285780636fac2b1514610548578063704a68d61461057557600080fd5b806321f3b038116102d75780633b50dcec116102b15780633b50dcec1461046757806342842e0e1461047c57806342966c681461049c57806355f804b3146104bc57600080fd5b806321f3b0381461041357806323b872dd146104285780632a49675e1461044857600080fd5b806301ffc9a71461031f57806306fdde0314610354578063081812fc14610376578063095ea7b3146103ae5780630a6f94fc146103d057806318160ddd146103f0575b600080fd5b34801561032b57600080fd5b5061033f61033a366004612cfe565b610979565b60405190151581526020015b60405180910390f35b34801561036057600080fd5b5061036961098a565b60405161034b9190612d73565b34801561038257600080fd5b50610396610391366004612d86565b610a1c565b6040516001600160a01b03909116815260200161034b565b3480156103ba57600080fd5b506103ce6103c9366004612dbb565b610a60565b005b3480156103dc57600080fd5b506103ce6103eb366004612de5565b610ae6565b3480156103fc57600080fd5b50610405610b8e565b60405190815260200161034b565b34801561041f57600080fd5b50610405600a81565b34801561043457600080fd5b506103ce610443366004612e0d565b610b9c565b34801561045457600080fd5b50600f5461033f90610100900460ff1681565b34801561047357600080fd5b50610405600581565b34801561048857600080fd5b506103ce610497366004612e0d565b610ba7565b3480156104a857600080fd5b506103ce6104b7366004612d86565b610bc2565b3480156104c857600080fd5b506103ce6104d7366004612e49565b610c20565b3480156104e857600080fd5b50610405600c5481565b3480156104fe57600080fd5b5061039661050d366004612d86565b610ce1565b34801561051e57600080fd5b50610405600e5481565b34801561053457600080fd5b506103ce610543366004612d86565b610cf3565b34801561055457600080fd5b50610405610563366004612eba565b60106020526000908152604090205481565b34801561058157600080fd5b506103ce610590366004612ee5565b610e43565b3480156105a157600080fd5b506104056105b0366004612eba565b610f36565b3480156105c157600080fd5b506103ce610f84565b3480156105d657600080fd5b506103ce610f98565b3480156105eb57600080fd5b506103ce6105fa366004612d86565b611021565b34801561060b57600080fd5b506103ce61061a366004612f00565b611126565b34801561062b57600080fd5b5061063f61063a366004612eba565b611379565b60405161034b9190612f7e565b34801561065857600080fd5b50610405600281565b34801561066d57600080fd5b506008546001600160a01b0316610396565b34801561068b57600080fd5b506103ce61069a36600461304d565b6114b4565b3480156106ab57600080fd5b506103ce6106ba366004613095565b6114d3565b3480156106cb57600080fd5b5061036961158b565b3480156106e057600080fd5b5061040561037881565b3480156106f657600080fd5b50610405600a5481565b34801561070c57600080fd5b50600f5461033f9060ff1681565b34801561072657600080fd5b506103ce610735366004612d86565b61159a565b6103ce610748366004612d86565b611611565b34801561075957600080fd5b506103ce6107683660046130c1565b61174c565b34801561077957600080fd5b506103ce6117e1565b34801561078e57600080fd5b50600f5461033f9062010000900460ff1681565b3480156107ae57600080fd5b506103ce6107bd3660046130eb565b611a07565b3480156107ce57600080fd5b50600f5461033f906301000000900460ff1681565b3480156107ef57600080fd5b506103696107fe366004612d86565b611a51565b34801561080f57600080fd5b506103ce611ad0565b34801561082457600080fd5b50600f5461033f90640100000000900460ff1681565b34801561084657600080fd5b50610405600b5481565b34801561085c57600080fd5b506103ce61086b366004612ee5565b611b57565b34801561087c57600080fd5b506103ce61088b366004612d86565b611c46565b34801561089c57600080fd5b506103ce6108ab366004612ee5565b611d9f565b3480156108bc57600080fd5b50610369611e67565b3480156108d157600080fd5b5061033f6108e0366004613166565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561091a57600080fd5b506103ce610929366004612d86565b611e76565b34801561093a57600080fd5b506103ce610949366004612eba565b611fc8565b34801561095a57600080fd5b50610405601281565b34801561096f57600080fd5b50610405600d5481565b60006109848261203e565b92915050565b60606002805461099990613190565b80601f01602080910402602001604051908101604052809291908181526020018280546109c590613190565b8015610a125780601f106109e757610100808354040283529160200191610a12565b820191906000526020600020905b8154815290600101906020018083116109f557829003601f168201915b5050505050905090565b6000610a278261208e565b610a44576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610a6b82610ce1565b9050806001600160a01b0316836001600160a01b031603610a9f5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610ad657610ab981336108e0565b610ad6576040516367d9dca160e11b815260040160405180910390fd5b610ae18383836120c7565b505050565b610aee612123565b6000610afd6020830183612eba565b6001600160a01b031614158015610b2d57506000610b216040830160208401612eba565b6001600160a01b031614155b610b705760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064015b60405180910390fd5b610b7d6013826002612b95565b50506015805460ff19166001179055565b600154600054036000190190565b610ae183838361217d565b610ae183838360405180602001604052806000815250611a07565b6000818152600460205260409020546001600160a01b03163314610c145760405162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b6044820152606401610b67565b610c1d81612358565b50565b6008546001600160a01b0316331480610c76575060155460ff168015610c7657506013546001600160a01b0316336001600160a01b03161480610c7657506014546001600160a01b0316336001600160a01b0316145b610c925760405162461bcd60e51b8152600401610b67906131da565b80610cd55760405162461bcd60e51b815260206004820152601360248201527218985cd9555492481a5cc81c995c5d5a5c9959606a1b6044820152606401610b67565b610ae160118383612beb565b6000610cec82612363565b5192915050565b6008546001600160a01b0316331480610d49575060155460ff168015610d4957506013546001600160a01b0316336001600160a01b03161480610d4957506014546001600160a01b0316336001600160a01b0316145b610d655760405162461bcd60e51b8152600401610b67906131da565b600b548110610daf5760405162461bcd60e51b815260206004820152601660248201527543616e6e6f7420696e63726561736520737570706c7960501b6044820152606401610b67565b610db7610b8e565b811015610e065760405162461bcd60e51b815260206004820152601e60248201527f546f74616c206d696e7465642065786365656473206e65772076616c756500006044820152606401610b67565b600b81905560405181815233907f28c4702f31a5488ef1826a30b4d837dab0940e925b9f503fe0644b7f1bd2f20f9060200160405180910390a250565b6008546001600160a01b0316331480610e99575060155460ff168015610e9957506013546001600160a01b0316336001600160a01b03161480610e9957506014546001600160a01b0316336001600160a01b0316145b610eb55760405162461bcd60e51b8152600401610b67906131da565b808015610eea57600060118054610ecb90613190565b905011610eea5760405162461bcd60e51b8152600401610b6790613206565b600f805460ff1916831515908117909155335b6001600160a01b03167f161a054f8f5c1c1b5e74c919c625095dfa0ac7d9c2fbbea163c6fc4b30f4121860405160405180910390a35050565b60006001600160a01b038216610f5f576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b610f8c612123565b610f966000612485565b565b6008546001600160a01b0316331480610fee575060155460ff168015610fee57506013546001600160a01b0316336001600160a01b03161480610fee57506014546001600160a01b0316336001600160a01b0316145b61100a5760405162461bcd60e51b8152600401610b67906131da565b600f805464ff000000001916640100000000179055565b6008546001600160a01b0316331480611077575060155460ff16801561107757506013546001600160a01b0316336001600160a01b0316148061107757506014546001600160a01b0316336001600160a01b0316145b6110935760405162461bcd60e51b8152600401610b67906131da565b600a54811115806110ad57506103786110aa610b8e565b11155b6110f15760405162461bcd60e51b815260206004820152601560248201527443616e6e6f7420696e63726561736520707269636560581b6044820152606401610b67565b600a819055604051819033907f7e551f7241740ef6751c2f6bc2ba929ee4a88127156bad09dfc6474d4c41006090600090a350565b6002600954036111485760405162461bcd60e51b8152600401610b679061323d565b600260098190555081816111c782828080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e546040516bffffffffffffffffffffffff193360601b1660208201529092506034019050604051602081830303815290604052805190602001206124d7565b6112035760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610b67565b600f5460ff166112555760405162461bcd60e51b815260206004820152601860248201527f47656e65736973206d696e74696e6720696e61637469766500000000000000006044820152606401610b67565b610378601286600c54611268919061328a565b611272919061328a565b11156112bb5760405162461bcd60e51b81526020600482015260186024820152774578636565647320617661696c61626c6520737570706c7960401b6044820152606401610b67565b336000908152601060205260409020546002906112d990879061328a565b11156113275760405162461bcd60e51b815260206004820152601e60248201527f457863656564732061646472657373207175616e74697479206c696d697400006044820152606401610b67565b84600c6000828254611339919061328a565b9091555050336000908152601060205260408120805487929061135d90849061328a565b9091555061136d905033866124ed565b50506001600955505050565b6060600061138683610f36565b90506000816001600160401b038111156113a2576113a2612fc2565b6040519080825280602002602001820160405280156113cb578160200160208202803683370190505b506000805491925080805b838110156114a857600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16158015928201929092529061143d57506114a0565b80516001600160a01b03161561145257805192505b886001600160a01b0316836001600160a01b0316036114915781868580600101965081518110611484576114846131c4565b6020026020010181815250505b86840361149e57506114a8565b505b6001016113d6565b50929695505050505050565b6114bc612123565b80516114cf906012906020840190612c5f565b5050565b6002600954036114f55760405162461bcd60e51b8152600401610b679061323d565b6002600955611502612123565b601282601654611512919061328a565b11156115605760405162461bcd60e51b815260206004820152601860248201527f457863656564732072657365727665207175616e7469747900000000000000006044820152606401610b67565b8160166000828254611572919061328a565b90915550611582905081836124ed565b50506001600955565b60606003805461099990613190565b6008546001600160a01b03163314806115f0575060155460ff1680156115f057506013546001600160a01b0316336001600160a01b031614806115f057506014546001600160a01b0316336001600160a01b0316145b61160c5760405162461bcd60e51b8152600401610b67906131da565b600e55565b6002600954036116335760405162461bcd60e51b8152600401610b679061323d565b6002600955600f5462010000900460ff166116905760405162461bcd60e51b815260206004820152601760248201527f5075626c6963206d696e74696e6720696e6163746976650000000000000000006044820152606401610b67565b80600a5461169e91906132a2565b34146116ec5760405162461bcd60e51b815260206004820152601860248201527f496e636f7272656374207061796d656e7420616d6f756e7400000000000000006044820152606401610b67565b600a8111156117395760405162461bcd60e51b8152602060048201526019602482015278115e18d959591cc81d1e081c5d585b9d1a5d1e481b1a5b5a5d603a1b6044820152606401610b67565b611744335b826124ed565b506001600955565b336001600160a01b038316036117755760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b0316331480611837575060155460ff16801561183757506013546001600160a01b0316336001600160a01b0316148061183757506014546001600160a01b0316336001600160a01b0316145b6118535760405162461bcd60e51b8152600401610b67906131da565b6002600954036118755760405162461bcd60e51b8152600401610b679061323d565b6002600955600d5447116118c05760405162461bcd60e51b81526020600482015260126024820152714e6f2070617961626c652062616c616e636560701b6044820152606401610b67565b6000600d54476118d091906132c1565b9050600060646118e183600a6132a2565b6118eb91906132ee565b90506118f781836132c1565b600d6000828254611908919061328a565b90915550506040517386190c50d1dd3eeb2ab1dbb8e7195f2195af321f9082156108fc029083906000818181858888f1935050505061197f5760405162461bcd60e51b81526020600482015260136024820152721519585b481c185e5b595b9d0819985a5b1959606a1b6044820152606401610b67565b7386190c50d1dd3eeb2ab1dbb8e7195f2195af321f6001600160a01b03167f977a6da50cd34049fc55b2cea88cab5c375867bba0044c08fe032978c16c4ea5600c546016546119cc610b8e565b6119d691906132c1565b6119e091906132c1565b6040805191825260208201869052810184905260600160405180910390a250506001600955565b611a1284848461217d565b6001600160a01b0383163b15611a4b57611a2e848484846125ba565b611a4b576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060611a5c8261208e565b611a9e5760405162461bcd60e51b8152602060048201526013602482015272139bdb995e1a5cdd195b9d081d1bdad95b9259606a1b6044820152606401610b67565b6011611aa9836126a6565b604051602001611aba92919061331e565b6040516020818303038152906040529050919050565b6008546001600160a01b0316331480611b26575060155460ff168015611b2657506013546001600160a01b0316336001600160a01b03161480611b2657506014546001600160a01b0316336001600160a01b0316145b611b425760405162461bcd60e51b8152600401610b67906131da565b600f805463ff00000019166301000000179055565b6008546001600160a01b0316331480611bad575060155460ff168015611bad57506013546001600160a01b0316336001600160a01b03161480611bad57506014546001600160a01b0316336001600160a01b0316145b611bc95760405162461bcd60e51b8152600401610b67906131da565b808015611bfe57600060118054611bdf90613190565b905011611bfe5760405162461bcd60e51b8152600401610b6790613206565b600f805461ff0019166101008415159081029190911790915560405133907fa10f8d478ca08c91de8bca8ba2016b83b9eecf85aab98ca47cc970ab335f907990600090a35050565b611c4e612123565b600260095403611c705760405162461bcd60e51b8152600401610b679061323d565b600260095580611cba5760405162461bcd60e51b8152602060048201526015602482015274416d6f756e742063616e6e6f74206265207a65726f60581b6044820152606401610b67565b80600d541015611d0c5760405162461bcd60e51b815260206004820152601b60248201527f4578636565647320776974686472617761626c6520616d6f756e7400000000006044820152606401610b67565b80600d6000828254611d1e91906132c1565b90915550506040517315b31f13d09420c0adcb3a9af7be29d6adcf31ba9082156108fc029083906000818181858888f193505050506117445760405162461bcd60e51b815260206004820152601760248201527f50726f6a656374207769746864726177206661696c65640000000000000000006044820152606401610b67565b6008546001600160a01b0316331480611df5575060155460ff168015611df557506013546001600160a01b0316336001600160a01b03161480611df557506014546001600160a01b0316336001600160a01b0316145b611e115760405162461bcd60e51b8152600401610b67906131da565b808015611e4657600060118054611e2790613190565b905011611e465760405162461bcd60e51b8152600401610b6790613206565b600f805462ff00001916620100008415159081029190911790915533610efd565b60606012805461099990613190565b600260095403611e985760405162461bcd60e51b8152600401610b679061323d565b6002600955600f54610100900460ff16611ef45760405162461bcd60e51b815260206004820152601f60248201527f47656e65736973207075626c6963206d696e74696e6720696e616374697665006044820152606401610b67565b610378601282600c54611f07919061328a565b611f11919061328a565b1115611f5a5760405162461bcd60e51b81526020600482015260186024820152774578636565647320617661696c61626c6520737570706c7960401b6044820152606401610b67565b6005811115611fa75760405162461bcd60e51b8152602060048201526019602482015278115e18d959591cc81d1e081c5d585b9d1a5d1e481b1a5b5a5d603a1b6044820152606401610b67565b80600c6000828254611fb9919061328a565b9091555061174490503361173e565b611fd0612123565b6001600160a01b0381166120355760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b67565b610c1d81612485565b60006001600160e01b031982166380ac58cd60e01b148061206f57506001600160e01b03198216635b5e139f60e01b145b8061098457506301ffc9a760e01b6001600160e01b0319831614610984565b6000816001111580156120a2575060005482105b8015610984575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314610f965760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b67565b600061218882612363565b9050836001600160a01b031681600001516001600160a01b0316146121bf5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b03861614806121dd57506121dd85336108e0565b806121f85750336121ed84610a1c565b6001600160a01b0316145b90508061221857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661223f57604051633a954ecd60e21b815260040160405180910390fd5b61224b600084876120c7565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661231f57600054821461231f57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b031660008051602061345c83398151915260405160405180910390a45050505050565b610c1d8160006127a6565b6040805160608101825260008082526020820181905291810191909152818060011161246c5760005481101561246c57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615159181018290529061246a5780516001600160a01b031615612401579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612465579392505050565b612401565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000826124e48584612959565b14949350505050565b6000811161253d5760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f0000000000000000006044820152606401610b67565b600b5460165461254e9060126132c1565b82612557610b8e565b612561919061328a565b61256b919061328a565b11156125b05760405162461bcd60e51b81526020600482015260146024820152734578636565647320746f74616c20737570706c7960601b6044820152606401610b67565b6114cf82826129a6565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906125ef9033908990889088906004016133d4565b6020604051808303816000875af192505050801561262a575060408051601f3d908101601f1916820190925261262791810190613411565b60015b612688573d808015612658576040519150601f19603f3d011682016040523d82523d6000602084013e61265d565b606091505b508051600003612680576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816000036126cd5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156126f757806126e18161342e565b91506126f09050600a836132ee565b91506126d1565b6000816001600160401b0381111561271157612711612fc2565b6040519080825280601f01601f19166020018201604052801561273b576020820181803683370190505b5090505b841561269e576127506001836132c1565b915061275d600a86613447565b61276890603061328a565b60f81b81838151811061277d5761277d6131c4565b60200101906001600160f81b031916908160001a90535061279f600a866132ee565b945061273f565b60006127b183612363565b80519091508215612817576000336001600160a01b03831614806127da57506127da82336108e0565b806127f55750336127ea86610a1c565b6001600160a01b0316145b90508061281557604051632ce44b5f60e11b815260040160405180910390fd5b505b612823600085836120c7565b6001600160a01b0380821660008181526005602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526004909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b17855591890180845292208054919490911661292157600054821461292157805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b0384169060008051602061345c833981519152908390a4505060018054810190555050565b600081815b845181101561299e5761298a8286838151811061297d5761297d6131c4565b60200260200101516129c0565b9150806129968161342e565b91505061295e565b509392505050565b6114cf8282604051806020016040528060008152506129f2565b60008183106129dc5760008281526020849052604090206129eb565b60008381526020839052604090205b9392505050565b6000546001600160a01b038416612a1b57604051622e076360e81b815260040160405180910390fd5b82600003612a3c5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600490925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15612b52575b60405182906001600160a01b0388169060009060008051602061345c833981519152908290a4612b1b60008784806001019550876125ba565b612b38576040516368d2bf6b60e11b815260040160405180910390fd5b808210612ae2578260005414612b4d57600080fd5b612b85565b5b6040516001830192906001600160a01b0388169060009060008051602061345c833981519152908290a4808210612b53575b506000908155611a4b9085838684565b8260028101928215612bdb579160200282015b82811115612bdb5781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612ba8565b50612be7929150612cd3565b5090565b828054612bf790613190565b90600052602060002090601f016020900481019282612c195760008555612bdb565b82601f10612c325782800160ff19823516178555612bdb565b82800160010185558215612bdb579182015b82811115612bdb578235825591602001919060010190612c44565b828054612c6b90613190565b90600052602060002090601f016020900481019282612c8d5760008555612bdb565b82601f10612ca657805160ff1916838001178555612bdb565b82800160010185558215612bdb579182015b82811115612bdb578251825591602001919060010190612cb8565b5b80821115612be75760008155600101612cd4565b6001600160e01b031981168114610c1d57600080fd5b600060208284031215612d1057600080fd5b81356129eb81612ce8565b60005b83811015612d36578181015183820152602001612d1e565b83811115611a4b5750506000910152565b60008151808452612d5f816020860160208601612d1b565b601f01601f19169290920160200192915050565b6020815260006129eb6020830184612d47565b600060208284031215612d9857600080fd5b5035919050565b80356001600160a01b0381168114612db657600080fd5b919050565b60008060408385031215612dce57600080fd5b612dd783612d9f565b946020939093013593505050565b600060408284031215612df757600080fd5b82604083011115612e0757600080fd5b50919050565b600080600060608486031215612e2257600080fd5b612e2b84612d9f565b9250612e3960208501612d9f565b9150604084013590509250925092565b60008060208385031215612e5c57600080fd5b82356001600160401b0380821115612e7357600080fd5b818501915085601f830112612e8757600080fd5b813581811115612e9657600080fd5b866020828501011115612ea857600080fd5b60209290920196919550909350505050565b600060208284031215612ecc57600080fd5b6129eb82612d9f565b80358015158114612db657600080fd5b600060208284031215612ef757600080fd5b6129eb82612ed5565b600080600060408486031215612f1557600080fd5b8335925060208401356001600160401b0380821115612f3357600080fd5b818601915086601f830112612f4757600080fd5b813581811115612f5657600080fd5b8760208260051b8501011115612f6b57600080fd5b6020830194508093505050509250925092565b6020808252825182820181905260009190848201906040850190845b81811015612fb657835183529284019291840191600101612f9a565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115612ff257612ff2612fc2565b604051601f8501601f19908116603f0116810190828211818310171561301a5761301a612fc2565b8160405280935085815286868601111561303357600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561305f57600080fd5b81356001600160401b0381111561307557600080fd5b8201601f8101841361308657600080fd5b61269e84823560208401612fd8565b600080604083850312156130a857600080fd5b823591506130b860208401612d9f565b90509250929050565b600080604083850312156130d457600080fd5b6130dd83612d9f565b91506130b860208401612ed5565b6000806000806080858703121561310157600080fd5b61310a85612d9f565b935061311860208601612d9f565b92506040850135915060608501356001600160401b0381111561313a57600080fd5b8501601f8101871361314b57600080fd5b61315a87823560208401612fd8565b91505092959194509250565b6000806040838503121561317957600080fd5b61318283612d9f565b91506130b860208401612d9f565b600181811c908216806131a457607f821691505b602082108103612e0757634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6020808252601290820152712737ba1037bbb732b91037b91030b236b4b760711b604082015260600190565b6020808252601d908201527f4d657461646174612075726c20686173206e6f74206265656e20736574000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561329d5761329d613274565b500190565b60008160001904831182151516156132bc576132bc613274565b500290565b6000828210156132d3576132d3613274565b500390565b634e487b7160e01b600052601260045260246000fd5b6000826132fd576132fd6132d8565b500490565b60008151613314818560208601612d1b565b9290920192915050565b600080845481600182811c91508083168061333a57607f831692505b6020808410820361335957634e487b7160e01b86526022600452602486fd5b81801561336d576001811461337e576133ab565b60ff198616895284890196506133ab565b60008b81526020902060005b868110156133a35781548b82015290850190830161338a565b505084890196505b5050505050506133cb6133c582602f60f81b815260010190565b85613302565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061340790830184612d47565b9695505050505050565b60006020828403121561342357600080fd5b81516129eb81612ce8565b60006001820161344057613440613274565b5060010190565b600082613456576134566132d8565b50069056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220ada9ced9459d59f04246682d1ab9c5bcb14dbaa61e5a0dc2ac769ca35a524a4c64736f6c634300080d0033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000009456c657638204e465400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005454c455638000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061031a5760003560e01c80638da5cb5b116101ab578063bfa25026116100f7578063e2e06fa311610095578063eb50411e1161006f578063eb50411e1461090e578063f2fde38b1461092e578063f3fdf3751461094e578063f77e58ae1461096357600080fd5b8063e2e06fa314610890578063e8a3d485146108b0578063e985e9c5146108c557600080fd5b8063ccadd472116100d1578063ccadd47214610818578063d5abeb011461083a578063d642aad114610850578063dc6de2b21461087057600080fd5b8063bfa25026146107c2578063c87b56dd146107e3578063c9a1cb991461080357600080fd5b80639ba9116311610164578063a22cb4651161013e578063a22cb4651461074d578063ac78dc161461076d578063b67c25a314610782578063b88d4fde146107a257600080fd5b80639ba91163146107005780639fbebe811461071a578063a0712d681461073a57600080fd5b80638da5cb5b14610661578063938e3d7b1461067f57806394bc7a941461069f57806395d89b41146106bf57806399ec6765146106d45780639b6860c8146106ea57600080fd5b80635bc6b4011161026a57806370a0823111610223578063791a2519116101fd578063791a2519146105df5780638383f9cd146105ff5780638462151c1461061f5780638bdd1b951461064c57600080fd5b806370a0823114610595578063715018a6146105b5578063783a1d5a146105ca57600080fd5b80635bc6b401146104dc5780636352211e146104f2578063662111ae146105125780636f8b44b0146105285780636fac2b1514610548578063704a68d61461057557600080fd5b806321f3b038116102d75780633b50dcec116102b15780633b50dcec1461046757806342842e0e1461047c57806342966c681461049c57806355f804b3146104bc57600080fd5b806321f3b0381461041357806323b872dd146104285780632a49675e1461044857600080fd5b806301ffc9a71461031f57806306fdde0314610354578063081812fc14610376578063095ea7b3146103ae5780630a6f94fc146103d057806318160ddd146103f0575b600080fd5b34801561032b57600080fd5b5061033f61033a366004612cfe565b610979565b60405190151581526020015b60405180910390f35b34801561036057600080fd5b5061036961098a565b60405161034b9190612d73565b34801561038257600080fd5b50610396610391366004612d86565b610a1c565b6040516001600160a01b03909116815260200161034b565b3480156103ba57600080fd5b506103ce6103c9366004612dbb565b610a60565b005b3480156103dc57600080fd5b506103ce6103eb366004612de5565b610ae6565b3480156103fc57600080fd5b50610405610b8e565b60405190815260200161034b565b34801561041f57600080fd5b50610405600a81565b34801561043457600080fd5b506103ce610443366004612e0d565b610b9c565b34801561045457600080fd5b50600f5461033f90610100900460ff1681565b34801561047357600080fd5b50610405600581565b34801561048857600080fd5b506103ce610497366004612e0d565b610ba7565b3480156104a857600080fd5b506103ce6104b7366004612d86565b610bc2565b3480156104c857600080fd5b506103ce6104d7366004612e49565b610c20565b3480156104e857600080fd5b50610405600c5481565b3480156104fe57600080fd5b5061039661050d366004612d86565b610ce1565b34801561051e57600080fd5b50610405600e5481565b34801561053457600080fd5b506103ce610543366004612d86565b610cf3565b34801561055457600080fd5b50610405610563366004612eba565b60106020526000908152604090205481565b34801561058157600080fd5b506103ce610590366004612ee5565b610e43565b3480156105a157600080fd5b506104056105b0366004612eba565b610f36565b3480156105c157600080fd5b506103ce610f84565b3480156105d657600080fd5b506103ce610f98565b3480156105eb57600080fd5b506103ce6105fa366004612d86565b611021565b34801561060b57600080fd5b506103ce61061a366004612f00565b611126565b34801561062b57600080fd5b5061063f61063a366004612eba565b611379565b60405161034b9190612f7e565b34801561065857600080fd5b50610405600281565b34801561066d57600080fd5b506008546001600160a01b0316610396565b34801561068b57600080fd5b506103ce61069a36600461304d565b6114b4565b3480156106ab57600080fd5b506103ce6106ba366004613095565b6114d3565b3480156106cb57600080fd5b5061036961158b565b3480156106e057600080fd5b5061040561037881565b3480156106f657600080fd5b50610405600a5481565b34801561070c57600080fd5b50600f5461033f9060ff1681565b34801561072657600080fd5b506103ce610735366004612d86565b61159a565b6103ce610748366004612d86565b611611565b34801561075957600080fd5b506103ce6107683660046130c1565b61174c565b34801561077957600080fd5b506103ce6117e1565b34801561078e57600080fd5b50600f5461033f9062010000900460ff1681565b3480156107ae57600080fd5b506103ce6107bd3660046130eb565b611a07565b3480156107ce57600080fd5b50600f5461033f906301000000900460ff1681565b3480156107ef57600080fd5b506103696107fe366004612d86565b611a51565b34801561080f57600080fd5b506103ce611ad0565b34801561082457600080fd5b50600f5461033f90640100000000900460ff1681565b34801561084657600080fd5b50610405600b5481565b34801561085c57600080fd5b506103ce61086b366004612ee5565b611b57565b34801561087c57600080fd5b506103ce61088b366004612d86565b611c46565b34801561089c57600080fd5b506103ce6108ab366004612ee5565b611d9f565b3480156108bc57600080fd5b50610369611e67565b3480156108d157600080fd5b5061033f6108e0366004613166565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561091a57600080fd5b506103ce610929366004612d86565b611e76565b34801561093a57600080fd5b506103ce610949366004612eba565b611fc8565b34801561095a57600080fd5b50610405601281565b34801561096f57600080fd5b50610405600d5481565b60006109848261203e565b92915050565b60606002805461099990613190565b80601f01602080910402602001604051908101604052809291908181526020018280546109c590613190565b8015610a125780601f106109e757610100808354040283529160200191610a12565b820191906000526020600020905b8154815290600101906020018083116109f557829003601f168201915b5050505050905090565b6000610a278261208e565b610a44576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610a6b82610ce1565b9050806001600160a01b0316836001600160a01b031603610a9f5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610ad657610ab981336108e0565b610ad6576040516367d9dca160e11b815260040160405180910390fd5b610ae18383836120c7565b505050565b610aee612123565b6000610afd6020830183612eba565b6001600160a01b031614158015610b2d57506000610b216040830160208401612eba565b6001600160a01b031614155b610b705760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064015b60405180910390fd5b610b7d6013826002612b95565b50506015805460ff19166001179055565b600154600054036000190190565b610ae183838361217d565b610ae183838360405180602001604052806000815250611a07565b6000818152600460205260409020546001600160a01b03163314610c145760405162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b6044820152606401610b67565b610c1d81612358565b50565b6008546001600160a01b0316331480610c76575060155460ff168015610c7657506013546001600160a01b0316336001600160a01b03161480610c7657506014546001600160a01b0316336001600160a01b0316145b610c925760405162461bcd60e51b8152600401610b67906131da565b80610cd55760405162461bcd60e51b815260206004820152601360248201527218985cd9555492481a5cc81c995c5d5a5c9959606a1b6044820152606401610b67565b610ae160118383612beb565b6000610cec82612363565b5192915050565b6008546001600160a01b0316331480610d49575060155460ff168015610d4957506013546001600160a01b0316336001600160a01b03161480610d4957506014546001600160a01b0316336001600160a01b0316145b610d655760405162461bcd60e51b8152600401610b67906131da565b600b548110610daf5760405162461bcd60e51b815260206004820152601660248201527543616e6e6f7420696e63726561736520737570706c7960501b6044820152606401610b67565b610db7610b8e565b811015610e065760405162461bcd60e51b815260206004820152601e60248201527f546f74616c206d696e7465642065786365656473206e65772076616c756500006044820152606401610b67565b600b81905560405181815233907f28c4702f31a5488ef1826a30b4d837dab0940e925b9f503fe0644b7f1bd2f20f9060200160405180910390a250565b6008546001600160a01b0316331480610e99575060155460ff168015610e9957506013546001600160a01b0316336001600160a01b03161480610e9957506014546001600160a01b0316336001600160a01b0316145b610eb55760405162461bcd60e51b8152600401610b67906131da565b808015610eea57600060118054610ecb90613190565b905011610eea5760405162461bcd60e51b8152600401610b6790613206565b600f805460ff1916831515908117909155335b6001600160a01b03167f161a054f8f5c1c1b5e74c919c625095dfa0ac7d9c2fbbea163c6fc4b30f4121860405160405180910390a35050565b60006001600160a01b038216610f5f576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b610f8c612123565b610f966000612485565b565b6008546001600160a01b0316331480610fee575060155460ff168015610fee57506013546001600160a01b0316336001600160a01b03161480610fee57506014546001600160a01b0316336001600160a01b0316145b61100a5760405162461bcd60e51b8152600401610b67906131da565b600f805464ff000000001916640100000000179055565b6008546001600160a01b0316331480611077575060155460ff16801561107757506013546001600160a01b0316336001600160a01b0316148061107757506014546001600160a01b0316336001600160a01b0316145b6110935760405162461bcd60e51b8152600401610b67906131da565b600a54811115806110ad57506103786110aa610b8e565b11155b6110f15760405162461bcd60e51b815260206004820152601560248201527443616e6e6f7420696e63726561736520707269636560581b6044820152606401610b67565b600a819055604051819033907f7e551f7241740ef6751c2f6bc2ba929ee4a88127156bad09dfc6474d4c41006090600090a350565b6002600954036111485760405162461bcd60e51b8152600401610b679061323d565b600260098190555081816111c782828080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e546040516bffffffffffffffffffffffff193360601b1660208201529092506034019050604051602081830303815290604052805190602001206124d7565b6112035760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610b67565b600f5460ff166112555760405162461bcd60e51b815260206004820152601860248201527f47656e65736973206d696e74696e6720696e61637469766500000000000000006044820152606401610b67565b610378601286600c54611268919061328a565b611272919061328a565b11156112bb5760405162461bcd60e51b81526020600482015260186024820152774578636565647320617661696c61626c6520737570706c7960401b6044820152606401610b67565b336000908152601060205260409020546002906112d990879061328a565b11156113275760405162461bcd60e51b815260206004820152601e60248201527f457863656564732061646472657373207175616e74697479206c696d697400006044820152606401610b67565b84600c6000828254611339919061328a565b9091555050336000908152601060205260408120805487929061135d90849061328a565b9091555061136d905033866124ed565b50506001600955505050565b6060600061138683610f36565b90506000816001600160401b038111156113a2576113a2612fc2565b6040519080825280602002602001820160405280156113cb578160200160208202803683370190505b506000805491925080805b838110156114a857600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16158015928201929092529061143d57506114a0565b80516001600160a01b03161561145257805192505b886001600160a01b0316836001600160a01b0316036114915781868580600101965081518110611484576114846131c4565b6020026020010181815250505b86840361149e57506114a8565b505b6001016113d6565b50929695505050505050565b6114bc612123565b80516114cf906012906020840190612c5f565b5050565b6002600954036114f55760405162461bcd60e51b8152600401610b679061323d565b6002600955611502612123565b601282601654611512919061328a565b11156115605760405162461bcd60e51b815260206004820152601860248201527f457863656564732072657365727665207175616e7469747900000000000000006044820152606401610b67565b8160166000828254611572919061328a565b90915550611582905081836124ed565b50506001600955565b60606003805461099990613190565b6008546001600160a01b03163314806115f0575060155460ff1680156115f057506013546001600160a01b0316336001600160a01b031614806115f057506014546001600160a01b0316336001600160a01b0316145b61160c5760405162461bcd60e51b8152600401610b67906131da565b600e55565b6002600954036116335760405162461bcd60e51b8152600401610b679061323d565b6002600955600f5462010000900460ff166116905760405162461bcd60e51b815260206004820152601760248201527f5075626c6963206d696e74696e6720696e6163746976650000000000000000006044820152606401610b67565b80600a5461169e91906132a2565b34146116ec5760405162461bcd60e51b815260206004820152601860248201527f496e636f7272656374207061796d656e7420616d6f756e7400000000000000006044820152606401610b67565b600a8111156117395760405162461bcd60e51b8152602060048201526019602482015278115e18d959591cc81d1e081c5d585b9d1a5d1e481b1a5b5a5d603a1b6044820152606401610b67565b611744335b826124ed565b506001600955565b336001600160a01b038316036117755760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b0316331480611837575060155460ff16801561183757506013546001600160a01b0316336001600160a01b0316148061183757506014546001600160a01b0316336001600160a01b0316145b6118535760405162461bcd60e51b8152600401610b67906131da565b6002600954036118755760405162461bcd60e51b8152600401610b679061323d565b6002600955600d5447116118c05760405162461bcd60e51b81526020600482015260126024820152714e6f2070617961626c652062616c616e636560701b6044820152606401610b67565b6000600d54476118d091906132c1565b9050600060646118e183600a6132a2565b6118eb91906132ee565b90506118f781836132c1565b600d6000828254611908919061328a565b90915550506040517386190c50d1dd3eeb2ab1dbb8e7195f2195af321f9082156108fc029083906000818181858888f1935050505061197f5760405162461bcd60e51b81526020600482015260136024820152721519585b481c185e5b595b9d0819985a5b1959606a1b6044820152606401610b67565b7386190c50d1dd3eeb2ab1dbb8e7195f2195af321f6001600160a01b03167f977a6da50cd34049fc55b2cea88cab5c375867bba0044c08fe032978c16c4ea5600c546016546119cc610b8e565b6119d691906132c1565b6119e091906132c1565b6040805191825260208201869052810184905260600160405180910390a250506001600955565b611a1284848461217d565b6001600160a01b0383163b15611a4b57611a2e848484846125ba565b611a4b576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060611a5c8261208e565b611a9e5760405162461bcd60e51b8152602060048201526013602482015272139bdb995e1a5cdd195b9d081d1bdad95b9259606a1b6044820152606401610b67565b6011611aa9836126a6565b604051602001611aba92919061331e565b6040516020818303038152906040529050919050565b6008546001600160a01b0316331480611b26575060155460ff168015611b2657506013546001600160a01b0316336001600160a01b03161480611b2657506014546001600160a01b0316336001600160a01b0316145b611b425760405162461bcd60e51b8152600401610b67906131da565b600f805463ff00000019166301000000179055565b6008546001600160a01b0316331480611bad575060155460ff168015611bad57506013546001600160a01b0316336001600160a01b03161480611bad57506014546001600160a01b0316336001600160a01b0316145b611bc95760405162461bcd60e51b8152600401610b67906131da565b808015611bfe57600060118054611bdf90613190565b905011611bfe5760405162461bcd60e51b8152600401610b6790613206565b600f805461ff0019166101008415159081029190911790915560405133907fa10f8d478ca08c91de8bca8ba2016b83b9eecf85aab98ca47cc970ab335f907990600090a35050565b611c4e612123565b600260095403611c705760405162461bcd60e51b8152600401610b679061323d565b600260095580611cba5760405162461bcd60e51b8152602060048201526015602482015274416d6f756e742063616e6e6f74206265207a65726f60581b6044820152606401610b67565b80600d541015611d0c5760405162461bcd60e51b815260206004820152601b60248201527f4578636565647320776974686472617761626c6520616d6f756e7400000000006044820152606401610b67565b80600d6000828254611d1e91906132c1565b90915550506040517315b31f13d09420c0adcb3a9af7be29d6adcf31ba9082156108fc029083906000818181858888f193505050506117445760405162461bcd60e51b815260206004820152601760248201527f50726f6a656374207769746864726177206661696c65640000000000000000006044820152606401610b67565b6008546001600160a01b0316331480611df5575060155460ff168015611df557506013546001600160a01b0316336001600160a01b03161480611df557506014546001600160a01b0316336001600160a01b0316145b611e115760405162461bcd60e51b8152600401610b67906131da565b808015611e4657600060118054611e2790613190565b905011611e465760405162461bcd60e51b8152600401610b6790613206565b600f805462ff00001916620100008415159081029190911790915533610efd565b60606012805461099990613190565b600260095403611e985760405162461bcd60e51b8152600401610b679061323d565b6002600955600f54610100900460ff16611ef45760405162461bcd60e51b815260206004820152601f60248201527f47656e65736973207075626c6963206d696e74696e6720696e616374697665006044820152606401610b67565b610378601282600c54611f07919061328a565b611f11919061328a565b1115611f5a5760405162461bcd60e51b81526020600482015260186024820152774578636565647320617661696c61626c6520737570706c7960401b6044820152606401610b67565b6005811115611fa75760405162461bcd60e51b8152602060048201526019602482015278115e18d959591cc81d1e081c5d585b9d1a5d1e481b1a5b5a5d603a1b6044820152606401610b67565b80600c6000828254611fb9919061328a565b9091555061174490503361173e565b611fd0612123565b6001600160a01b0381166120355760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b67565b610c1d81612485565b60006001600160e01b031982166380ac58cd60e01b148061206f57506001600160e01b03198216635b5e139f60e01b145b8061098457506301ffc9a760e01b6001600160e01b0319831614610984565b6000816001111580156120a2575060005482105b8015610984575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314610f965760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b67565b600061218882612363565b9050836001600160a01b031681600001516001600160a01b0316146121bf5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b03861614806121dd57506121dd85336108e0565b806121f85750336121ed84610a1c565b6001600160a01b0316145b90508061221857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661223f57604051633a954ecd60e21b815260040160405180910390fd5b61224b600084876120c7565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661231f57600054821461231f57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b031660008051602061345c83398151915260405160405180910390a45050505050565b610c1d8160006127a6565b6040805160608101825260008082526020820181905291810191909152818060011161246c5760005481101561246c57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615159181018290529061246a5780516001600160a01b031615612401579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612465579392505050565b612401565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000826124e48584612959565b14949350505050565b6000811161253d5760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f0000000000000000006044820152606401610b67565b600b5460165461254e9060126132c1565b82612557610b8e565b612561919061328a565b61256b919061328a565b11156125b05760405162461bcd60e51b81526020600482015260146024820152734578636565647320746f74616c20737570706c7960601b6044820152606401610b67565b6114cf82826129a6565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906125ef9033908990889088906004016133d4565b6020604051808303816000875af192505050801561262a575060408051601f3d908101601f1916820190925261262791810190613411565b60015b612688573d808015612658576040519150601f19603f3d011682016040523d82523d6000602084013e61265d565b606091505b508051600003612680576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816000036126cd5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156126f757806126e18161342e565b91506126f09050600a836132ee565b91506126d1565b6000816001600160401b0381111561271157612711612fc2565b6040519080825280601f01601f19166020018201604052801561273b576020820181803683370190505b5090505b841561269e576127506001836132c1565b915061275d600a86613447565b61276890603061328a565b60f81b81838151811061277d5761277d6131c4565b60200101906001600160f81b031916908160001a90535061279f600a866132ee565b945061273f565b60006127b183612363565b80519091508215612817576000336001600160a01b03831614806127da57506127da82336108e0565b806127f55750336127ea86610a1c565b6001600160a01b0316145b90508061281557604051632ce44b5f60e11b815260040160405180910390fd5b505b612823600085836120c7565b6001600160a01b0380821660008181526005602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526004909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b17855591890180845292208054919490911661292157600054821461292157805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b0384169060008051602061345c833981519152908390a4505060018054810190555050565b600081815b845181101561299e5761298a8286838151811061297d5761297d6131c4565b60200260200101516129c0565b9150806129968161342e565b91505061295e565b509392505050565b6114cf8282604051806020016040528060008152506129f2565b60008183106129dc5760008281526020849052604090206129eb565b60008381526020839052604090205b9392505050565b6000546001600160a01b038416612a1b57604051622e076360e81b815260040160405180910390fd5b82600003612a3c5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600490925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15612b52575b60405182906001600160a01b0388169060009060008051602061345c833981519152908290a4612b1b60008784806001019550876125ba565b612b38576040516368d2bf6b60e11b815260040160405180910390fd5b808210612ae2578260005414612b4d57600080fd5b612b85565b5b6040516001830192906001600160a01b0388169060009060008051602061345c833981519152908290a4808210612b53575b506000908155611a4b9085838684565b8260028101928215612bdb579160200282015b82811115612bdb5781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612ba8565b50612be7929150612cd3565b5090565b828054612bf790613190565b90600052602060002090601f016020900481019282612c195760008555612bdb565b82601f10612c325782800160ff19823516178555612bdb565b82800160010185558215612bdb579182015b82811115612bdb578235825591602001919060010190612c44565b828054612c6b90613190565b90600052602060002090601f016020900481019282612c8d5760008555612bdb565b82601f10612ca657805160ff1916838001178555612bdb565b82800160010185558215612bdb579182015b82811115612bdb578251825591602001919060010190612cb8565b5b80821115612be75760008155600101612cd4565b6001600160e01b031981168114610c1d57600080fd5b600060208284031215612d1057600080fd5b81356129eb81612ce8565b60005b83811015612d36578181015183820152602001612d1e565b83811115611a4b5750506000910152565b60008151808452612d5f816020860160208601612d1b565b601f01601f19169290920160200192915050565b6020815260006129eb6020830184612d47565b600060208284031215612d9857600080fd5b5035919050565b80356001600160a01b0381168114612db657600080fd5b919050565b60008060408385031215612dce57600080fd5b612dd783612d9f565b946020939093013593505050565b600060408284031215612df757600080fd5b82604083011115612e0757600080fd5b50919050565b600080600060608486031215612e2257600080fd5b612e2b84612d9f565b9250612e3960208501612d9f565b9150604084013590509250925092565b60008060208385031215612e5c57600080fd5b82356001600160401b0380821115612e7357600080fd5b818501915085601f830112612e8757600080fd5b813581811115612e9657600080fd5b866020828501011115612ea857600080fd5b60209290920196919550909350505050565b600060208284031215612ecc57600080fd5b6129eb82612d9f565b80358015158114612db657600080fd5b600060208284031215612ef757600080fd5b6129eb82612ed5565b600080600060408486031215612f1557600080fd5b8335925060208401356001600160401b0380821115612f3357600080fd5b818601915086601f830112612f4757600080fd5b813581811115612f5657600080fd5b8760208260051b8501011115612f6b57600080fd5b6020830194508093505050509250925092565b6020808252825182820181905260009190848201906040850190845b81811015612fb657835183529284019291840191600101612f9a565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115612ff257612ff2612fc2565b604051601f8501601f19908116603f0116810190828211818310171561301a5761301a612fc2565b8160405280935085815286868601111561303357600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561305f57600080fd5b81356001600160401b0381111561307557600080fd5b8201601f8101841361308657600080fd5b61269e84823560208401612fd8565b600080604083850312156130a857600080fd5b823591506130b860208401612d9f565b90509250929050565b600080604083850312156130d457600080fd5b6130dd83612d9f565b91506130b860208401612ed5565b6000806000806080858703121561310157600080fd5b61310a85612d9f565b935061311860208601612d9f565b92506040850135915060608501356001600160401b0381111561313a57600080fd5b8501601f8101871361314b57600080fd5b61315a87823560208401612fd8565b91505092959194509250565b6000806040838503121561317957600080fd5b61318283612d9f565b91506130b860208401612d9f565b600181811c908216806131a457607f821691505b602082108103612e0757634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6020808252601290820152712737ba1037bbb732b91037b91030b236b4b760711b604082015260600190565b6020808252601d908201527f4d657461646174612075726c20686173206e6f74206265656e20736574000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561329d5761329d613274565b500190565b60008160001904831182151516156132bc576132bc613274565b500290565b6000828210156132d3576132d3613274565b500390565b634e487b7160e01b600052601260045260246000fd5b6000826132fd576132fd6132d8565b500490565b60008151613314818560208601612d1b565b9290920192915050565b600080845481600182811c91508083168061333a57607f831692505b6020808410820361335957634e487b7160e01b86526022600452602486fd5b81801561336d576001811461337e576133ab565b60ff198616895284890196506133ab565b60008b81526020902060005b868110156133a35781548b82015290850190830161338a565b505084890196505b5050505050506133cb6133c582602f60f81b815260010190565b85613302565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061340790830184612d47565b9695505050505050565b60006020828403121561342357600080fd5b81516129eb81612ce8565b60006001820161344057613440613274565b5060010190565b600082613456576134566132d8565b50069056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220ada9ced9459d59f04246682d1ab9c5bcb14dbaa61e5a0dc2ac769ca35a524a4c64736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000009456c657638204e465400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005454c455638000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): Elev8 NFT
Arg [1] : symbol (string): ELEV8
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [3] : 456c657638204e46540000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [5] : 454c455638000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
60602:11140:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70853:203;;;;;;;;;;-1:-1:-1;70853:203:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;70853:203:0;;;;;;;;43746:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;45250:204::-;;;;;;;;;;-1:-1:-1;45250:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1714:32:1;;;1696:51;;1684:2;1669:18;45250:204:0;1550:203:1;44812:372:0;;;;;;;;;;-1:-1:-1;44812:372:0;;;;;:::i;:::-;;:::i;:::-;;66643:289;;;;;;;;;;-1:-1:-1;66643:289:0;;;;;:::i;:::-;;:::i;39871:312::-;;;;;;;;;;;;;:::i;:::-;;;2597:25:1;;;2585:2;2570:18;39871:312:0;2451:177:1;60864:51:0;;;;;;;;;;;;60913:2;60864:51;;46115:170;;;;;;;;;;-1:-1:-1;46115:170:0;;;;;:::i;:::-;;:::i;61224:35::-;;;;;;;;;;-1:-1:-1;61224:35:0;;;;;;;;;;;60746:53;;;;;;;;;;;;60798:1;60746:53;;46356:185;;;;;;;;;;-1:-1:-1;46356:185:0;;;;;:::i;:::-;;:::i;70166:145::-;;;;;;;;;;-1:-1:-1;70166:145:0;;;;;:::i;:::-;;:::i;66459:176::-;;;;;;;;;;-1:-1:-1;66459:176:0;;;;;:::i;:::-;;:::i;61061:31::-;;;;;;;;;;;;;;;;43554:125;;;;;;;;;;-1:-1:-1;43554:125:0;;;;;:::i;:::-;;:::i;61147:32::-;;;;;;;;;;;;;;;;68120:306;;;;;;;;;;-1:-1:-1;68120:306:0;;;;;:::i;:::-;;:::i;61382:52::-;;;;;;;;;;-1:-1:-1;61382:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;66940:227;;;;;;;;;;-1:-1:-1;66940:227:0;;;;;:::i;:::-;;:::i;41000:206::-;;;;;;;;;;-1:-1:-1;41000:206:0;;;;;:::i;:::-;;:::i;26364:103::-;;;;;;;;;;;;;:::i;68677:100::-;;;;;;;;;;;;;:::i;67662:450::-;;;;;;;;;;-1:-1:-1;67662:450:0;;;;;:::i;:::-;;:::i;63427:572::-;;;;;;;;;;-1:-1:-1;63427:572:0;;;;;:::i;:::-;;:::i;69042:1116::-;;;;;;;;;;-1:-1:-1;69042:1116:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;60806:51::-;;;;;;;;;;;;60856:1;60806:51;;25716:87;;;;;;;;;;-1:-1:-1;25789:6:0;;-1:-1:-1;;;;;25789:6:0;25716:87;;70319:103;;;;;;;;;;-1:-1:-1;70319:103:0;;;;;:::i;:::-;;:::i;64843:288::-;;;;;;;;;;-1:-1:-1;64843:288:0;;;;;:::i;:::-;;:::i;43915:104::-;;;;;;;;;;;;;:::i;60695:44::-;;;;;;;;;;;;60736:3;60695:44;;60971:43;;;;;;;;;;;;;;;;61188:29;;;;;;;;;;-1:-1:-1;61188:29:0;;;;;;;;68434:125;;;;;;;;;;-1:-1:-1;68434:125:0;;;;;:::i;:::-;;:::i;64500:335::-;;;;;;:::i;:::-;;:::i;45526:287::-;;;;;;;;;;-1:-1:-1;45526:287:0;;;;;:::i;:::-;;:::i;65139:881::-;;;;;;;;;;;;;:::i;61266:28::-;;;;;;;;;;-1:-1:-1;61266:28:0;;;;;;;;;;;46612:370;;;;;;;;;;-1:-1:-1;46612:370:0;;;;;:::i;:::-;;:::i;61303:32::-;;;;;;;;;;-1:-1:-1;61303:32:0;;;;;;;;;;;70430:310;;;;;;;;;;-1:-1:-1;70430:310:0;;;;;:::i;:::-;;:::i;68567:102::-;;;;;;;;;;;;;:::i;61342:31::-;;;;;;;;;;-1:-1:-1;61342:31:0;;;;;;;;;;;61021;;;;;;;;;;;;;;;;67176:245;;;;;;;;;;-1:-1:-1;67176:245:0;;;;;:::i;:::-;;:::i;66028:423::-;;;;;;;;;;-1:-1:-1;66028:423:0;;;;;:::i;:::-;;:::i;67429:225::-;;;;;;;;;;-1:-1:-1;67429:225:0;;;;;:::i;:::-;;:::i;70748:97::-;;;;;;;;;;;;;:::i;45884:164::-;;;;;;;;;;-1:-1:-1;45884:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;46005:25:0;;;45981:4;46005:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;45884:164;64007:485;;;;;;;;;;-1:-1:-1;64007:485:0;;;;;:::i;:::-;;:::i;26622:201::-;;;;;;;;;;-1:-1:-1;26622:201:0;;;;;:::i;:::-;;:::i;60922:40::-;;;;;;;;;;;;60960:2;60922:40;;61099:39;;;;;;;;;;;;;;;;70853:203;70983:4;71012:36;71036:11;71012:23;:36::i;:::-;71005:43;70853:203;-1:-1:-1;;70853:203:0:o;43746:100::-;43800:13;43833:5;43826:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43746:100;:::o;45250:204::-;45318:7;45343:16;45351:7;45343;:16::i;:::-;45338:64;;45368:34;;-1:-1:-1;;;45368:34:0;;;;;;;;;;;45338:64;-1:-1:-1;45422:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;45422:24:0;;45250:204::o;44812:372::-;44885:13;44901:24;44917:7;44901:15;:24::i;:::-;44885:40;;44946:5;-1:-1:-1;;;;;44940:11:0;:2;-1:-1:-1;;;;;44940:11:0;;44936:48;;44960:24;;-1:-1:-1;;;44960:24:0;;;;;;;;;;;44936:48;24347:10;-1:-1:-1;;;;;45001:21:0;;;44997:139;;45028:37;45045:5;24347:10;45884:164;:::i;45028:37::-;45024:112;;45089:35;;-1:-1:-1;;;45089:35:0;;;;;;;;;;;45024:112;45148:28;45157:2;45161:7;45170:5;45148:8;:28::i;:::-;44874:310;44812:372;;:::o;66643:289::-;25602:13;:11;:13::i;:::-;66779:1:::1;66750:17;;::::0;::::1;:14:::0;:17:::1;:::i;:::-;-1:-1:-1::0;;;;;66750:31:0::1;;;:66;;;;-1:-1:-1::0;66814:1:0::1;66785:17;::::0;;;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;;;;;66785:31:0::1;;;66750:66;66728:131;;;::::0;-1:-1:-1;;;66728:131:0;;9195:2:1;66728:131:0::1;::::0;::::1;9177:21:1::0;9234:2;9214:18;;;9207:30;-1:-1:-1;;;9253:18:1;;;9246:45;9308:18;;66728:131:0::1;;;;;;;;;66872:24;:7;66882:14:::0;66872:24:::1;;:::i;:::-;-1:-1:-1::0;;66907:10:0::1;:17:::0;;-1:-1:-1;;66907:17:0::1;66920:4;66907:17;::::0;;66643:289::o;39871:312::-;71415:1;40134:12;39924:7;40118:13;:28;-1:-1:-1;;40118:46:0;;39871:312::o;46115:170::-;46249:28;46259:4;46265:2;46269:7;46249:9;:28::i;46356:185::-;46494:39;46511:4;46517:2;46521:7;46494:39;;;;;;;;;;;;:16;:39::i;70166:145::-;70223:20;;;;:11;:20;;;;;:25;-1:-1:-1;;;;;70223:25:0;24347:10;70223:41;70215:63;;;;-1:-1:-1;;;70215:63:0;;9539:2:1;70215:63:0;;;9521:21:1;9578:1;9558:18;;;9551:29;-1:-1:-1;;;9596:18:1;;;9589:39;9645:18;;70215:63:0;9337:332:1;70215:63:0;70289:14;70295:7;70289:5;:14::i;:::-;70166:145;:::o;66459:176::-;25789:6;;-1:-1:-1;;;;;25789:6:0;24347:10;62666:23;;:139;;-1:-1:-1;62711:10:0;;;;:93;;;;-1:-1:-1;62763:7:0;:10;-1:-1:-1;;;;;62763:10:0;24347;-1:-1:-1;;;;;62747:26:0;;:56;;;-1:-1:-1;62793:10:0;;-1:-1:-1;;;;;62793:10:0;24347;-1:-1:-1;;;;;62777:26:0;;62747:56;62644:207;;;;-1:-1:-1;;;62644:207:0;;;;;;;:::i;:::-;66549:25;66541:57:::1;;;::::0;-1:-1:-1;;;66541:57:0;;10223:2:1;66541:57:0::1;::::0;::::1;10205:21:1::0;10262:2;10242:18;;;10235:30;-1:-1:-1;;;10281:18:1;;;10274:49;10340:18;;66541:57:0::1;10021:343:1::0;66541:57:0::1;66609:18;:8;66620:7:::0;;66609:18:::1;:::i;43554:125::-:0;43618:7;43645:21;43658:7;43645:12;:21::i;:::-;:26;;43554:125;-1:-1:-1;;43554:125:0:o;68120:306::-;25789:6;;-1:-1:-1;;;;;25789:6:0;24347:10;62666:23;;:139;;-1:-1:-1;62711:10:0;;;;:93;;;;-1:-1:-1;62763:7:0;:10;-1:-1:-1;;;;;62763:10:0;24347;-1:-1:-1;;;;;62747:26:0;;:56;;;-1:-1:-1;62793:10:0;;-1:-1:-1;;;;;62793:10:0;24347;-1:-1:-1;;;;;62777:26:0;;62747:56;62644:207;;;;-1:-1:-1;;;62644:207:0;;;;;;;:::i;:::-;68216:9:::1;;68205:8;:20;68197:55;;;::::0;-1:-1:-1;;;68197:55:0;;10571:2:1;68197:55:0::1;::::0;::::1;10553:21:1::0;10610:2;10590:18;;;10583:30;-1:-1:-1;;;10629:18:1;;;10622:52;10691:18;;68197:55:0::1;10369:346:1::0;68197:55:0::1;68283:13;:11;:13::i;:::-;68271:8;:25;;68263:68;;;::::0;-1:-1:-1;;;68263:68:0;;10922:2:1;68263:68:0::1;::::0;::::1;10904:21:1::0;10961:2;10941:18;;;10934:30;11000:32;10980:18;;;10973:60;11050:18;;68263:68:0::1;10720:354:1::0;68263:68:0::1;68342:9;:20:::0;;;68378:40:::1;::::0;2597:25:1;;;24347:10:0;;68378:40:::1;::::0;2585:2:1;2570:18;68378:40:0::1;;;;;;;68120:306:::0;:::o;66940:227::-;25789:6;;-1:-1:-1;;;;;25789:6:0;24347:10;62666:23;;:139;;-1:-1:-1;62711:10:0;;;;:93;;;;-1:-1:-1;62763:7:0;:10;-1:-1:-1;;;;;62763:10:0;24347;-1:-1:-1;;;;;62747:26:0;;:56;;;-1:-1:-1;62793:10:0;;-1:-1:-1;;;;;62793:10:0;24347;-1:-1:-1;;;;;62777:26:0;;62747:56;62644:207;;;;-1:-1:-1;;;62644:207:0;;;;;;;:::i;:::-;67048:6:::1;62426;62422:156;;;62500:1;62481:8;62475:22;;;;;:::i;:::-;;;:26;62449:117;;;;-1:-1:-1::0;;;62449:117:0::1;;;;;;;:::i;:::-;67072:17:::2;:26:::0;;-1:-1:-1;;67072:26:0::2;::::0;::::2;;::::0;;::::2;::::0;;;24347:10;67138:12:::2;-1:-1:-1::0;;;;;67114:45:0::2;;;;;;;;;;;62862:1:::1;66940:227:::0;:::o;41000:206::-;41064:7;-1:-1:-1;;;;;41088:19:0;;41084:60;;41116:28;;-1:-1:-1;;;41116:28:0;;;;;;;;;;;41084:60;-1:-1:-1;;;;;;41170:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;41170:27:0;;41000:206::o;26364:103::-;25602:13;:11;:13::i;:::-;26429:30:::1;26456:1;26429:18;:30::i;:::-;26364:103::o:0;68677:100::-;25789:6;;-1:-1:-1;;;;;25789:6:0;24347:10;62666:23;;:139;;-1:-1:-1;62711:10:0;;;;:93;;;;-1:-1:-1;62763:7:0;:10;-1:-1:-1;;;;;62763:10:0;24347;-1:-1:-1;;;;;62747:26:0;;:56;;;-1:-1:-1;62793:10:0;;-1:-1:-1;;;;;62793:10:0;24347;-1:-1:-1;;;;;62777:26:0;;62747:56;62644:207;;;;-1:-1:-1;;;62644:207:0;;;;;;;:::i;:::-;68743:19:::1;:26:::0;;-1:-1:-1;;68743:26:0::1;::::0;::::1;::::0;;68677:100::o;67662:450::-;25789:6;;-1:-1:-1;;;;;25789:6:0;24347:10;62666:23;;:139;;-1:-1:-1;62711:10:0;;;;:93;;;;-1:-1:-1;62763:7:0;:10;-1:-1:-1;;;;;62763:10:0;24347;-1:-1:-1;;;;;62747:26:0;;:56;;;-1:-1:-1;62793:10:0;;-1:-1:-1;;;;;62793:10:0;24347;-1:-1:-1;;;;;62777:26:0;;62747:56;62644:207;;;;-1:-1:-1;;;62644:207:0;;;;;;;:::i;:::-;67929:15:::1;;67917:8;:27;;:62;;;;60736:3;67948:13;:11;:13::i;:::-;:31;;67917:62;67909:96;;;::::0;-1:-1:-1;;;67909:96:0;;11639:2:1;67909:96:0::1;::::0;::::1;11621:21:1::0;11678:2;11658:18;;;11651:30;-1:-1:-1;;;11697:18:1;;;11690:51;11758:18;;67909:96:0::1;11437:345:1::0;67909:96:0::1;68016:15;:26:::0;;;68058:46:::1;::::0;68016:26;;24347:10;;68058:46:::1;::::0;;;::::1;67662:450:::0;:::o;63427:572::-;22641:1;23239:7;;:19;23231:63;;;;-1:-1:-1;;;23231:63:0;;;;;;;:::i;:::-;22641:1;23372:7;:18;;;;63526:11:::1;;62964:161;63001:11;;62964:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;63032:17:0::1;::::0;63079:30:::1;::::0;-1:-1:-1;;24347:10:0;12296:2:1;12292:15;12288:53;63079:30:0::1;::::0;::::1;12276:66:1::0;63032:17:0;;-1:-1:-1;12358:12:1;;;-1:-1:-1;63079:30:0::1;;;;;;;;;;;;63069:41;;;;;;62964:18;:161::i;:::-;62942:225;;;::::0;-1:-1:-1;;;62942:225:0;;12583:2:1;62942:225:0::1;::::0;::::1;12565:21:1::0;12622:2;12602:18;;;12595:30;-1:-1:-1;;;12641:18:1;;;12634:43;12694:18;;62942:225:0::1;12381:337:1::0;62942:225:0::1;63558:17:::2;::::0;::::2;;63550:54;;;::::0;-1:-1:-1;;;63550:54:0;;12925:2:1;63550:54:0::2;::::0;::::2;12907:21:1::0;12964:2;12944:18;;;12937:30;13003:26;12983:18;;;12976:54;13047:18;;63550:54:0::2;12723:348:1::0;63550:54:0::2;60736:3;60960:2;63656:3;63637:16;;:22;;;;:::i;:::-;:36;;;;:::i;:::-;:54;;63615:128;;;::::0;-1:-1:-1;;;63615:128:0;;13543:2:1;63615:128:0::2;::::0;::::2;13525:21:1::0;13582:2;13562:18;;;13555:30;-1:-1:-1;;;13601:18:1;;;13594:54;13665:18;;63615:128:0::2;13341:348:1::0;63615:128:0::2;24347:10:::0;63762:31:::2;::::0;;;:17:::2;:31;::::0;;;;;60856:1:::2;::::0;63762:37:::2;::::0;63796:3;;63762:37:::2;:::i;:::-;:64;;63754:107;;;::::0;-1:-1:-1;;;63754:107:0;;13896:2:1;63754:107:0::2;::::0;::::2;13878:21:1::0;13935:2;13915:18;;;13908:30;13974:32;13954:18;;;13947:60;14024:18;;63754:107:0::2;13694:354:1::0;63754:107:0::2;63894:3;63874:16;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;24347:10:0;63908:31:::2;::::0;;;:17:::2;:31;::::0;;;;:38;;63943:3;;63908:31;:38:::2;::::0;63943:3;;63908:38:::2;:::i;:::-;::::0;;;-1:-1:-1;63959:32:0::2;::::0;-1:-1:-1;24347:10:0;63987:3:::2;63959:13;:32::i;:::-;-1:-1:-1::0;;22597:1:0;23551:7;:22;-1:-1:-1;;;63427:572:0:o;69042:1116::-;69130:16;69189:20;69212:16;69222:5;69212:9;:16::i;:::-;69189:39;;69243:18;69278:12;-1:-1:-1;;;;;69264:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;69264:27:0;-1:-1:-1;69306:11:0;69320:13;;69243:48;;-1:-1:-1;69306:11:0;;69422:695;69442:3;69438:1;:7;69422:695;;;69471:31;69505:14;;;:11;:14;;;;;;;;;69471:48;;;;;;;;;-1:-1:-1;;;;;69471:48:0;;;;-1:-1:-1;;;69471:48:0;;-1:-1:-1;;;;;69471:48:0;;;;;;;;-1:-1:-1;;;69471:48:0;;;;;;;;;;;;;;;;69538:73;;69583:8;;;69538:73;69633:14;;-1:-1:-1;;;;;69633:28:0;;69629:111;;69706:14;;;-1:-1:-1;69629:111:0;69783:5;-1:-1:-1;;;;;69762:26:0;:17;-1:-1:-1;;;;;69762:26:0;;69758:95;;69832:1;69813;69815:13;;;;;;69813:16;;;;;;;;:::i;:::-;;;;;;:20;;;;;69758:95;70040:12;70025:11;:27;70021:81;;70077:5;;;70021:81;69452:665;69422:695;69447:3;;69422:695;;;-1:-1:-1;70138:1:0;;69042:1116;-1:-1:-1;;;;;;69042:1116:0:o;70319:103::-;25602:13;:11;:13::i;:::-;70393:21;;::::1;::::0;:12:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;70319:103:::0;:::o;64843:288::-;22641:1;23239:7;;:19;23231:63;;;;-1:-1:-1;;;23231:63:0;;;;;;;:::i;:::-;22641:1;23372:7;:18;25602:13:::1;:11;:13::i;:::-;60960:2:::2;65004:3;64989:12;;:18;;;;:::i;:::-;:33;;64981:70;;;::::0;-1:-1:-1;;;64981:70:0;;14255:2:1;64981:70:0::2;::::0;::::2;14237:21:1::0;14294:2;14274:18;;;14267:30;14333:26;14313:18;;;14306:54;14377:18;;64981:70:0::2;14053:348:1::0;64981:70:0::2;65080:3;65064:12;;:19;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;65094:29:0::2;::::0;-1:-1:-1;65108:9:0;65119:3;65094:13:::2;:29::i;:::-;-1:-1:-1::0;;22597:1:0;23551:7;:22;64843:288::o;43915:104::-;43971:13;44004:7;43997:14;;;;;:::i;68434:125::-;25789:6;;-1:-1:-1;;;;;25789:6:0;24347:10;62666:23;;:139;;-1:-1:-1;62711:10:0;;;;:93;;;;-1:-1:-1;62763:7:0;:10;-1:-1:-1;;;;;62763:10:0;24347;-1:-1:-1;;;;;62747:26:0;;:56;;;-1:-1:-1;62793:10:0;;-1:-1:-1;;;;;62793:10:0;24347;-1:-1:-1;;;;;62777:26:0;;62747:56;62644:207;;;;-1:-1:-1;;;62644:207:0;;;;;;;:::i;:::-;68521:17:::1;:30:::0;68434:125::o;64500:335::-;22641:1;23239:7;;:19;23231:63;;;;-1:-1:-1;;;23231:63:0;;;;;;;:::i;:::-;22641:1;23372:7;:18;64576:16:::1;::::0;;;::::1;;;64568:52;;;::::0;-1:-1:-1;;;64568:52:0;;14608:2:1;64568:52:0::1;::::0;::::1;14590:21:1::0;14647:2;14627:18;;;14620:30;14686:25;14666:18;;;14659:53;14729:18;;64568:52:0::1;14406:347:1::0;64568:52:0::1;64671:3;64653:15;;:21;;;;:::i;:::-;64639:9;:36;64631:73;;;::::0;-1:-1:-1;;;64631:73:0;;15133:2:1;64631:73:0::1;::::0;::::1;15115:21:1::0;15172:2;15152:18;;;15145:30;15211:26;15191:18;;;15184:54;15255:18;;64631:73:0::1;14931:348:1::0;64631:73:0::1;60913:2;64723:3;:29;;64715:67;;;::::0;-1:-1:-1;;;64715:67:0;;15486:2:1;64715:67:0::1;::::0;::::1;15468:21:1::0;15525:2;15505:18;;;15498:30;-1:-1:-1;;;15544:18:1;;;15537:55;15609:18;;64715:67:0::1;15284:349:1::0;64715:67:0::1;64795:32;24347:10:::0;64809:12:::1;64823:3;64795:13;:32::i;:::-;-1:-1:-1::0;22597:1:0;23551:7;:22;64500:335::o;45526:287::-;24347:10;-1:-1:-1;;;;;45625:24:0;;;45621:54;;45658:17;;-1:-1:-1;;;45658:17:0;;;;;;;;;;;45621:54;24347:10;45688:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;45688:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;45688:53:0;;;;;;;;;;45757:48;;540:41:1;;;45688:42:0;;24347:10;45757:48;;513:18:1;45757:48:0;;;;;;;45526:287;;:::o;65139:881::-;25789:6;;-1:-1:-1;;;;;25789:6:0;24347:10;62666:23;;:139;;-1:-1:-1;62711:10:0;;;;:93;;;;-1:-1:-1;62763:7:0;:10;-1:-1:-1;;;;;62763:10:0;24347;-1:-1:-1;;;;;62747:26:0;;:56;;;-1:-1:-1;62793:10:0;;-1:-1:-1;;;;;62793:10:0;24347;-1:-1:-1;;;;;62777:26:0;;62747:56;62644:207;;;;-1:-1:-1;;;62644:207:0;;;;;;;:::i;:::-;22641:1:::1;23239:7;;:19:::0;23231:63:::1;;;;-1:-1:-1::0;;;23231:63:0::1;;;;;;;:::i;:::-;22641:1;23372:7;:18:::0;65254:24:::2;::::0;65230:21:::2;:48;65208:116;;;::::0;-1:-1:-1;;;65208:116:0;;15840:2:1;65208:116:0::2;::::0;::::2;15822:21:1::0;15879:2;15859:18;;;15852:30;-1:-1:-1;;;15898:18:1;;;15891:48;15956:18;;65208:116:0::2;15638:342:1::0;65208:116:0::2;65335:22;65397:24;;65360:21;:61;;;;:::i;:::-;65335:86:::0;-1:-1:-1;65434:21:0::2;65482:3;65459:19;65335:86:::0;65476:2:::2;65459:19;:::i;:::-;65458:27;;;;:::i;:::-;65434:51:::0;-1:-1:-1;65684:30:0::2;65434:51:::0;65684:14;:30:::2;:::i;:::-;65655:24;;:60;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;65736:34:0::2;::::0;61679:42:::2;::::0;65736:34;::::2;;;::::0;65756:13;;65736:34:::2;::::0;;;65756:13;61679:42;65736:34;::::2;;;;;;65728:66;;;::::0;-1:-1:-1;;;65728:66:0;;16574:2:1;65728:66:0::2;::::0;::::2;16556:21:1::0;16613:2;16593:18;;;16586:30;-1:-1:-1;;;16632:18:1;;;16625:49;16691:18;;65728:66:0::2;16372:343:1::0;65728:66:0::2;61679:42;-1:-1:-1::0;;;;;65812:200:0::2;;65895:16;;65880:12;;65864:13;:11;:13::i;:::-;:28;;;;:::i;:::-;:47;;;;:::i;:::-;65812:200;::::0;;16922:25:1;;;16978:2;16963:18;;16956:34;;;17006:18;;16999:34;;;16910:2;16895:18;65812:200:0::2;;;;;;;-1:-1:-1::0;;22597:1:0::1;23551:7;:22:::0;65139:881::o;46612:370::-;46779:28;46789:4;46795:2;46799:7;46779:9;:28::i;:::-;-1:-1:-1;;;;;46822:13:0;;1528:19;:23;46818:157;;46843:56;46874:4;46880:2;46884:7;46893:5;46843:30;:56::i;:::-;46839:136;;46923:40;;-1:-1:-1;;;46923:40:0;;;;;;;;;;;46839:136;46612:370;;;;:::o;70430:310::-;70531:13;70570:16;70578:7;70570;:16::i;:::-;70562:48;;;;-1:-1:-1;;;70562:48:0;;17246:2:1;70562:48:0;;;17228:21:1;17285:2;17265:18;;;17258:30;-1:-1:-1;;;17304:18:1;;;17297:49;17363:18;;70562:48:0;17044:343:1;70562:48:0;70683:8;70698:18;:7;:16;:18::i;:::-;70666:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70621:111;;70430:310;;;:::o;68567:102::-;25789:6;;-1:-1:-1;;;;;25789:6:0;24347:10;62666:23;;:139;;-1:-1:-1;62711:10:0;;;;:93;;;;-1:-1:-1;62763:7:0;:10;-1:-1:-1;;;;;62763:10:0;24347;-1:-1:-1;;;;;62747:26:0;;:56;;;-1:-1:-1;62793:10:0;;-1:-1:-1;;;;;62793:10:0;24347;-1:-1:-1;;;;;62777:26:0;;62747:56;62644:207;;;;-1:-1:-1;;;62644:207:0;;;;;;;:::i;:::-;68634:20:::1;:27:::0;;-1:-1:-1;;68634:27:0::1;::::0;::::1;::::0;;68567:102::o;67176:245::-;25789:6;;-1:-1:-1;;;;;25789:6:0;24347:10;62666:23;;:139;;-1:-1:-1;62711:10:0;;;;:93;;;;-1:-1:-1;62763:7:0;:10;-1:-1:-1;;;;;62763:10:0;24347;-1:-1:-1;;;;;62747:26:0;;:56;;;-1:-1:-1;62793:10:0;;-1:-1:-1;;;;;62793:10:0;24347;-1:-1:-1;;;;;62777:26:0;;62747:56;62644:207;;;;-1:-1:-1;;;62644:207:0;;;;;;;:::i;:::-;67290:6:::1;62426;62422:156;;;62500:1;62481:8;62475:22;;;;;:::i;:::-;;;:26;62449:117;;;;-1:-1:-1::0;;;62449:117:0::1;;;;;;;:::i;:::-;67314:23:::2;:32:::0;;-1:-1:-1;;67314:32:0::2;;::::0;::::2;;::::0;;::::2;::::0;;;::::2;::::0;;;67362:51:::2;::::0;24347:10;;67362:51:::2;::::0;-1:-1:-1;;67362:51:0::2;62862:1:::1;67176:245:::0;:::o;66028:423::-;25602:13;:11;:13::i;:::-;22641:1:::1;23239:7;;:19:::0;23231:63:::1;;;;-1:-1:-1::0;;;23231:63:0::1;;;;;;;:::i;:::-;22641:1;23372:7;:18:::0;66161:10;66153:44:::2;;;::::0;-1:-1:-1;;;66153:44:0;;19340:2:1;66153:44:0::2;::::0;::::2;19322:21:1::0;19379:2;19359:18;;;19352:30;-1:-1:-1;;;19398:18:1;;;19391:51;19459:18;;66153:44:0::2;19138:345:1::0;66153:44:0::2;66258:6;66230:24;;:34;;66208:111;;;::::0;-1:-1:-1;;;66208:111:0;;19690:2:1;66208:111:0::2;::::0;::::2;19672:21:1::0;19729:2;19709:18;;;19702:30;19768:29;19748:18;;;19741:57;19815:18;;66208:111:0::2;19488:351:1::0;66208:111:0::2;66360:6;66332:24;;:34;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;66385:30:0::2;::::0;61587:42:::2;::::0;66385:30;::::2;;;::::0;66408:6;;66385:30:::2;::::0;;;66408:6;61587:42;66385:30;::::2;;;;;;66377:66;;;::::0;-1:-1:-1;;;66377:66:0;;20046:2:1;66377:66:0::2;::::0;::::2;20028:21:1::0;20085:2;20065:18;;;20058:30;20124:25;20104:18;;;20097:53;20167:18;;66377:66:0::2;19844:347:1::0;67429:225:0;25789:6;;-1:-1:-1;;;;;25789:6:0;24347:10;62666:23;;:139;;-1:-1:-1;62711:10:0;;;;:93;;;;-1:-1:-1;62763:7:0;:10;-1:-1:-1;;;;;62763:10:0;24347;-1:-1:-1;;;;;62747:26:0;;:56;;;-1:-1:-1;62793:10:0;;-1:-1:-1;;;;;62793:10:0;24347;-1:-1:-1;;;;;62777:26:0;;62747:56;62644:207;;;;-1:-1:-1;;;62644:207:0;;;;;;;:::i;:::-;67536:6:::1;62426;62422:156;;;62500:1;62481:8;62475:22;;;;;:::i;:::-;;;:26;62449:117;;;;-1:-1:-1::0;;;62449:117:0::1;;;;;;;:::i;:::-;67560:16:::2;:25:::0;;-1:-1:-1;;67560:25:0::2;::::0;;::::2;;::::0;;::::2;::::0;;;::::2;::::0;;;24347:10;67625:12:::2;24267:98:::0;70748:97;70792:13;70825:12;70818:19;;;;;:::i;64007:485::-;22641:1;23239:7;;:19;23231:63;;;;-1:-1:-1;;;23231:63:0;;;;;;;:::i;:::-;22641:1;23372:7;:18;64102:23:::1;::::0;::::1;::::0;::::1;;;64080:105;;;::::0;-1:-1:-1;;;64080:105:0;;20398:2:1;64080:105:0::1;::::0;::::1;20380:21:1::0;20437:2;20417:18;;;20410:30;20476:33;20456:18;;;20449:61;20527:18;;64080:105:0::1;20196:355:1::0;64080:105:0::1;60736:3;60960:2;64237:3;64218:16;;:22;;;;:::i;:::-;:36;;;;:::i;:::-;:54;;64196:128;;;::::0;-1:-1:-1;;;64196:128:0;;13543:2:1;64196:128:0::1;::::0;::::1;13525:21:1::0;13582:2;13562:18;;;13555:30;-1:-1:-1;;;13601:18:1;;;13594:54;13665:18;;64196:128:0::1;13341:348:1::0;64196:128:0::1;60798:1;64343:3;:32;;64335:70;;;::::0;-1:-1:-1;;;64335:70:0;;15486:2:1;64335:70:0::1;::::0;::::1;15468:21:1::0;15525:2;15505:18;;;15498:30;-1:-1:-1;;;15544:18:1;;;15537:55;15609:18;;64335:70:0::1;15284:349:1::0;64335:70:0::1;64438:3;64418:16;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;64452:32:0::1;::::0;-1:-1:-1;24347:10:0;64466:12:::1;24267:98:::0;26622:201;25602:13;:11;:13::i;:::-;-1:-1:-1;;;;;26711:22:0;::::1;26703:73;;;::::0;-1:-1:-1;;;26703:73:0;;20758:2:1;26703:73:0::1;::::0;::::1;20740:21:1::0;20797:2;20777:18;;;20770:30;20836:34;20816:18;;;20809:62;-1:-1:-1;;;20887:18:1;;;20880:36;20933:19;;26703:73:0::1;20556:402:1::0;26703:73:0::1;26787:28;26806:8;26787:18;:28::i;40631:305::-:0;40733:4;-1:-1:-1;;;;;;40770:40:0;;-1:-1:-1;;;40770:40:0;;:105;;-1:-1:-1;;;;;;;40827:48:0;;-1:-1:-1;;;40827:48:0;40770:105;:158;;;-1:-1:-1;;;;;;;;;;29072:40:0;;;40892:36;28963:157;47237:174;47294:4;47337:7;71415:1;47318:26;;:53;;;;;47358:13;;47348:7;:23;47318:53;:85;;;;-1:-1:-1;;47376:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;47376:27:0;;;;47375:28;;47237:174::o;56459:196::-;56574:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;56574:29:0;-1:-1:-1;;;;;56574:29:0;;;;;;;;;56619:28;;56574:24;;56619:28;;;;;;;56459:196;;;:::o;25881:132::-;25789:6;;-1:-1:-1;;;;;25789:6:0;24347:10;25945:23;25937:68;;;;-1:-1:-1;;;25937:68:0;;21165:2:1;25937:68:0;;;21147:21:1;;;21184:18;;;21177:30;21243:34;21223:18;;;21216:62;21295:18;;25937:68:0;20963:356:1;51407:2130:0;51522:35;51560:21;51573:7;51560:12;:21::i;:::-;51522:59;;51620:4;-1:-1:-1;;;;;51598:26:0;:13;:18;;;-1:-1:-1;;;;;51598:26:0;;51594:67;;51633:28;;-1:-1:-1;;;51633:28:0;;;;;;;;;;;51594:67;51674:22;24347:10;-1:-1:-1;;;;;51700:20:0;;;;:73;;-1:-1:-1;51737:36:0;51754:4;24347:10;45884:164;:::i;51737:36::-;51700:126;;;-1:-1:-1;24347:10:0;51790:20;51802:7;51790:11;:20::i;:::-;-1:-1:-1;;;;;51790:36:0;;51700:126;51674:153;;51845:17;51840:66;;51871:35;;-1:-1:-1;;;51871:35:0;;;;;;;;;;;51840:66;-1:-1:-1;;;;;51921:16:0;;51917:52;;51946:23;;-1:-1:-1;;;51946:23:0;;;;;;;;;;;51917:52;52090:35;52107:1;52111:7;52120:4;52090:8;:35::i;:::-;-1:-1:-1;;;;;52421:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;52421:31:0;;;-1:-1:-1;;;;;52421:31:0;;;-1:-1:-1;;52421:31:0;;;;;;;52467:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;52467:29:0;;;;;;;;;;;52547:20;;;:11;:20;;;;;;52582:18;;-1:-1:-1;;;;;;52615:49:0;;;;-1:-1:-1;;;52648:15:0;52615:49;;;;;;;;;;52938:11;;52998:24;;;;;53041:13;;52547:20;;52998:24;;53041:13;53037:384;;53251:13;;53236:11;:28;53232:174;;53289:20;;53358:28;;;;-1:-1:-1;;;;;53332:54:0;-1:-1:-1;;;53332:54:0;-1:-1:-1;;;;;;53332:54:0;;;-1:-1:-1;;;;;53289:20:0;;53332:54;;;;53232:174;52396:1036;;;53468:7;53464:2;-1:-1:-1;;;;;53449:27:0;53458:4;-1:-1:-1;;;;;53449:27:0;-1:-1:-1;;;;;;;;;;;53449:27:0;;;;;;;;;51511:2026;;51407:2130;;;:::o;53615:89::-;53675:21;53681:7;53690:5;53675;:21::i;42381:1111::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;42492:7:0;;71415:1;42541:23;42537:888;;42577:13;;42570:4;:20;42566:859;;;42611:31;42645:17;;;:11;:17;;;;;;;;;42611:51;;;;;;;;;-1:-1:-1;;;;;42611:51:0;;;;-1:-1:-1;;;42611:51:0;;-1:-1:-1;;;;;42611:51:0;;;;;;;;-1:-1:-1;;;42611:51:0;;;;;;;;;;;;;;42681:729;;42731:14;;-1:-1:-1;;;;;42731:28:0;;42727:101;;42795:9;42381:1111;-1:-1:-1;;;42381:1111:0:o;42727:101::-;-1:-1:-1;;;43170:6:0;43215:17;;;;:11;:17;;;;;;;;;43203:29;;;;;;;;;-1:-1:-1;;;;;43203:29:0;;;;;-1:-1:-1;;;43203:29:0;;-1:-1:-1;;;;;43203:29:0;;;;;;;;-1:-1:-1;;;43203:29:0;;;;;;;;;;;;;43263:28;43259:109;;43331:9;42381:1111;-1:-1:-1;;;42381:1111:0:o;43259:109::-;43130:261;;;42592:833;42566:859;43453:31;;-1:-1:-1;;;43453:31:0;;;;;;;;;;;26983:191;27076:6;;;-1:-1:-1;;;;;27093:17:0;;;-1:-1:-1;;;;;;27093:17:0;;;;;;;27126:40;;27076:6;;;27093:17;27076:6;;27126:40;;27057:16;;27126:40;27046:128;26983:191;:::o;13323:190::-;13448:4;13501;13472:25;13485:5;13492:4;13472:12;:25::i;:::-;:33;;13323:190;-1:-1:-1;;;;13323:190:0:o;71432:307::-;71520:1;71514:3;:7;71506:43;;;;-1:-1:-1;;;71506:43:0;;21526:2:1;71506:43:0;;;21508:21:1;21565:2;21545:18;;;21538:30;21604:25;21584:18;;;21577:53;21647:18;;71506:43:0;21324:347:1;71506:43:0;71638:9;;71620:12;;71606:26;;60960:2;71606:26;:::i;:::-;71599:3;71583:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:50;;;;:::i;:::-;71582:65;;71560:135;;;;-1:-1:-1;;;71560:135:0;;21878:2:1;71560:135:0;;;21860:21:1;21917:2;21897:18;;;21890:30;-1:-1:-1;;;21936:18:1;;;21929:50;21996:18;;71560:135:0;21676:344:1;71560:135:0;71706:25;71716:9;71727:3;71706:9;:25::i;57147:667::-;57331:72;;-1:-1:-1;;;57331:72:0;;57310:4;;-1:-1:-1;;;;;57331:36:0;;;;;:72;;24347:10;;57382:4;;57388:7;;57397:5;;57331:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57331:72:0;;;;;;;;-1:-1:-1;;57331:72:0;;;;;;;;;;;;:::i;:::-;;;57327:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57565:6;:13;57582:1;57565:18;57561:235;;57611:40;;-1:-1:-1;;;57611:40:0;;;;;;;;;;;57561:235;57754:6;57748:13;57739:6;57735:2;57731:15;57724:38;57327:480;-1:-1:-1;;;;;;57450:55:0;-1:-1:-1;;;57450:55:0;;-1:-1:-1;57327:480:0;57147:667;;;;;;:::o;10037:723::-;10093:13;10314:5;10323:1;10314:10;10310:53;;-1:-1:-1;;10341:10:0;;;;;;;;;;;;-1:-1:-1;;;10341:10:0;;;;;10037:723::o;10310:53::-;10388:5;10373:12;10429:78;10436:9;;10429:78;;10462:8;;;;:::i;:::-;;-1:-1:-1;10485:10:0;;-1:-1:-1;10493:2:0;10485:10;;:::i;:::-;;;10429:78;;;10517:19;10549:6;-1:-1:-1;;;;;10539:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10539:17:0;;10517:39;;10567:154;10574:10;;10567:154;;10601:11;10611:1;10601:11;;:::i;:::-;;-1:-1:-1;10670:10:0;10678:2;10670:5;:10;:::i;:::-;10657:24;;:2;:24;:::i;:::-;10644:39;;10627:6;10634;10627:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;10627:56:0;;;;;;;;-1:-1:-1;10698:11:0;10707:2;10698:11;;:::i;:::-;;;10567:154;;53933:2408;54013:35;54051:21;54064:7;54051:12;:21::i;:::-;54100:18;;54013:59;;-1:-1:-1;54131:290:0;;;;54165:22;24347:10;-1:-1:-1;;;;;54191:20:0;;;;:77;;-1:-1:-1;54232:36:0;54249:4;24347:10;45884:164;:::i;54232:36::-;54191:134;;;-1:-1:-1;24347:10:0;54289:20;54301:7;54289:11;:20::i;:::-;-1:-1:-1;;;;;54289:36:0;;54191:134;54165:161;;54348:17;54343:66;;54374:35;;-1:-1:-1;;;54374:35:0;;;;;;;;;;;54343:66;54150:271;54131:290;54549:35;54566:1;54570:7;54579:4;54549:8;:35::i;:::-;-1:-1:-1;;;;;54914:18:0;;;54880:31;54914:18;;;:12;:18;;;;;;;;54947:24;;-1:-1:-1;;;;;;;;;;54947:24:0;;;;;;;;;-1:-1:-1;;54947:24:0;;;;54986:29;;;;;54970:1;54986:29;;;;;;;;-1:-1:-1;;54986:29:0;;;;;;;;;;55148:20;;;:11;:20;;;;;;55183;;-1:-1:-1;;;;55251:15:0;55218:49;;;-1:-1:-1;;;55218:49:0;-1:-1:-1;;;;;;55218:49:0;;;;;;;;;;55282:22;-1:-1:-1;;;55282:22:0;;;55574:11;;;55634:24;;;;;55677:13;;54914:18;;55634:24;;55677:13;55673:384;;55887:13;;55872:11;:28;55868:174;;55925:20;;55994:28;;;;-1:-1:-1;;;;;55968:54:0;-1:-1:-1;;;55968:54:0;-1:-1:-1;;;;;;55968:54:0;;;-1:-1:-1;;;;;55925:20:0;;55968:54;;;;55868:174;-1:-1:-1;;56085:35:0;;56112:7;;-1:-1:-1;56108:1:0;;-1:-1:-1;;;;;;56085:35:0;;;-1:-1:-1;;;;;;;;;;;56085:35:0;56108:1;;56085:35;-1:-1:-1;;56308:12:0;:14;;;;;;-1:-1:-1;;53933:2408:0:o;14190:296::-;14273:7;14316:4;14273:7;14331:118;14355:5;:12;14351:1;:16;14331:118;;;14404:33;14414:12;14428:5;14434:1;14428:8;;;;;;;;:::i;:::-;;;;;;;14404:9;:33::i;:::-;14389:48;-1:-1:-1;14369:3:0;;;;:::i;:::-;;;;14331:118;;;-1:-1:-1;14466:12:0;14190:296;-1:-1:-1;;;14190:296:0:o;47495:104::-;47564:27;47574:2;47578:8;47564:27;;;;;;;;;;;;:9;:27::i;20397:149::-;20460:7;20491:1;20487;:5;:51;;20622:13;20716:15;;;20752:4;20745:15;;;20799:4;20783:21;;20487:51;;;20622:13;20716:15;;;20752:4;20745:15;;;20799:4;20783:21;;20495:20;20480:58;20397:149;-1:-1:-1;;;20397:149:0:o;47972:1749::-;48095:20;48118:13;-1:-1:-1;;;;;48146:16:0;;48142:48;;48171:19;;-1:-1:-1;;;48171:19:0;;;;;;;;;;;48142:48;48205:8;48217:1;48205:13;48201:44;;48227:18;;-1:-1:-1;;;48227:18:0;;;;;;;;;;;48201:44;-1:-1:-1;;;;;48596:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;48655:49:0;;-1:-1:-1;;;;;48596:44:0;;;;;;;48655:49;;;;-1:-1:-1;;48596:44:0;;;;;;48655:49;;;;;;;;;;;;;;;;48721:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;48771:66:0;;;-1:-1:-1;;;48821:15:0;48771:66;;;;;;;;;;;;;48721:25;;48918:23;;;;1528:19;:23;48958:631;;48998:313;49029:38;;49054:12;;-1:-1:-1;;;;;49029:38:0;;;49046:1;;-1:-1:-1;;;;;;;;;;;49029:38:0;49046:1;;49029:38;49095:69;49134:1;49138:2;49142:14;;;;;;49158:5;49095:30;:69::i;:::-;49090:174;;49200:40;;-1:-1:-1;;;49200:40:0;;;;;;;;;;;49090:174;49306:3;49291:12;:18;48998:313;;49392:12;49375:13;;:29;49371:43;;49406:8;;;49371:43;48958:631;;;49455:119;49486:40;;49511:14;;;;;-1:-1:-1;;;;;49486:40:0;;;49503:1;;-1:-1:-1;;;;;;;;;;;49486:40:0;49503:1;;49486:40;49569:3;49554:12;:18;49455:119;;48958:631;-1:-1:-1;49603:13:0;:28;;;49653:60;;49686:2;49690:12;49704:8;49653:60;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:269::-;908:3;946:5;940:12;973:6;968:3;961:19;989:63;1045:6;1038:4;1033:3;1029:14;1022:4;1015:5;1011:16;989:63;:::i;:::-;1106:2;1085:15;-1:-1:-1;;1081:29:1;1072:39;;;;1113:4;1068:50;;855:269;-1:-1:-1;;855:269:1:o;1129:231::-;1278:2;1267:9;1260:21;1241:4;1298:56;1350:2;1339:9;1335:18;1327:6;1298:56;:::i;1365:180::-;1424:6;1477:2;1465:9;1456:7;1452:23;1448:32;1445:52;;;1493:1;1490;1483:12;1445:52;-1:-1:-1;1516:23:1;;1365:180;-1:-1:-1;1365:180:1:o;1758:173::-;1826:20;;-1:-1:-1;;;;;1875:31:1;;1865:42;;1855:70;;1921:1;1918;1911:12;1855:70;1758:173;;;:::o;1936:254::-;2004:6;2012;2065:2;2053:9;2044:7;2040:23;2036:32;2033:52;;;2081:1;2078;2071:12;2033:52;2104:29;2123:9;2104:29;:::i;:::-;2094:39;2180:2;2165:18;;;;2152:32;;-1:-1:-1;;;1936:254:1:o;2195:251::-;2279:6;2332:2;2320:9;2311:7;2307:23;2303:32;2300:52;;;2348:1;2345;2338:12;2300:52;2387:7;2382:2;2371:9;2367:18;2364:31;2361:51;;;2408:1;2405;2398:12;2361:51;-1:-1:-1;2431:9:1;2195:251;-1:-1:-1;2195:251:1:o;2633:328::-;2710:6;2718;2726;2779:2;2767:9;2758:7;2754:23;2750:32;2747:52;;;2795:1;2792;2785:12;2747:52;2818:29;2837:9;2818:29;:::i;:::-;2808:39;;2866:38;2900:2;2889:9;2885:18;2866:38;:::i;:::-;2856:48;;2951:2;2940:9;2936:18;2923:32;2913:42;;2633:328;;;;;:::o;2966:592::-;3037:6;3045;3098:2;3086:9;3077:7;3073:23;3069:32;3066:52;;;3114:1;3111;3104:12;3066:52;3154:9;3141:23;-1:-1:-1;;;;;3224:2:1;3216:6;3213:14;3210:34;;;3240:1;3237;3230:12;3210:34;3278:6;3267:9;3263:22;3253:32;;3323:7;3316:4;3312:2;3308:13;3304:27;3294:55;;3345:1;3342;3335:12;3294:55;3385:2;3372:16;3411:2;3403:6;3400:14;3397:34;;;3427:1;3424;3417:12;3397:34;3472:7;3467:2;3458:6;3454:2;3450:15;3446:24;3443:37;3440:57;;;3493:1;3490;3483:12;3440:57;3524:2;3516:11;;;;;3546:6;;-1:-1:-1;2966:592:1;;-1:-1:-1;;;;2966:592:1:o;3745:186::-;3804:6;3857:2;3845:9;3836:7;3832:23;3828:32;3825:52;;;3873:1;3870;3863:12;3825:52;3896:29;3915:9;3896:29;:::i;3936:160::-;4001:20;;4057:13;;4050:21;4040:32;;4030:60;;4086:1;4083;4076:12;4101:180;4157:6;4210:2;4198:9;4189:7;4185:23;4181:32;4178:52;;;4226:1;4223;4216:12;4178:52;4249:26;4265:9;4249:26;:::i;4286:683::-;4381:6;4389;4397;4450:2;4438:9;4429:7;4425:23;4421:32;4418:52;;;4466:1;4463;4456:12;4418:52;4502:9;4489:23;4479:33;;4563:2;4552:9;4548:18;4535:32;-1:-1:-1;;;;;4627:2:1;4619:6;4616:14;4613:34;;;4643:1;4640;4633:12;4613:34;4681:6;4670:9;4666:22;4656:32;;4726:7;4719:4;4715:2;4711:13;4707:27;4697:55;;4748:1;4745;4738:12;4697:55;4788:2;4775:16;4814:2;4806:6;4803:14;4800:34;;;4830:1;4827;4820:12;4800:34;4883:7;4878:2;4868:6;4865:1;4861:14;4857:2;4853:23;4849:32;4846:45;4843:65;;;4904:1;4901;4894:12;4843:65;4935:2;4931;4927:11;4917:21;;4957:6;4947:16;;;;;4286:683;;;;;:::o;4974:632::-;5145:2;5197:21;;;5267:13;;5170:18;;;5289:22;;;5116:4;;5145:2;5368:15;;;;5342:2;5327:18;;;5116:4;5411:169;5425:6;5422:1;5419:13;5411:169;;;5486:13;;5474:26;;5555:15;;;;5520:12;;;;5447:1;5440:9;5411:169;;;-1:-1:-1;5597:3:1;;4974:632;-1:-1:-1;;;;;;4974:632:1:o;5611:127::-;5672:10;5667:3;5663:20;5660:1;5653:31;5703:4;5700:1;5693:15;5727:4;5724:1;5717:15;5743:632;5808:5;-1:-1:-1;;;;;5879:2:1;5871:6;5868:14;5865:40;;;5885:18;;:::i;:::-;5960:2;5954:9;5928:2;6014:15;;-1:-1:-1;;6010:24:1;;;6036:2;6006:33;6002:42;5990:55;;;6060:18;;;6080:22;;;6057:46;6054:72;;;6106:18;;:::i;:::-;6146:10;6142:2;6135:22;6175:6;6166:15;;6205:6;6197;6190:22;6245:3;6236:6;6231:3;6227:16;6224:25;6221:45;;;6262:1;6259;6252:12;6221:45;6312:6;6307:3;6300:4;6292:6;6288:17;6275:44;6367:1;6360:4;6351:6;6343;6339:19;6335:30;6328:41;;;;5743:632;;;;;:::o;6380:451::-;6449:6;6502:2;6490:9;6481:7;6477:23;6473:32;6470:52;;;6518:1;6515;6508:12;6470:52;6558:9;6545:23;-1:-1:-1;;;;;6583:6:1;6580:30;6577:50;;;6623:1;6620;6613:12;6577:50;6646:22;;6699:4;6691:13;;6687:27;-1:-1:-1;6677:55:1;;6728:1;6725;6718:12;6677:55;6751:74;6817:7;6812:2;6799:16;6794:2;6790;6786:11;6751:74;:::i;6836:254::-;6904:6;6912;6965:2;6953:9;6944:7;6940:23;6936:32;6933:52;;;6981:1;6978;6971:12;6933:52;7017:9;7004:23;6994:33;;7046:38;7080:2;7069:9;7065:18;7046:38;:::i;:::-;7036:48;;6836:254;;;;;:::o;7280:::-;7345:6;7353;7406:2;7394:9;7385:7;7381:23;7377:32;7374:52;;;7422:1;7419;7412:12;7374:52;7445:29;7464:9;7445:29;:::i;:::-;7435:39;;7493:35;7524:2;7513:9;7509:18;7493:35;:::i;7539:667::-;7634:6;7642;7650;7658;7711:3;7699:9;7690:7;7686:23;7682:33;7679:53;;;7728:1;7725;7718:12;7679:53;7751:29;7770:9;7751:29;:::i;:::-;7741:39;;7799:38;7833:2;7822:9;7818:18;7799:38;:::i;:::-;7789:48;;7884:2;7873:9;7869:18;7856:32;7846:42;;7939:2;7928:9;7924:18;7911:32;-1:-1:-1;;;;;7958:6:1;7955:30;7952:50;;;7998:1;7995;7988:12;7952:50;8021:22;;8074:4;8066:13;;8062:27;-1:-1:-1;8052:55:1;;8103:1;8100;8093:12;8052:55;8126:74;8192:7;8187:2;8174:16;8169:2;8165;8161:11;8126:74;:::i;:::-;8116:84;;;7539:667;;;;;;;:::o;8211:260::-;8279:6;8287;8340:2;8328:9;8319:7;8315:23;8311:32;8308:52;;;8356:1;8353;8346:12;8308:52;8379:29;8398:9;8379:29;:::i;:::-;8369:39;;8427:38;8461:2;8450:9;8446:18;8427:38;:::i;8476:380::-;8555:1;8551:12;;;;8598;;;8619:61;;8673:4;8665:6;8661:17;8651:27;;8619:61;8726:2;8718:6;8715:14;8695:18;8692:38;8689:161;;8772:10;8767:3;8763:20;8760:1;8753:31;8807:4;8804:1;8797:15;8835:4;8832:1;8825:15;8861:127;8922:10;8917:3;8913:20;8910:1;8903:31;8953:4;8950:1;8943:15;8977:4;8974:1;8967:15;9674:342;9876:2;9858:21;;;9915:2;9895:18;;;9888:30;-1:-1:-1;;;9949:2:1;9934:18;;9927:48;10007:2;9992:18;;9674:342::o;11079:353::-;11281:2;11263:21;;;11320:2;11300:18;;;11293:30;11359:31;11354:2;11339:18;;11332:59;11423:2;11408:18;;11079:353::o;11787:355::-;11989:2;11971:21;;;12028:2;12008:18;;;12001:30;12067:33;12062:2;12047:18;;12040:61;12133:2;12118:18;;11787:355::o;13076:127::-;13137:10;13132:3;13128:20;13125:1;13118:31;13168:4;13165:1;13158:15;13192:4;13189:1;13182:15;13208:128;13248:3;13279:1;13275:6;13272:1;13269:13;13266:39;;;13285:18;;:::i;:::-;-1:-1:-1;13321:9:1;;13208:128::o;14758:168::-;14798:7;14864:1;14860;14856:6;14852:14;14849:1;14846:21;14841:1;14834:9;14827:17;14823:45;14820:71;;;14871:18;;:::i;:::-;-1:-1:-1;14911:9:1;;14758:168::o;15985:125::-;16025:4;16053:1;16050;16047:8;16044:34;;;16058:18;;:::i;:::-;-1:-1:-1;16095:9:1;;15985:125::o;16115:127::-;16176:10;16171:3;16167:20;16164:1;16157:31;16207:4;16204:1;16197:15;16231:4;16228:1;16221:15;16247:120;16287:1;16313;16303:35;;16318:18;;:::i;:::-;-1:-1:-1;16352:9:1;;16247:120::o;17637:185::-;17679:3;17717:5;17711:12;17732:52;17777:6;17772:3;17765:4;17758:5;17754:16;17732:52;:::i;:::-;17800:16;;;;;17637:185;-1:-1:-1;;17637:185:1:o;17827:1306::-;18104:3;18133:1;18166:6;18160:13;18196:3;18218:1;18246:9;18242:2;18238:18;18228:28;;18306:2;18295:9;18291:18;18328;18318:61;;18372:4;18364:6;18360:17;18350:27;;18318:61;18398:2;18446;18438:6;18435:14;18415:18;18412:38;18409:165;;-1:-1:-1;;;18473:33:1;;18529:4;18526:1;18519:15;18559:4;18480:3;18547:17;18409:165;18590:18;18617:104;;;;18735:1;18730:320;;;;18583:467;;18617:104;-1:-1:-1;;18650:24:1;;18638:37;;18695:16;;;;-1:-1:-1;18617:104:1;;18730:320;17465:1;17458:14;;;17502:4;17489:18;;18825:1;18839:165;18853:6;18850:1;18847:13;18839:165;;;18931:14;;18918:11;;;18911:35;18974:16;;;;18868:10;;18839:165;;;18843:3;;19033:6;19028:3;19024:16;19017:23;;18583:467;;;;;;;19066:61;19092:34;19122:3;-1:-1:-1;;;17583:16:1;;17624:1;17615:11;;17518:114;19092:34;19084:6;19066:61;:::i;:::-;19059:68;17827:1306;-1:-1:-1;;;;;17827:1306:1:o;22025:500::-;-1:-1:-1;;;;;22294:15:1;;;22276:34;;22346:15;;22341:2;22326:18;;22319:43;22393:2;22378:18;;22371:34;;;22441:3;22436:2;22421:18;;22414:31;;;22219:4;;22462:57;;22499:19;;22491:6;22462:57;:::i;:::-;22454:65;22025:500;-1:-1:-1;;;;;;22025:500:1:o;22530:249::-;22599:6;22652:2;22640:9;22631:7;22627:23;22623:32;22620:52;;;22668:1;22665;22658:12;22620:52;22700:9;22694:16;22719:30;22743:5;22719:30;:::i;22784:135::-;22823:3;22844:17;;;22841:43;;22864:18;;:::i;:::-;-1:-1:-1;22911:1:1;22900:13;;22784:135::o;22924:112::-;22956:1;22982;22972:35;;22987:18;;:::i;:::-;-1:-1:-1;23021:9:1;;22924:112::o
Swarm Source
ipfs://ada9ced9459d59f04246682d1ab9c5bcb14dbaa61e5a0dc2ac769ca35a524a4c
Loading...
Loading
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.