ETH Price: $3,074.58 (-1.50%)

Token

The Verdyct (VERDYCT)
 

Overview

Max Total Supply

1,047 VERDYCT

Holders

967

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 VERDYCT
0x6c857946729d3ea6a2a80b7580b0c3e4300a3d0c
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TheVerdyctResurgence

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-25
*/

// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees 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.
 */
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 Returns the rebuilt hash obtained by traversing a Merklee 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++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.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

                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/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.6.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 be 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: erc721a/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: @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: erc721a/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/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _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);
    }
}



pragma solidity ^0.8.0;

contract TheVerdyctResurgence is ERC721A, Ownable {
    bytes32 public root;
	using Strings for uint;

	uint public PUBLIC_MINT_PRICE = 0.006 ether;
	uint public MAX_NFT_PER_TRAN = 3;
    uint public MAX_PER_WALLET = 100;
    uint public MAX_FREE_MINT = 1;
	uint public FREE_CLAIM_LIMIT = 1000;
	uint public maxSupply = 2000;

	bool public isPublicMint = false;
    bool public isMetadataFinal;
    string private _baseURL;
	string public prerevealURL = "ipfs://bafybeigl2iqnrnwnhgr3nkrw5mklhjkqmeuoqhaeda2p5gnjvohrxuvhfi/unrevealed.json";
	mapping(address => uint) private _walletMintedCount;
	mapping(address => uint) private _freeMintedCount;

    // Name
	constructor()
	ERC721A('The Verdyct', 'VERDYCT') {
    }

	function _baseURI() internal view override returns (string memory) {
		return _baseURL;
	}

	function _startTokenId() internal pure override returns (uint) {
		return 1;
	}

	function contractURI() public pure returns (string memory) {
		return "";
	}

    function finalizeMetadata() external onlyOwner {
        isMetadataFinal = true;
    }

	function reveal(string memory url) external onlyOwner {
        require(!isMetadataFinal, "Metadata is finalized");
		_baseURL = url;
	}

    function setPrereveal(string memory url) external onlyOwner {
		prerevealURL = url;
	}

    function mintedCount(address owner) external view returns (uint) {
        return _walletMintedCount[owner];
    }

    function setRoot(bytes32 _root) external onlyOwner {
		root = _root;
	}

	function setPublicState(bool value) external onlyOwner {
		isPublicMint = value;
	}


    // Splitter
    
    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;

        //Dev Wallet
        address _wallet1 = 0x52a3b74b0C0607BE3BB1Ca09dC3d2aE3081746e6;
        uint _payable1 = balance * 25 / 100; // 25%
        payable(_wallet1).transfer(_payable1);

        //Founder Wallet
        address _wallet2 = 0xD2d9B8a80997c335CE8980a8da015036C3e7d331;
        uint _payable2 = balance * 75 / 100; // 75%
        payable(_wallet2).transfer(_payable2);
    }

    // function withdraw() public onlyOwner {
    //     uint256 balance = address(this).balance;
    //     payable(msg.sender).transfer(balance);
    // }

	function reserveMint(address to, uint count) external onlyOwner {
		require(
			_totalMinted() + count <= maxSupply,
			'Exceeds max supply'
		);
		_safeMint(to, count);
	}

    function setCost(uint newCost) external onlyOwner {
		PUBLIC_MINT_PRICE = newCost;
	}

	function reduceSupply(uint newMaxSupply) external onlyOwner {
		maxSupply = newMaxSupply;
	}

    function setNumFreeMints(uint newFreeMints) external onlyOwner {
		MAX_FREE_MINT = newFreeMints;
	}

    function setFreeClaimLimit(uint newLimit) external onlyOwner {
		FREE_CLAIM_LIMIT = newLimit;
	}

	function tokenURI(uint tokenId)
		public
		view
		override
		returns (string memory)
	{
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        return bytes(_baseURI()).length > 0 
            ? string(abi.encodePacked(_baseURI(), tokenId.toString(), ".json"))
            : prerevealURL;
	}

	function isValid(bytes32[] memory proof, bytes32 leaf) public view returns (bool) {
        return MerkleProof.verify(proof, root, leaf);
    }
    
    function publicMint(uint count) external payable {
		require(isPublicMint, "Mint has not started");
		require(count <= MAX_NFT_PER_TRAN,'Exceeds NFT per transaction limit');
		require(_totalMinted() + count <= maxSupply,'Exceeds max supply');
        require(_walletMintedCount[msg.sender] + count <= MAX_PER_WALLET,'Exceeds max per wallet');

		require(
			msg.value >= count * PUBLIC_MINT_PRICE,
			'Ether value sent is not sufficient'
		);

		_walletMintedCount[msg.sender] += count;
		_safeMint(msg.sender, count);
	}

    function freeClaim() public  {
        uint count = 1;
        uint freeSoFar = _freeMintedCount[msg.sender];

        // //require(isValid(proof, keccak256(abi.encodePacked(msg.sender))), "You are not on the allowlist");
        // if (isValid(proof, keccak256(abi.encodePacked(msg.sender)))) {
        //     revert NotWhitelisted();
        // }

		require(isPublicMint, "Mint has not started");
		require(totalSupply() < FREE_CLAIM_LIMIT, "Exceeds max free claim supply");
		require(freeSoFar < MAX_FREE_MINT, "You have already claimed your free NFT");
		require(_totalMinted() + count <= maxSupply,'Exceeds max supply');
        require(_walletMintedCount[msg.sender] + count <= MAX_PER_WALLET,'Exceeds max per wallet');

		_freeMintedCount[msg.sender] += count;
		_safeMint(msg.sender, count);
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":"FREE_CLAIM_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FREE_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NFT_PER_TRAN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_MINT_PRICE","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"finalizeMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeClaim","outputs":[],"stateMutability":"nonpayable","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":"isMetadataFinal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"isValid","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":"address","name":"owner","type":"address"}],"name":"mintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"prerevealURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxSupply","type":"uint256"}],"name":"reduceSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"reserveMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"url","type":"string"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","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","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"setFreeClaimLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFreeMints","type":"uint256"}],"name":"setNumFreeMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"url","type":"string"}],"name":"setPrereveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setPublicState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setRoot","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":[],"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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

661550f7dca70000600a556003600b556064600c556001600d556103e8600e556107d0600f556010805460ff1916905561010060405260526080818152906200264760a03980516200005a916012916020909101906200013c565b503480156200006857600080fd5b50604080518082018252600b81526a151a194815995c991e58dd60aa1b602080830191825283518085019094526007845266159154911650d560ca1b908401528151919291620000bb916002916200013c565b508051620000d19060039060208401906200013c565b5050600160005550620000e433620000ea565b6200021f565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200014a90620001e2565b90600052602060002090601f0160209004810192826200016e5760008555620001b9565b82601f106200018957805160ff1916838001178555620001b9565b82800160010185558215620001b9579182015b82811115620001b95782518255916020019190600101906200019c565b50620001c7929150620001cb565b5090565b5b80821115620001c75760008155600101620001cc565b600181811c90821680620001f757607f821691505b602082108114156200021957634e487b7160e01b600052602260045260246000fd5b50919050565b612418806200022f6000396000f3fe60806040526004361061025c5760003560e01c8063715018a611610144578063d5abeb01116100b6578063e8a3d4851161007a578063e8a3d485146106b4578063e985e9c5146106d5578063ebf0c7171461071e578063f2fde38b14610734578063f4a560a514610754578063fddcb5ea1461076957600080fd5b8063d5abeb011461063e578063d821048214610654578063dab5f34014610669578063e193e7e214610689578063e88d3b3e1461069f57600080fd5b8063a22cb46511610108578063a22cb4651461057e578063b0ea18021461059e578063b88d4fde146105be578063b8a20ed0146105de578063c48156af146105fe578063c87b56dd1461061e57600080fd5b8063715018a6146104f6578063806234441461050b57806386ffb1bb1461052b5780638da5cb5b1461054b57806395d89b411461056957600080fd5b80632db11544116101dd57806344a0d68a116101a157806344a0d68a146104405780634c261247146104605780635797cc01146104805780636352211e146104a05780636bde2627146104c057806370a08231146104d657600080fd5b80632db11544146103c85780633057931f146103db5780633ccfd60b146103f557806341cda2031461040a57806342842e0e1461042057600080fd5b80630a00ae83116102245780630a00ae83146103365780630de76de4146103565780630f2cdd6c1461037557806318160ddd1461038b57806323b872dd146103a857600080fd5b806301ffc9a71461026157806306fdde0314610296578063081812fc146102b857806308d692fb146102f0578063095ea7b314610314575b600080fd5b34801561026d57600080fd5b5061028161027c3660046120ac565b61079f565b60405190151581526020015b60405180910390f35b3480156102a257600080fd5b506102ab6107f1565b60405161028d91906121d7565b3480156102c457600080fd5b506102d86102d3366004612093565b610883565b6040516001600160a01b03909116815260200161028d565b3480156102fc57600080fd5b50610306600e5481565b60405190815260200161028d565b34801561032057600080fd5b5061033461032f366004611f9b565b6108c7565b005b34801561034257600080fd5b50610334610351366004612093565b61094e565b34801561036257600080fd5b5060105461028190610100900460ff1681565b34801561038157600080fd5b50610306600c5481565b34801561039757600080fd5b506001546000540360001901610306565b3480156103b457600080fd5b506103346103c3366004611eb9565b610986565b6103346103d6366004612093565b610991565b3480156103e757600080fd5b506010546102819060ff1681565b34801561040157600080fd5b50610334610b6d565b34801561041657600080fd5b50610306600d5481565b34801561042c57600080fd5b5061033461043b366004611eb9565b610c6f565b34801561044c57600080fd5b5061033461045b366004612093565b610c8a565b34801561046c57600080fd5b5061033461047b3660046120e6565b610cb9565b34801561048c57600080fd5b5061033461049b366004612093565b610d4a565b3480156104ac57600080fd5b506102d86104bb366004612093565b610d79565b3480156104cc57600080fd5b50610306600a5481565b3480156104e257600080fd5b506103066104f1366004611e6b565b610d8b565b34801561050257600080fd5b50610334610dda565b34801561051757600080fd5b50610334610526366004612093565b610e10565b34801561053757600080fd5b506103346105463660046120e6565b610e3f565b34801561055757600080fd5b506008546001600160a01b03166102d8565b34801561057557600080fd5b506102ab610e7c565b34801561058a57600080fd5b50610334610599366004611f71565b610e8b565b3480156105aa57600080fd5b506103346105b9366004611f9b565b610f21565b3480156105ca57600080fd5b506103346105d9366004611ef5565b610f8e565b3480156105ea57600080fd5b506102816105f9366004611fc5565b610fd8565b34801561060a57600080fd5b50610334610619366004612078565b610fee565b34801561062a57600080fd5b506102ab610639366004612093565b61102b565b34801561064a57600080fd5b50610306600f5481565b34801561066057600080fd5b506102ab611171565b34801561067557600080fd5b50610334610684366004612093565b6111ff565b34801561069557600080fd5b50610306600b5481565b3480156106ab57600080fd5b5061033461122e565b3480156106c057600080fd5b506040805160208101909152600081526102ab565b3480156106e157600080fd5b506102816106f0366004611e86565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561072a57600080fd5b5061030660095481565b34801561074057600080fd5b5061033461074f366004611e6b565b611413565b34801561076057600080fd5b506103346114ab565b34801561077557600080fd5b50610306610784366004611e6b565b6001600160a01b031660009081526013602052604090205490565b60006001600160e01b031982166380ac58cd60e01b14806107d057506001600160e01b03198216635b5e139f60e01b145b806107eb57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600280546108009061230a565b80601f016020809104026020016040519081016040528092919081815260200182805461082c9061230a565b80156108795780601f1061084e57610100808354040283529160200191610879565b820191906000526020600020905b81548152906001019060200180831161085c57829003601f168201915b5050505050905090565b600061088e826114e6565b6108ab576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006108d282610d79565b9050806001600160a01b0316836001600160a01b031614156109075760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161461093e5761092181336106f0565b61093e576040516367d9dca160e11b815260040160405180910390fd5b61094983838361151f565b505050565b6008546001600160a01b031633146109815760405162461bcd60e51b815260040161097890612216565b60405180910390fd5b600d55565b61094983838361157b565b60105460ff166109da5760405162461bcd60e51b8152602060048201526014602482015273135a5b9d081a185cc81b9bdd081cdd185c9d195960621b6044820152606401610978565b600b54811115610a365760405162461bcd60e51b815260206004820152602160248201527f45786365656473204e465420706572207472616e73616374696f6e206c696d696044820152601d60fa1b6064820152608401610978565b600f5481610a476000546000190190565b610a51919061227c565b1115610a6f5760405162461bcd60e51b8152600401610978906121ea565b600c5433600090815260136020526040902054610a8d90839061227c565b1115610ad45760405162461bcd60e51b8152602060048201526016602482015275115e18d959591cc81b585e081c195c881dd85b1b195d60521b6044820152606401610978565b600a54610ae190826122a8565b341015610b3b5760405162461bcd60e51b815260206004820152602260248201527f45746865722076616c75652073656e74206973206e6f742073756666696369656044820152611b9d60f21b6064820152608401610978565b3360009081526013602052604081208054839290610b5a90849061227c565b90915550610b6a9050338261176a565b50565b6008546001600160a01b03163314610b975760405162461bcd60e51b815260040161097890612216565b477352a3b74b0c0607be3bb1ca09dc3d2ae3081746e660006064610bbc8460196122a8565b610bc69190612294565b6040519091506001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610bff573d6000803e3d6000fd5b5073d2d9b8a80997c335ce8980a8da015036c3e7d33160006064610c2486604b6122a8565b610c2e9190612294565b6040519091506001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610c67573d6000803e3d6000fd5b505050505050565b61094983838360405180602001604052806000815250610f8e565b6008546001600160a01b03163314610cb45760405162461bcd60e51b815260040161097890612216565b600a55565b6008546001600160a01b03163314610ce35760405162461bcd60e51b815260040161097890612216565b601054610100900460ff1615610d335760405162461bcd60e51b815260206004820152601560248201527413595d1859185d18481a5cc8199a5b985b1a5e9959605a1b6044820152606401610978565b8051610d46906011906020840190611d4e565b5050565b6008546001600160a01b03163314610d745760405162461bcd60e51b815260040161097890612216565b600e55565b6000610d8482611784565b5192915050565b60006001600160a01b038216610db4576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03163314610e045760405162461bcd60e51b815260040161097890612216565b610e0e60006118a8565b565b6008546001600160a01b03163314610e3a5760405162461bcd60e51b815260040161097890612216565b600f55565b6008546001600160a01b03163314610e695760405162461bcd60e51b815260040161097890612216565b8051610d46906012906020840190611d4e565b6060600380546108009061230a565b6001600160a01b038216331415610eb55760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b03163314610f4b5760405162461bcd60e51b815260040161097890612216565b600f5481610f5c6000546000190190565b610f66919061227c565b1115610f845760405162461bcd60e51b8152600401610978906121ea565b610d46828261176a565b610f9984848461157b565b6001600160a01b0383163b15610fd257610fb5848484846118fa565b610fd2576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6000610fe783600954846119f2565b9392505050565b6008546001600160a01b031633146110185760405162461bcd60e51b815260040161097890612216565b6010805460ff1916911515919091179055565b6060611036826114e6565b61109a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610978565b60006110a4611a08565b511161113a57601280546110b79061230a565b80601f01602080910402602001604051908101604052809291908181526020018280546110e39061230a565b80156111305780601f1061110557610100808354040283529160200191611130565b820191906000526020600020905b81548152906001019060200180831161111357829003601f168201915b50505050506107eb565b611142611a08565b61114b83611a17565b60405160200161115c92919061215b565b60405160208183030381529060405292915050565b6012805461117e9061230a565b80601f01602080910402602001604051908101604052809291908181526020018280546111aa9061230a565b80156111f75780601f106111cc576101008083540402835291602001916111f7565b820191906000526020600020905b8154815290600101906020018083116111da57829003601f168201915b505050505081565b6008546001600160a01b031633146112295760405162461bcd60e51b815260040161097890612216565b600955565b336000908152601460205260409020546010546001919060ff1661128b5760405162461bcd60e51b8152602060048201526014602482015273135a5b9d081a185cc81b9bdd081cdd185c9d195960621b6044820152606401610978565b600e546001546000540360001901106112e65760405162461bcd60e51b815260206004820152601d60248201527f45786365656473206d6178206672656520636c61696d20737570706c790000006044820152606401610978565b600d5481106113465760405162461bcd60e51b815260206004820152602660248201527f596f75206861766520616c726561647920636c61696d656420796f757220667260448201526519594813919560d21b6064820152608401610978565b600f54826113576000546000190190565b611361919061227c565b111561137f5760405162461bcd60e51b8152600401610978906121ea565b600c543360009081526013602052604090205461139d90849061227c565b11156113e45760405162461bcd60e51b8152602060048201526016602482015275115e18d959591cc81b585e081c195c881dd85b1b195d60521b6044820152606401610978565b336000908152601460205260408120805484929061140390849061227c565b90915550610d469050338361176a565b6008546001600160a01b0316331461143d5760405162461bcd60e51b815260040161097890612216565b6001600160a01b0381166114a25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610978565b610b6a816118a8565b6008546001600160a01b031633146114d55760405162461bcd60e51b815260040161097890612216565b6010805461ff001916610100179055565b6000816001111580156114fa575060005482105b80156107eb575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061158682611784565b9050836001600160a01b031681600001516001600160a01b0316146115bd5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b03861614806115db57506115db85336106f0565b806115f65750336115eb84610883565b6001600160a01b0316145b90508061161657604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661163d57604051633a954ecd60e21b815260040160405180910390fd5b6116496000848761151f565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661171f57600054821461171f578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b610d46828260405180602001604052806000815250611b15565b6040805160608101825260008082526020820181905291810191909152818060011161188f5760005481101561188f57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff1615159181018290529061188d5780516001600160a01b031615611823579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215611888579392505050565b611823565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061192f90339089908890889060040161219a565b602060405180830381600087803b15801561194957600080fd5b505af1925050508015611979575060408051601f3d908101601f19168201909252611976918101906120c9565b60015b6119d4573d8080156119a7576040519150601f19603f3d011682016040523d82523d6000602084013e6119ac565b606091505b5080516119cc576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6000826119ff8584611cda565b14949350505050565b6060601180546108009061230a565b606081611a3b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611a655780611a4f81612345565b9150611a5e9050600a83612294565b9150611a3f565b60008167ffffffffffffffff811115611a8057611a806123b6565b6040519080825280601f01601f191660200182016040528015611aaa576020820181803683370190505b5090505b84156119ea57611abf6001836122c7565b9150611acc600a86612360565b611ad790603061227c565b60f81b818381518110611aec57611aec6123a0565b60200101906001600160f81b031916908160001a905350611b0e600a86612294565b9450611aae565b6000546001600160a01b038416611b3e57604051622e076360e81b815260040160405180910390fd5b82611b5c5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600490925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15611c85575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611c4e60008784806001019550876118fa565b611c6b576040516368d2bf6b60e11b815260040160405180910390fd5b808210611c03578260005414611c8057600080fd5b611cca565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210611c86575b506000908155610fd29085838684565b600081815b8451811015611d46576000858281518110611cfc57611cfc6123a0565b60200260200101519050808311611d225760008381526020829052604090209250611d33565b600081815260208490526040902092505b5080611d3e81612345565b915050611cdf565b509392505050565b828054611d5a9061230a565b90600052602060002090601f016020900481019282611d7c5760008555611dc2565b82601f10611d9557805160ff1916838001178555611dc2565b82800160010185558215611dc2579182015b82811115611dc2578251825591602001919060010190611da7565b50611dce929150611dd2565b5090565b5b80821115611dce5760008155600101611dd3565b600067ffffffffffffffff831115611e0157611e016123b6565b611e14601f8401601f191660200161224b565b9050828152838383011115611e2857600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114611e5657600080fd5b919050565b80358015158114611e5657600080fd5b600060208284031215611e7d57600080fd5b610fe782611e3f565b60008060408385031215611e9957600080fd5b611ea283611e3f565b9150611eb060208401611e3f565b90509250929050565b600080600060608486031215611ece57600080fd5b611ed784611e3f565b9250611ee560208501611e3f565b9150604084013590509250925092565b60008060008060808587031215611f0b57600080fd5b611f1485611e3f565b9350611f2260208601611e3f565b925060408501359150606085013567ffffffffffffffff811115611f4557600080fd5b8501601f81018713611f5657600080fd5b611f6587823560208401611de7565b91505092959194509250565b60008060408385031215611f8457600080fd5b611f8d83611e3f565b9150611eb060208401611e5b565b60008060408385031215611fae57600080fd5b611fb783611e3f565b946020939093013593505050565b60008060408385031215611fd857600080fd5b823567ffffffffffffffff80821115611ff057600080fd5b818501915085601f83011261200457600080fd5b8135602082821115612018576120186123b6565b8160051b925061202981840161224b565b8281528181019085830185870184018b101561204457600080fd5b600096505b84871015612067578035835260019690960195918301918301612049565b509997909101359750505050505050565b60006020828403121561208a57600080fd5b610fe782611e5b565b6000602082840312156120a557600080fd5b5035919050565b6000602082840312156120be57600080fd5b8135610fe7816123cc565b6000602082840312156120db57600080fd5b8151610fe7816123cc565b6000602082840312156120f857600080fd5b813567ffffffffffffffff81111561210f57600080fd5b8201601f8101841361212057600080fd5b6119ea84823560208401611de7565b600081518084526121478160208601602086016122de565b601f01601f19169290920160200192915050565b6000835161216d8184602088016122de565b8351908301906121818183602088016122de565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906121cd9083018461212f565b9695505050505050565b602081526000610fe7602083018461212f565b60208082526012908201527145786365656473206d617820737570706c7960701b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612274576122746123b6565b604052919050565b6000821982111561228f5761228f612374565b500190565b6000826122a3576122a361238a565b500490565b60008160001904831182151516156122c2576122c2612374565b500290565b6000828210156122d9576122d9612374565b500390565b60005b838110156122f95781810151838201526020016122e1565b83811115610fd25750506000910152565b600181811c9082168061231e57607f821691505b6020821081141561233f57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561235957612359612374565b5060010190565b60008261236f5761236f61238a565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610b6a57600080fdfea264697066735822122098f107994b43df4e25fea805246d2c3a576f0c13eec1348b566cadabb3d493b264736f6c63430008070033697066733a2f2f62616679626569676c3269716e726e776e686772336e6b7277356d6b6c686a6b716d65756f716861656461327035676e6a766f68727875766866692f756e72657665616c65642e6a736f6e

Deployed Bytecode

0x60806040526004361061025c5760003560e01c8063715018a611610144578063d5abeb01116100b6578063e8a3d4851161007a578063e8a3d485146106b4578063e985e9c5146106d5578063ebf0c7171461071e578063f2fde38b14610734578063f4a560a514610754578063fddcb5ea1461076957600080fd5b8063d5abeb011461063e578063d821048214610654578063dab5f34014610669578063e193e7e214610689578063e88d3b3e1461069f57600080fd5b8063a22cb46511610108578063a22cb4651461057e578063b0ea18021461059e578063b88d4fde146105be578063b8a20ed0146105de578063c48156af146105fe578063c87b56dd1461061e57600080fd5b8063715018a6146104f6578063806234441461050b57806386ffb1bb1461052b5780638da5cb5b1461054b57806395d89b411461056957600080fd5b80632db11544116101dd57806344a0d68a116101a157806344a0d68a146104405780634c261247146104605780635797cc01146104805780636352211e146104a05780636bde2627146104c057806370a08231146104d657600080fd5b80632db11544146103c85780633057931f146103db5780633ccfd60b146103f557806341cda2031461040a57806342842e0e1461042057600080fd5b80630a00ae83116102245780630a00ae83146103365780630de76de4146103565780630f2cdd6c1461037557806318160ddd1461038b57806323b872dd146103a857600080fd5b806301ffc9a71461026157806306fdde0314610296578063081812fc146102b857806308d692fb146102f0578063095ea7b314610314575b600080fd5b34801561026d57600080fd5b5061028161027c3660046120ac565b61079f565b60405190151581526020015b60405180910390f35b3480156102a257600080fd5b506102ab6107f1565b60405161028d91906121d7565b3480156102c457600080fd5b506102d86102d3366004612093565b610883565b6040516001600160a01b03909116815260200161028d565b3480156102fc57600080fd5b50610306600e5481565b60405190815260200161028d565b34801561032057600080fd5b5061033461032f366004611f9b565b6108c7565b005b34801561034257600080fd5b50610334610351366004612093565b61094e565b34801561036257600080fd5b5060105461028190610100900460ff1681565b34801561038157600080fd5b50610306600c5481565b34801561039757600080fd5b506001546000540360001901610306565b3480156103b457600080fd5b506103346103c3366004611eb9565b610986565b6103346103d6366004612093565b610991565b3480156103e757600080fd5b506010546102819060ff1681565b34801561040157600080fd5b50610334610b6d565b34801561041657600080fd5b50610306600d5481565b34801561042c57600080fd5b5061033461043b366004611eb9565b610c6f565b34801561044c57600080fd5b5061033461045b366004612093565b610c8a565b34801561046c57600080fd5b5061033461047b3660046120e6565b610cb9565b34801561048c57600080fd5b5061033461049b366004612093565b610d4a565b3480156104ac57600080fd5b506102d86104bb366004612093565b610d79565b3480156104cc57600080fd5b50610306600a5481565b3480156104e257600080fd5b506103066104f1366004611e6b565b610d8b565b34801561050257600080fd5b50610334610dda565b34801561051757600080fd5b50610334610526366004612093565b610e10565b34801561053757600080fd5b506103346105463660046120e6565b610e3f565b34801561055757600080fd5b506008546001600160a01b03166102d8565b34801561057557600080fd5b506102ab610e7c565b34801561058a57600080fd5b50610334610599366004611f71565b610e8b565b3480156105aa57600080fd5b506103346105b9366004611f9b565b610f21565b3480156105ca57600080fd5b506103346105d9366004611ef5565b610f8e565b3480156105ea57600080fd5b506102816105f9366004611fc5565b610fd8565b34801561060a57600080fd5b50610334610619366004612078565b610fee565b34801561062a57600080fd5b506102ab610639366004612093565b61102b565b34801561064a57600080fd5b50610306600f5481565b34801561066057600080fd5b506102ab611171565b34801561067557600080fd5b50610334610684366004612093565b6111ff565b34801561069557600080fd5b50610306600b5481565b3480156106ab57600080fd5b5061033461122e565b3480156106c057600080fd5b506040805160208101909152600081526102ab565b3480156106e157600080fd5b506102816106f0366004611e86565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561072a57600080fd5b5061030660095481565b34801561074057600080fd5b5061033461074f366004611e6b565b611413565b34801561076057600080fd5b506103346114ab565b34801561077557600080fd5b50610306610784366004611e6b565b6001600160a01b031660009081526013602052604090205490565b60006001600160e01b031982166380ac58cd60e01b14806107d057506001600160e01b03198216635b5e139f60e01b145b806107eb57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600280546108009061230a565b80601f016020809104026020016040519081016040528092919081815260200182805461082c9061230a565b80156108795780601f1061084e57610100808354040283529160200191610879565b820191906000526020600020905b81548152906001019060200180831161085c57829003601f168201915b5050505050905090565b600061088e826114e6565b6108ab576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006108d282610d79565b9050806001600160a01b0316836001600160a01b031614156109075760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161461093e5761092181336106f0565b61093e576040516367d9dca160e11b815260040160405180910390fd5b61094983838361151f565b505050565b6008546001600160a01b031633146109815760405162461bcd60e51b815260040161097890612216565b60405180910390fd5b600d55565b61094983838361157b565b60105460ff166109da5760405162461bcd60e51b8152602060048201526014602482015273135a5b9d081a185cc81b9bdd081cdd185c9d195960621b6044820152606401610978565b600b54811115610a365760405162461bcd60e51b815260206004820152602160248201527f45786365656473204e465420706572207472616e73616374696f6e206c696d696044820152601d60fa1b6064820152608401610978565b600f5481610a476000546000190190565b610a51919061227c565b1115610a6f5760405162461bcd60e51b8152600401610978906121ea565b600c5433600090815260136020526040902054610a8d90839061227c565b1115610ad45760405162461bcd60e51b8152602060048201526016602482015275115e18d959591cc81b585e081c195c881dd85b1b195d60521b6044820152606401610978565b600a54610ae190826122a8565b341015610b3b5760405162461bcd60e51b815260206004820152602260248201527f45746865722076616c75652073656e74206973206e6f742073756666696369656044820152611b9d60f21b6064820152608401610978565b3360009081526013602052604081208054839290610b5a90849061227c565b90915550610b6a9050338261176a565b50565b6008546001600160a01b03163314610b975760405162461bcd60e51b815260040161097890612216565b477352a3b74b0c0607be3bb1ca09dc3d2ae3081746e660006064610bbc8460196122a8565b610bc69190612294565b6040519091506001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610bff573d6000803e3d6000fd5b5073d2d9b8a80997c335ce8980a8da015036c3e7d33160006064610c2486604b6122a8565b610c2e9190612294565b6040519091506001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610c67573d6000803e3d6000fd5b505050505050565b61094983838360405180602001604052806000815250610f8e565b6008546001600160a01b03163314610cb45760405162461bcd60e51b815260040161097890612216565b600a55565b6008546001600160a01b03163314610ce35760405162461bcd60e51b815260040161097890612216565b601054610100900460ff1615610d335760405162461bcd60e51b815260206004820152601560248201527413595d1859185d18481a5cc8199a5b985b1a5e9959605a1b6044820152606401610978565b8051610d46906011906020840190611d4e565b5050565b6008546001600160a01b03163314610d745760405162461bcd60e51b815260040161097890612216565b600e55565b6000610d8482611784565b5192915050565b60006001600160a01b038216610db4576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03163314610e045760405162461bcd60e51b815260040161097890612216565b610e0e60006118a8565b565b6008546001600160a01b03163314610e3a5760405162461bcd60e51b815260040161097890612216565b600f55565b6008546001600160a01b03163314610e695760405162461bcd60e51b815260040161097890612216565b8051610d46906012906020840190611d4e565b6060600380546108009061230a565b6001600160a01b038216331415610eb55760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b03163314610f4b5760405162461bcd60e51b815260040161097890612216565b600f5481610f5c6000546000190190565b610f66919061227c565b1115610f845760405162461bcd60e51b8152600401610978906121ea565b610d46828261176a565b610f9984848461157b565b6001600160a01b0383163b15610fd257610fb5848484846118fa565b610fd2576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6000610fe783600954846119f2565b9392505050565b6008546001600160a01b031633146110185760405162461bcd60e51b815260040161097890612216565b6010805460ff1916911515919091179055565b6060611036826114e6565b61109a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610978565b60006110a4611a08565b511161113a57601280546110b79061230a565b80601f01602080910402602001604051908101604052809291908181526020018280546110e39061230a565b80156111305780601f1061110557610100808354040283529160200191611130565b820191906000526020600020905b81548152906001019060200180831161111357829003601f168201915b50505050506107eb565b611142611a08565b61114b83611a17565b60405160200161115c92919061215b565b60405160208183030381529060405292915050565b6012805461117e9061230a565b80601f01602080910402602001604051908101604052809291908181526020018280546111aa9061230a565b80156111f75780601f106111cc576101008083540402835291602001916111f7565b820191906000526020600020905b8154815290600101906020018083116111da57829003601f168201915b505050505081565b6008546001600160a01b031633146112295760405162461bcd60e51b815260040161097890612216565b600955565b336000908152601460205260409020546010546001919060ff1661128b5760405162461bcd60e51b8152602060048201526014602482015273135a5b9d081a185cc81b9bdd081cdd185c9d195960621b6044820152606401610978565b600e546001546000540360001901106112e65760405162461bcd60e51b815260206004820152601d60248201527f45786365656473206d6178206672656520636c61696d20737570706c790000006044820152606401610978565b600d5481106113465760405162461bcd60e51b815260206004820152602660248201527f596f75206861766520616c726561647920636c61696d656420796f757220667260448201526519594813919560d21b6064820152608401610978565b600f54826113576000546000190190565b611361919061227c565b111561137f5760405162461bcd60e51b8152600401610978906121ea565b600c543360009081526013602052604090205461139d90849061227c565b11156113e45760405162461bcd60e51b8152602060048201526016602482015275115e18d959591cc81b585e081c195c881dd85b1b195d60521b6044820152606401610978565b336000908152601460205260408120805484929061140390849061227c565b90915550610d469050338361176a565b6008546001600160a01b0316331461143d5760405162461bcd60e51b815260040161097890612216565b6001600160a01b0381166114a25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610978565b610b6a816118a8565b6008546001600160a01b031633146114d55760405162461bcd60e51b815260040161097890612216565b6010805461ff001916610100179055565b6000816001111580156114fa575060005482105b80156107eb575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061158682611784565b9050836001600160a01b031681600001516001600160a01b0316146115bd5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b03861614806115db57506115db85336106f0565b806115f65750336115eb84610883565b6001600160a01b0316145b90508061161657604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661163d57604051633a954ecd60e21b815260040160405180910390fd5b6116496000848761151f565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661171f57600054821461171f578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b610d46828260405180602001604052806000815250611b15565b6040805160608101825260008082526020820181905291810191909152818060011161188f5760005481101561188f57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff1615159181018290529061188d5780516001600160a01b031615611823579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215611888579392505050565b611823565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061192f90339089908890889060040161219a565b602060405180830381600087803b15801561194957600080fd5b505af1925050508015611979575060408051601f3d908101601f19168201909252611976918101906120c9565b60015b6119d4573d8080156119a7576040519150601f19603f3d011682016040523d82523d6000602084013e6119ac565b606091505b5080516119cc576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6000826119ff8584611cda565b14949350505050565b6060601180546108009061230a565b606081611a3b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611a655780611a4f81612345565b9150611a5e9050600a83612294565b9150611a3f565b60008167ffffffffffffffff811115611a8057611a806123b6565b6040519080825280601f01601f191660200182016040528015611aaa576020820181803683370190505b5090505b84156119ea57611abf6001836122c7565b9150611acc600a86612360565b611ad790603061227c565b60f81b818381518110611aec57611aec6123a0565b60200101906001600160f81b031916908160001a905350611b0e600a86612294565b9450611aae565b6000546001600160a01b038416611b3e57604051622e076360e81b815260040160405180910390fd5b82611b5c5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600490925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15611c85575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611c4e60008784806001019550876118fa565b611c6b576040516368d2bf6b60e11b815260040160405180910390fd5b808210611c03578260005414611c8057600080fd5b611cca565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210611c86575b506000908155610fd29085838684565b600081815b8451811015611d46576000858281518110611cfc57611cfc6123a0565b60200260200101519050808311611d225760008381526020829052604090209250611d33565b600081815260208490526040902092505b5080611d3e81612345565b915050611cdf565b509392505050565b828054611d5a9061230a565b90600052602060002090601f016020900481019282611d7c5760008555611dc2565b82601f10611d9557805160ff1916838001178555611dc2565b82800160010185558215611dc2579182015b82811115611dc2578251825591602001919060010190611da7565b50611dce929150611dd2565b5090565b5b80821115611dce5760008155600101611dd3565b600067ffffffffffffffff831115611e0157611e016123b6565b611e14601f8401601f191660200161224b565b9050828152838383011115611e2857600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114611e5657600080fd5b919050565b80358015158114611e5657600080fd5b600060208284031215611e7d57600080fd5b610fe782611e3f565b60008060408385031215611e9957600080fd5b611ea283611e3f565b9150611eb060208401611e3f565b90509250929050565b600080600060608486031215611ece57600080fd5b611ed784611e3f565b9250611ee560208501611e3f565b9150604084013590509250925092565b60008060008060808587031215611f0b57600080fd5b611f1485611e3f565b9350611f2260208601611e3f565b925060408501359150606085013567ffffffffffffffff811115611f4557600080fd5b8501601f81018713611f5657600080fd5b611f6587823560208401611de7565b91505092959194509250565b60008060408385031215611f8457600080fd5b611f8d83611e3f565b9150611eb060208401611e5b565b60008060408385031215611fae57600080fd5b611fb783611e3f565b946020939093013593505050565b60008060408385031215611fd857600080fd5b823567ffffffffffffffff80821115611ff057600080fd5b818501915085601f83011261200457600080fd5b8135602082821115612018576120186123b6565b8160051b925061202981840161224b565b8281528181019085830185870184018b101561204457600080fd5b600096505b84871015612067578035835260019690960195918301918301612049565b509997909101359750505050505050565b60006020828403121561208a57600080fd5b610fe782611e5b565b6000602082840312156120a557600080fd5b5035919050565b6000602082840312156120be57600080fd5b8135610fe7816123cc565b6000602082840312156120db57600080fd5b8151610fe7816123cc565b6000602082840312156120f857600080fd5b813567ffffffffffffffff81111561210f57600080fd5b8201601f8101841361212057600080fd5b6119ea84823560208401611de7565b600081518084526121478160208601602086016122de565b601f01601f19169290920160200192915050565b6000835161216d8184602088016122de565b8351908301906121818183602088016122de565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906121cd9083018461212f565b9695505050505050565b602081526000610fe7602083018461212f565b60208082526012908201527145786365656473206d617820737570706c7960701b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612274576122746123b6565b604052919050565b6000821982111561228f5761228f612374565b500190565b6000826122a3576122a361238a565b500490565b60008160001904831182151516156122c2576122c2612374565b500290565b6000828210156122d9576122d9612374565b500390565b60005b838110156122f95781810151838201526020016122e1565b83811115610fd25750506000910152565b600181811c9082168061231e57607f821691505b6020821081141561233f57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561235957612359612374565b5060010190565b60008261236f5761236f61238a565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610b6a57600080fdfea264697066735822122098f107994b43df4e25fea805246d2c3a576f0c13eec1348b566cadabb3d493b264736f6c63430008070033

Deployed Bytecode Sourcemap

49708:4787:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28333:305;;;;;;;;;;-1:-1:-1;28333:305:0;;;;;:::i;:::-;;:::i;:::-;;;7062:14:1;;7055:22;7037:41;;7025:2;7010:18;28333:305:0;;;;;;;;31448:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;32952:204::-;;;;;;;;;;-1:-1:-1;32952:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6360:32:1;;;6342:51;;6330:2;6315:18;32952:204:0;6196:203:1;49974:35:0;;;;;;;;;;;;;;;;;;;7235:25:1;;;7223:2;7208:18;49974:35:0;7089:177:1;32514:372:0;;;;;;;;;;-1:-1:-1;32514:372:0;;;;;:::i;:::-;;:::i;:::-;;52416:101;;;;;;;;;;-1:-1:-1;52416:101:0;;;;;:::i;:::-;;:::i;50086:27::-;;;;;;;;;;-1:-1:-1;50086:27:0;;;;;;;;;;;49902:32;;;;;;;;;;;;;;;;27573:312;;;;;;;;;;-1:-1:-1;50622:1:0;27836:12;27626:7;27820:13;:28;-1:-1:-1;;27820:46:0;27573:312;;33817:170;;;;;;;;;;-1:-1:-1;33817:170:0;;;;;:::i;:::-;;:::i;53131:534::-;;;;;;:::i;:::-;;:::i;50047:32::-;;;;;;;;;;-1:-1:-1;50047:32:0;;;;;;;;51375:493;;;;;;;;;;;;;:::i;49941:29::-;;;;;;;;;;;;;;;;34058:185;;;;;;;;;;-1:-1:-1;34058:185:0;;;;;:::i;:::-;;:::i;52222:87::-;;;;;;;;;;-1:-1:-1;52222:87:0;;;;;:::i;:::-;;:::i;50812:139::-;;;;;;;;;;-1:-1:-1;50812:139:0;;;;;:::i;:::-;;:::i;52525:98::-;;;;;;;;;;-1:-1:-1;52525:98:0;;;;;:::i;:::-;;:::i;31256:125::-;;;;;;;;;;-1:-1:-1;31256:125:0;;;;;:::i;:::-;;:::i;49816:43::-;;;;;;;;;;;;;;;;28702:206;;;;;;;;;;-1:-1:-1;28702:206:0;;;;;:::i;:::-;;:::i;48860:103::-;;;;;;;;;;;;;:::i;52314:94::-;;;;;;;;;;-1:-1:-1;52314:94:0;;;;;:::i;:::-;;:::i;50959:88::-;;;;;;;;;;-1:-1:-1;50959:88:0;;;;;:::i;:::-;;:::i;48209:87::-;;;;;;;;;;-1:-1:-1;48282:6:0;;-1:-1:-1;;;;;48282:6:0;48209:87;;31617:104;;;;;;;;;;;;;:::i;33228:287::-;;;;;;;;;;-1:-1:-1;33228:287:0;;;;;:::i;:::-;;:::i;52036:178::-;;;;;;;;;;-1:-1:-1;52036:178:0;;;;;:::i;:::-;;:::i;34314:370::-;;;;;;;;;;-1:-1:-1;34314:370:0;;;;;:::i;:::-;;:::i;52974:145::-;;;;;;;;;;-1:-1:-1;52974:145:0;;;;;:::i;:::-;;:::i;51257:85::-;;;;;;;;;;-1:-1:-1;51257:85:0;;;;;:::i;:::-;;:::i;52628:341::-;;;;;;;;;;-1:-1:-1;52628:341:0;;;;;:::i;:::-;;:::i;50013:28::-;;;;;;;;;;;;;;;;50147:113;;;;;;;;;;;;;:::i;51179:73::-;;;;;;;;;;-1:-1:-1;51179:73:0;;;;;:::i;:::-;;:::i;49863:32::-;;;;;;;;;;;;;;;;53673:819;;;;;;;;;;;;;:::i;50633:78::-;;;;;;;;;;-1:-1:-1;50697:9:0;;;;;;;;;-1:-1:-1;50697:9:0;;50633:78;;33586:164;;;;;;;;;;-1:-1:-1;33586:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;33707:25:0;;;33683:4;33707:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;33586:164;49765:19;;;;;;;;;;;;;;;;49118:201;;;;;;;;;;-1:-1:-1;49118:201:0;;;;;:::i;:::-;;:::i;50719:88::-;;;;;;;;;;;;;:::i;51055:116::-;;;;;;;;;;-1:-1:-1;51055:116:0;;;;;:::i;:::-;-1:-1:-1;;;;;51138:25:0;51114:4;51138:25;;;:18;:25;;;;;;;51055:116;28333:305;28435:4;-1:-1:-1;;;;;;28472:40:0;;-1:-1:-1;;;28472:40:0;;:105;;-1:-1:-1;;;;;;;28529:48:0;;-1:-1:-1;;;28529:48:0;28472:105;:158;;;-1:-1:-1;;;;;;;;;;15890:40:0;;;28594:36;28452:178;28333:305;-1:-1:-1;;28333:305:0:o;31448:100::-;31502:13;31535:5;31528:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31448:100;:::o;32952:204::-;33020:7;33045:16;33053:7;33045;:16::i;:::-;33040:64;;33070:34;;-1:-1:-1;;;33070:34:0;;;;;;;;;;;33040:64;-1:-1:-1;33124:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;33124:24:0;;32952:204::o;32514:372::-;32587:13;32603:24;32619:7;32603:15;:24::i;:::-;32587:40;;32648:5;-1:-1:-1;;;;;32642:11:0;:2;-1:-1:-1;;;;;32642:11:0;;32638:48;;;32662:24;;-1:-1:-1;;;32662:24:0;;;;;;;;;;;32638:48;25350:10;-1:-1:-1;;;;;32703:21:0;;;32699:139;;32730:37;32747:5;25350:10;33586:164;:::i;32730:37::-;32726:112;;32791:35;;-1:-1:-1;;;32791:35:0;;;;;;;;;;;32726:112;32850:28;32859:2;32863:7;32872:5;32850:8;:28::i;:::-;32576:310;32514:372;;:::o;52416:101::-;48282:6;;-1:-1:-1;;;;;48282:6:0;25350:10;48429:23;48421:68;;;;-1:-1:-1;;;48421:68:0;;;;;;;:::i;:::-;;;;;;;;;52484:13:::1;:28:::0;52416:101::o;33817:170::-;33951:28;33961:4;33967:2;33971:7;33951:9;:28::i;53131:534::-;53193:12;;;;53185:45;;;;-1:-1:-1;;;53185:45:0;;9263:2:1;53185:45:0;;;9245:21:1;9302:2;9282:18;;;9275:30;-1:-1:-1;;;9321:18:1;;;9314:50;9381:18;;53185:45:0;9061:344:1;53185:45:0;53252:16;;53243:5;:25;;53235:70;;;;-1:-1:-1;;;53235:70:0;;8861:2:1;53235:70:0;;;8843:21:1;8900:2;8880:18;;;8873:30;8939:34;8919:18;;;8912:62;-1:-1:-1;;;8990:18:1;;;8983:31;9031:19;;53235:70:0;8659:397:1;53235:70:0;53344:9;;53335:5;53318:14;28025:7;28211:13;-1:-1:-1;;28211:31:0;;27978:283;53318:14;:22;;;;:::i;:::-;:35;;53310:65;;;;-1:-1:-1;;;53310:65:0;;;;;;;:::i;:::-;53436:14;;53413:10;53394:30;;;;:18;:30;;;;;;:38;;53427:5;;53394:38;:::i;:::-;:56;;53386:90;;;;-1:-1:-1;;;53386:90:0;;11497:2:1;53386:90:0;;;11479:21:1;11536:2;11516:18;;;11509:30;-1:-1:-1;;;11555:18:1;;;11548:52;11617:18;;53386:90:0;11295:346:1;53386:90:0;53517:17;;53509:25;;:5;:25;:::i;:::-;53496:9;:38;;53483:98;;;;-1:-1:-1;;;53483:98:0;;9959:2:1;53483:98:0;;;9941:21:1;9998:2;9978:18;;;9971:30;10037:34;10017:18;;;10010:62;-1:-1:-1;;;10088:18:1;;;10081:32;10130:19;;53483:98:0;9757:398:1;53483:98:0;53607:10;53588:30;;;;:18;:30;;;;;:39;;53622:5;;53588:30;:39;;53622:5;;53588:39;:::i;:::-;;;;-1:-1:-1;53632:28:0;;-1:-1:-1;53642:10:0;53654:5;53632:9;:28::i;:::-;53131:534;:::o;51375:493::-;48282:6;;-1:-1:-1;;;;;48282:6:0;25350:10;48429:23;48421:68;;;;-1:-1:-1;;;48421:68:0;;;;;;;:::i;:::-;51441:21:::1;51516:42;51423:15;51601:3;51586:12;51441:21:::0;51596:2:::1;51586:12;:::i;:::-;:18;;;;:::i;:::-;51622:37;::::0;51569:35;;-1:-1:-1;;;;;;51622:26:0;::::1;::::0;:37;::::1;;;::::0;51569:35;;51622:37:::1;::::0;;;51569:35;51622:26;:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;51717:42:0::1;51698:16;51802:3;51787:12;:7:::0;51797:2:::1;51787:12;:::i;:::-;:18;;;;:::i;:::-;51823:37;::::0;51770:35;;-1:-1:-1;;;;;;51823:26:0;::::1;::::0;:37;::::1;;;::::0;51770:35;;51823:37:::1;::::0;;;51770:35;51823:26;:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;51412:456;;;;;51375:493::o:0;34058:185::-;34196:39;34213:4;34219:2;34223:7;34196:39;;;;;;;;;;;;:16;:39::i;52222:87::-;48282:6;;-1:-1:-1;;;;;48282:6:0;25350:10;48429:23;48421:68;;;;-1:-1:-1;;;48421:68:0;;;;;;;:::i;:::-;52277:17:::1;:27:::0;52222:87::o;50812:139::-;48282:6;;-1:-1:-1;;;;;48282:6:0;25350:10;48429:23;48421:68;;;;-1:-1:-1;;;48421:68:0;;;;;;;:::i;:::-;50886:15:::1;::::0;::::1;::::0;::::1;;;50885:16;50877:50;;;::::0;-1:-1:-1;;;50877:50:0;;7697:2:1;50877:50:0::1;::::0;::::1;7679:21:1::0;7736:2;7716:18;;;7709:30;-1:-1:-1;;;7755:18:1;;;7748:51;7816:18;;50877:50:0::1;7495:345:1::0;50877:50:0::1;50932:14:::0;;::::1;::::0;:8:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;:::-;;50812:139:::0;:::o;52525:98::-;48282:6;;-1:-1:-1;;;;;48282:6:0;25350:10;48429:23;48421:68;;;;-1:-1:-1;;;48421:68:0;;;;;;;:::i;:::-;52591:16:::1;:27:::0;52525:98::o;31256:125::-;31320:7;31347:21;31360:7;31347:12;:21::i;:::-;:26;;31256:125;-1:-1:-1;;31256:125:0:o;28702:206::-;28766:7;-1:-1:-1;;;;;28790:19:0;;28786:60;;28818:28;;-1:-1:-1;;;28818:28:0;;;;;;;;;;;28786:60;-1:-1:-1;;;;;;28872:19:0;;;;;:12;:19;;;;;:27;;;;28702:206::o;48860:103::-;48282:6;;-1:-1:-1;;;;;48282:6:0;25350:10;48429:23;48421:68;;;;-1:-1:-1;;;48421:68:0;;;;;;;:::i;:::-;48925:30:::1;48952:1;48925:18;:30::i;:::-;48860:103::o:0;52314:94::-;48282:6;;-1:-1:-1;;;;;48282:6:0;25350:10;48429:23;48421:68;;;;-1:-1:-1;;;48421:68:0;;;;;;;:::i;:::-;52379:9:::1;:24:::0;52314:94::o;50959:88::-;48282:6;;-1:-1:-1;;;;;48282:6:0;25350:10;48429:23;48421:68;;;;-1:-1:-1;;;48421:68:0;;;;;;;:::i;:::-;51024:18;;::::1;::::0;:12:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;31617:104::-:0;31673:13;31706:7;31699:14;;;;;:::i;33228:287::-;-1:-1:-1;;;;;33327:24:0;;25350:10;33327:24;33323:54;;;33360:17;;-1:-1:-1;;;33360:17:0;;;;;;;;;;;33323:54;25350:10;33390:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;33390:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;33390:53:0;;;;;;;;;;33459:48;;7037:41:1;;;33390:42:0;;25350:10;33459:48;;7010:18:1;33459:48:0;;;;;;;33228:287;;:::o;52036:178::-;48282:6;;-1:-1:-1;;;;;48282:6:0;25350:10;48429:23;48421:68;;;;-1:-1:-1;;;48421:68:0;;;;;;;:::i;:::-;52144:9:::1;;52135:5;52118:14;28025:7:::0;28211:13;-1:-1:-1;;28211:31:0;;27978:283;52118:14:::1;:22;;;;:::i;:::-;:35;;52105:79;;;;-1:-1:-1::0;;;52105:79:0::1;;;;;;;:::i;:::-;52189:20;52199:2;52203:5;52189:9;:20::i;34314:370::-:0;34481:28;34491:4;34497:2;34501:7;34481:9;:28::i;:::-;-1:-1:-1;;;;;34524:13:0;;5970:19;:23;34520:157;;34545:56;34576:4;34582:2;34586:7;34595:5;34545:30;:56::i;:::-;34541:136;;34625:40;;-1:-1:-1;;;34625:40:0;;;;;;;;;;;34541:136;34314:370;;;;:::o;52974:145::-;53050:4;53074:37;53093:5;53100:4;;53106;53074:18;:37::i;:::-;53067:44;52974:145;-1:-1:-1;;;52974:145:0:o;51257:85::-;48282:6;;-1:-1:-1;;;;;48282:6:0;25350:10;48429:23;48421:68;;;;-1:-1:-1;;;48421:68:0;;;;;;;:::i;:::-;51317:12:::1;:20:::0;;-1:-1:-1;;51317:20:0::1;::::0;::::1;;::::0;;;::::1;::::0;;51257:85::o;52628:341::-;52702:13;52738:16;52746:7;52738;:16::i;:::-;52730:76;;;;-1:-1:-1;;;52730:76:0;;11081:2:1;52730:76:0;;;11063:21:1;11120:2;11100:18;;;11093:30;11159:34;11139:18;;;11132:62;-1:-1:-1;;;11210:18:1;;;11203:45;11265:19;;52730:76:0;10879:411:1;52730:76:0;52853:1;52832:10;:8;:10::i;:::-;52826:24;:28;:138;;52952:12;52826:138;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52895:10;:8;:10::i;:::-;52907:18;:7;:16;:18::i;:::-;52878:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52819:145;52628:341;-1:-1:-1;;52628:341:0:o;50147:113::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51179:73::-;48282:6;;-1:-1:-1;;;;;48282:6:0;25350:10;48429:23;48421:68;;;;-1:-1:-1;;;48421:68:0;;;;;;;:::i;:::-;51235:4:::1;:12:::0;51179:73::o;53673:819::-;53772:10;53713;53755:28;;;:16;:28;;;;;;54042:12;;53726:1;;53755:28;54042:12;;54034:45;;;;-1:-1:-1;;;54034:45:0;;9263:2:1;54034:45:0;;;9245:21:1;9302:2;9282:18;;;9275:30;-1:-1:-1;;;9321:18:1;;;9314:50;9381:18;;54034:45:0;9061:344:1;54034:45:0;54108:16;;50622:1;27836:12;27626:7;27820:13;:28;-1:-1:-1;;27820:46:0;54092:32;54084:74;;;;-1:-1:-1;;;54084:74:0;;10723:2:1;54084:74:0;;;10705:21:1;10762:2;10742:18;;;10735:30;10801:31;10781:18;;;10774:59;10850:18;;54084:74:0;10521:353:1;54084:74:0;54183:13;;54171:9;:25;54163:76;;;;-1:-1:-1;;;54163:76:0;;8454:2:1;54163:76:0;;;8436:21:1;8493:2;8473:18;;;8466:30;8532:34;8512:18;;;8505:62;-1:-1:-1;;;8583:18:1;;;8576:36;8629:19;;54163:76:0;8252:402:1;54163:76:0;54278:9;;54269:5;54252:14;28025:7;28211:13;-1:-1:-1;;28211:31:0;;27978:283;54252:14;:22;;;;:::i;:::-;:35;;54244:65;;;;-1:-1:-1;;;54244:65:0;;;;;;;:::i;:::-;54370:14;;54347:10;54328:30;;;;:18;:30;;;;;;:38;;54361:5;;54328:38;:::i;:::-;:56;;54320:90;;;;-1:-1:-1;;;54320:90:0;;11497:2:1;54320:90:0;;;11479:21:1;11536:2;11516:18;;;11509:30;-1:-1:-1;;;11555:18:1;;;11548:52;11617:18;;54320:90:0;11295:346:1;54320:90:0;54434:10;54417:28;;;;:16;:28;;;;;:37;;54449:5;;54417:28;:37;;54449:5;;54417:37;:::i;:::-;;;;-1:-1:-1;54459:28:0;;-1:-1:-1;54469:10:0;54481:5;54459:9;:28::i;49118:201::-;48282:6;;-1:-1:-1;;;;;48282:6:0;25350:10;48429:23;48421:68;;;;-1:-1:-1;;;48421:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49207:22:0;::::1;49199:73;;;::::0;-1:-1:-1;;;49199:73:0;;8047:2:1;49199:73:0::1;::::0;::::1;8029:21:1::0;8086:2;8066:18;;;8059:30;8125:34;8105:18;;;8098:62;-1:-1:-1;;;8176:18:1;;;8169:36;8222:19;;49199:73:0::1;7845:402:1::0;49199:73:0::1;49283:28;49302:8;49283:18;:28::i;50719:88::-:0;48282:6;;-1:-1:-1;;;;;48282:6:0;25350:10;48429:23;48421:68;;;;-1:-1:-1;;;48421:68:0;;;;;;;:::i;:::-;50777:15:::1;:22:::0;;-1:-1:-1;;50777:22:0::1;;;::::0;;50719:88::o;34939:174::-;34996:4;35039:7;50622:1;35020:26;;:53;;;;;35060:13;;35050:7;:23;35020:53;:85;;;;-1:-1:-1;;35078:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;35078:27:0;;;;35077:28;;34939:174::o;44161:196::-;44276:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;44276:29:0;-1:-1:-1;;;;;44276:29:0;;;;;;;;;44321:28;;44276:24;;44321:28;;;;;;;44161:196;;;:::o;39109:2130::-;39224:35;39262:21;39275:7;39262:12;:21::i;:::-;39224:59;;39322:4;-1:-1:-1;;;;;39300:26:0;:13;:18;;;-1:-1:-1;;;;;39300:26:0;;39296:67;;39335:28;;-1:-1:-1;;;39335:28:0;;;;;;;;;;;39296:67;39376:22;25350:10;-1:-1:-1;;;;;39402:20:0;;;;:73;;-1:-1:-1;39439:36:0;39456:4;25350:10;33586:164;:::i;39439:36::-;39402:126;;;-1:-1:-1;25350:10:0;39492:20;39504:7;39492:11;:20::i;:::-;-1:-1:-1;;;;;39492:36:0;;39402:126;39376:153;;39547:17;39542:66;;39573:35;;-1:-1:-1;;;39573:35:0;;;;;;;;;;;39542:66;-1:-1:-1;;;;;39623:16:0;;39619:52;;39648:23;;-1:-1:-1;;;39648:23:0;;;;;;;;;;;39619:52;39792:35;39809:1;39813:7;39822:4;39792:8;:35::i;:::-;-1:-1:-1;;;;;40123:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;40123:31:0;;;;;;;-1:-1:-1;;40123:31:0;;;;;;;40169:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;40169:29:0;;;;;;;;;;;40249:20;;;:11;:20;;;;;;40284:18;;-1:-1:-1;;;;;;40317:49:0;;;;-1:-1:-1;;;40350:15:0;40317:49;;;;;;;;;;40640:11;;40700:24;;;;;40743:13;;40249:20;;40700:24;;40743:13;40739:384;;40953:13;;40938:11;:28;40934:174;;40991:20;;41060:28;;;;41034:54;;-1:-1:-1;;;41034:54:0;-1:-1:-1;;;;;;41034:54:0;;;-1:-1:-1;;;;;40991:20:0;;41034:54;;;;40934:174;40098:1036;;;41170:7;41166:2;-1:-1:-1;;;;;41151:27:0;41160:4;-1:-1:-1;;;;;41151:27:0;;;;;;;;;;;39213:2026;;39109:2130;;;:::o;35197:104::-;35266:27;35276:2;35280:8;35266:27;;;;;;;;;;;;:9;:27::i;30083:1111::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;30194:7:0;;50622:1;30243:23;30239:888;;30279:13;;30272:4;:20;30268:859;;;30313:31;30347:17;;;:11;:17;;;;;;;;;30313:51;;;;;;;;;-1:-1:-1;;;;;30313:51:0;;;;-1:-1:-1;;;30313:51:0;;;;;;;;;;;-1:-1:-1;;;30313:51:0;;;;;;;;;;;;;;30383:729;;30433:14;;-1:-1:-1;;;;;30433:28:0;;30429:101;;30497:9;30083:1111;-1:-1:-1;;;30083:1111:0:o;30429:101::-;-1:-1:-1;;;30872:6:0;30917:17;;;;:11;:17;;;;;;;;;30905:29;;;;;;;;;-1:-1:-1;;;;;30905:29:0;;;;;-1:-1:-1;;;30905:29:0;;;;;;;;;;;-1:-1:-1;;;30905:29:0;;;;;;;;;;;;;30965:28;30961:109;;31033:9;30083:1111;-1:-1:-1;;;30083:1111:0:o;30961:109::-;30832:261;;;30294:833;30268:859;31155:31;;-1:-1:-1;;;31155:31:0;;;;;;;;;;;49479:191;49572:6;;;-1:-1:-1;;;;;49589:17:0;;;-1:-1:-1;;;;;;49589:17:0;;;;;;;49622:40;;49572:6;;;49589:17;49572:6;;49622:40;;49553:16;;49622:40;49542:128;49479:191;:::o;44849:667::-;45033:72;;-1:-1:-1;;;45033:72:0;;45012:4;;-1:-1:-1;;;;;45033:36:0;;;;;:72;;25350:10;;45084:4;;45090:7;;45099:5;;45033:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45033:72:0;;;;;;;;-1:-1:-1;;45033:72:0;;;;;;;;;;;;:::i;:::-;;;45029:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45267:13:0;;45263:235;;45313:40;;-1:-1:-1;;;45313:40:0;;;;;;;;;;;45263:235;45456:6;45450:13;45441:6;45437:2;45433:15;45426:38;45029:480;-1:-1:-1;;;;;;45152:55:0;-1:-1:-1;;;45152:55:0;;-1:-1:-1;45029:480:0;44849:667;;;;;;:::o;850:190::-;975:4;1028;999:25;1012:5;1019:4;999:12;:25::i;:::-;:33;;850:190;-1:-1:-1;;;;850:190:0:o;50450:92::-;50502:13;50529:8;50522:15;;;;;:::i;2683:723::-;2739:13;2960:10;2956:53;;-1:-1:-1;;2987:10:0;;;;;;;;;;;;-1:-1:-1;;;2987:10:0;;;;;2683:723::o;2956:53::-;3034:5;3019:12;3075:78;3082:9;;3075:78;;3108:8;;;;:::i;:::-;;-1:-1:-1;3131:10:0;;-1:-1:-1;3139:2:0;3131:10;;:::i;:::-;;;3075:78;;;3163:19;3195:6;3185:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3185:17:0;;3163:39;;3213:154;3220:10;;3213:154;;3247:11;3257:1;3247:11;;:::i;:::-;;-1:-1:-1;3316:10:0;3324:2;3316:5;:10;:::i;:::-;3303:24;;:2;:24;:::i;:::-;3290:39;;3273:6;3280;3273:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;3273:56:0;;;;;;;;-1:-1:-1;3344:11:0;3353:2;3344:11;;:::i;:::-;;;3213:154;;35674:1749;35797:20;35820:13;-1:-1:-1;;;;;35848:16:0;;35844:48;;35873:19;;-1:-1:-1;;;35873:19:0;;;;;;;;;;;35844:48;35907:13;35903:44;;35929:18;;-1:-1:-1;;;35929:18:0;;;;;;;;;;;35903:44;-1:-1:-1;;;;;36298:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;36357:49:0;;36298:44;;;;;;;;36357:49;;;;-1:-1:-1;;36298:44:0;;;;;;36357:49;;;;;;;;;;;;;;;;36423:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;36473:66:0;;;-1:-1:-1;;;36523:15:0;36473:66;;;;;;;;;;;;;36423:25;;36620:23;;;;5970:19;:23;36660:631;;36700:313;36731:38;;36756:12;;-1:-1:-1;;;;;36731:38:0;;;36748:1;;36731:38;;36748:1;;36731:38;36797:69;36836:1;36840:2;36844:14;;;;;;36860:5;36797:30;:69::i;:::-;36792:174;;36902:40;;-1:-1:-1;;;36902:40:0;;;;;;;;;;;36792:174;37008:3;36993:12;:18;36700:313;;37094:12;37077:13;;:29;37073:43;;37108:8;;;37073:43;36660:631;;;37157:119;37188:40;;37213:14;;;;;-1:-1:-1;;;;;37188:40:0;;;37205:1;;37188:40;;37205:1;;37188:40;37271:3;37256:12;:18;37157:119;;36660:631;-1:-1:-1;37305:13:0;:28;;;37355:60;;37388:2;37392:12;37406:8;37355:60;:::i;1402:675::-;1485:7;1528:4;1485:7;1543:497;1567:5;:12;1563:1;:16;1543:497;;;1601:20;1624:5;1630:1;1624:8;;;;;;;;:::i;:::-;;;;;;;1601:31;;1667:12;1651;:28;1647:382;;2153:13;2203:15;;;2239:4;2232:15;;;2286:4;2270:21;;1779:57;;1647:382;;;2153:13;2203:15;;;2239:4;2232:15;;;2286:4;2270:21;;1956:57;;1647:382;-1:-1:-1;1581:3:0;;;;:::i;:::-;;;;1543:497;;;-1:-1:-1;2057:12:0;1402:675;-1:-1:-1;;;1402:675:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:160::-;668:20;;724:13;;717:21;707:32;;697:60;;753:1;750;743:12;768:186;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;919:29;938:9;919:29;:::i;959:260::-;1027:6;1035;1088:2;1076:9;1067:7;1063:23;1059:32;1056:52;;;1104:1;1101;1094:12;1056:52;1127:29;1146:9;1127:29;:::i;:::-;1117:39;;1175:38;1209:2;1198:9;1194:18;1175:38;:::i;:::-;1165:48;;959:260;;;;;:::o;1224:328::-;1301:6;1309;1317;1370:2;1358:9;1349:7;1345:23;1341:32;1338:52;;;1386:1;1383;1376:12;1338:52;1409:29;1428:9;1409:29;:::i;:::-;1399:39;;1457:38;1491:2;1480:9;1476:18;1457:38;:::i;:::-;1447:48;;1542:2;1531:9;1527:18;1514:32;1504:42;;1224:328;;;;;:::o;1557:666::-;1652:6;1660;1668;1676;1729:3;1717:9;1708:7;1704:23;1700:33;1697:53;;;1746:1;1743;1736:12;1697:53;1769:29;1788:9;1769:29;:::i;:::-;1759:39;;1817:38;1851:2;1840:9;1836:18;1817:38;:::i;:::-;1807:48;;1902:2;1891:9;1887:18;1874:32;1864:42;;1957:2;1946:9;1942:18;1929:32;1984:18;1976:6;1973:30;1970:50;;;2016:1;2013;2006:12;1970:50;2039:22;;2092:4;2084:13;;2080:27;-1:-1:-1;2070:55:1;;2121:1;2118;2111:12;2070:55;2144:73;2209:7;2204:2;2191:16;2186:2;2182;2178:11;2144:73;:::i;:::-;2134:83;;;1557:666;;;;;;;:::o;2228:254::-;2293:6;2301;2354:2;2342:9;2333:7;2329:23;2325:32;2322:52;;;2370:1;2367;2360:12;2322:52;2393:29;2412:9;2393:29;:::i;:::-;2383:39;;2441:35;2472:2;2461:9;2457:18;2441:35;:::i;2487:254::-;2555:6;2563;2616:2;2604:9;2595:7;2591:23;2587:32;2584:52;;;2632:1;2629;2622:12;2584:52;2655:29;2674:9;2655:29;:::i;:::-;2645:39;2731:2;2716:18;;;;2703:32;;-1:-1:-1;;;2487:254:1:o;2746:1027::-;2839:6;2847;2900:2;2888:9;2879:7;2875:23;2871:32;2868:52;;;2916:1;2913;2906:12;2868:52;2956:9;2943:23;2985:18;3026:2;3018:6;3015:14;3012:34;;;3042:1;3039;3032:12;3012:34;3080:6;3069:9;3065:22;3055:32;;3125:7;3118:4;3114:2;3110:13;3106:27;3096:55;;3147:1;3144;3137:12;3096:55;3183:2;3170:16;3205:4;3228:2;3224;3221:10;3218:36;;;3234:18;;:::i;:::-;3280:2;3277:1;3273:10;3263:20;;3303:28;3327:2;3323;3319:11;3303:28;:::i;:::-;3365:15;;;3396:12;;;;3428:11;;;3458;;;3454:20;;3451:33;-1:-1:-1;3448:53:1;;;3497:1;3494;3487:12;3448:53;3519:1;3510:10;;3529:163;3543:2;3540:1;3537:9;3529:163;;;3600:17;;3588:30;;3561:1;3554:9;;;;;3638:12;;;;3670;;3529:163;;;-1:-1:-1;3711:5:1;3748:18;;;;3735:32;;-1:-1:-1;;;;;;;2746:1027:1:o;3778:180::-;3834:6;3887:2;3875:9;3866:7;3862:23;3858:32;3855:52;;;3903:1;3900;3893:12;3855:52;3926:26;3942:9;3926:26;:::i;3963:180::-;4022:6;4075:2;4063:9;4054:7;4050:23;4046:32;4043:52;;;4091:1;4088;4081:12;4043:52;-1:-1:-1;4114:23:1;;3963:180;-1:-1:-1;3963:180:1:o;4148:245::-;4206:6;4259:2;4247:9;4238:7;4234:23;4230:32;4227:52;;;4275:1;4272;4265:12;4227:52;4314:9;4301:23;4333:30;4357:5;4333:30;:::i;4398:249::-;4467:6;4520:2;4508:9;4499:7;4495:23;4491:32;4488:52;;;4536:1;4533;4526:12;4488:52;4568:9;4562:16;4587:30;4611:5;4587:30;:::i;4652:450::-;4721:6;4774:2;4762:9;4753:7;4749:23;4745:32;4742:52;;;4790:1;4787;4780:12;4742:52;4830:9;4817:23;4863:18;4855:6;4852:30;4849:50;;;4895:1;4892;4885:12;4849:50;4918:22;;4971:4;4963:13;;4959:27;-1:-1:-1;4949:55:1;;5000:1;4997;4990:12;4949:55;5023:73;5088:7;5083:2;5070:16;5065:2;5061;5057:11;5023:73;:::i;5292:257::-;5333:3;5371:5;5365:12;5398:6;5393:3;5386:19;5414:63;5470:6;5463:4;5458:3;5454:14;5447:4;5440:5;5436:16;5414:63;:::i;:::-;5531:2;5510:15;-1:-1:-1;;5506:29:1;5497:39;;;;5538:4;5493:50;;5292:257;-1:-1:-1;;5292:257:1:o;5554:637::-;5834:3;5872:6;5866:13;5888:53;5934:6;5929:3;5922:4;5914:6;5910:17;5888:53;:::i;:::-;6004:13;;5963:16;;;;6026:57;6004:13;5963:16;6060:4;6048:17;;6026:57;:::i;:::-;-1:-1:-1;;;6105:20:1;;6134:22;;;6183:1;6172:13;;5554:637;-1:-1:-1;;;;5554:637:1:o;6404:488::-;-1:-1:-1;;;;;6673:15:1;;;6655:34;;6725:15;;6720:2;6705:18;;6698:43;6772:2;6757:18;;6750:34;;;6820:3;6815:2;6800:18;;6793:31;;;6598:4;;6841:45;;6866:19;;6858:6;6841:45;:::i;:::-;6833:53;6404:488;-1:-1:-1;;;;;;6404:488:1:o;7271:219::-;7420:2;7409:9;7402:21;7383:4;7440:44;7480:2;7469:9;7465:18;7457:6;7440:44;:::i;9410:342::-;9612:2;9594:21;;;9651:2;9631:18;;;9624:30;-1:-1:-1;;;9685:2:1;9670:18;;9663:48;9743:2;9728:18;;9410:342::o;10160:356::-;10362:2;10344:21;;;10381:18;;;10374:30;10440:34;10435:2;10420:18;;10413:62;10507:2;10492:18;;10160:356::o;11828:275::-;11899:2;11893:9;11964:2;11945:13;;-1:-1:-1;;11941:27:1;11929:40;;11999:18;11984:34;;12020:22;;;11981:62;11978:88;;;12046:18;;:::i;:::-;12082:2;12075:22;11828:275;;-1:-1:-1;11828:275:1:o;12108:128::-;12148:3;12179:1;12175:6;12172:1;12169:13;12166:39;;;12185:18;;:::i;:::-;-1:-1:-1;12221:9:1;;12108:128::o;12241:120::-;12281:1;12307;12297:35;;12312:18;;:::i;:::-;-1:-1:-1;12346:9:1;;12241:120::o;12366:168::-;12406:7;12472:1;12468;12464:6;12460:14;12457:1;12454:21;12449:1;12442:9;12435:17;12431:45;12428:71;;;12479:18;;:::i;:::-;-1:-1:-1;12519:9:1;;12366:168::o;12539:125::-;12579:4;12607:1;12604;12601:8;12598:34;;;12612:18;;:::i;:::-;-1:-1:-1;12649:9:1;;12539:125::o;12669:258::-;12741:1;12751:113;12765:6;12762:1;12759:13;12751:113;;;12841:11;;;12835:18;12822:11;;;12815:39;12787:2;12780:10;12751:113;;;12882:6;12879:1;12876:13;12873:48;;;-1:-1:-1;;12917:1:1;12899:16;;12892:27;12669:258::o;12932:380::-;13011:1;13007:12;;;;13054;;;13075:61;;13129:4;13121:6;13117:17;13107:27;;13075:61;13182:2;13174:6;13171:14;13151:18;13148:38;13145:161;;;13228:10;13223:3;13219:20;13216:1;13209:31;13263:4;13260:1;13253:15;13291:4;13288:1;13281:15;13145:161;;12932:380;;;:::o;13317:135::-;13356:3;-1:-1:-1;;13377:17:1;;13374:43;;;13397:18;;:::i;:::-;-1:-1:-1;13444:1:1;13433:13;;13317:135::o;13457:112::-;13489:1;13515;13505:35;;13520:18;;:::i;:::-;-1:-1:-1;13554:9:1;;13457:112::o;13574:127::-;13635:10;13630:3;13626:20;13623:1;13616:31;13666:4;13663:1;13656:15;13690:4;13687:1;13680:15;13706:127;13767:10;13762:3;13758:20;13755:1;13748:31;13798:4;13795:1;13788:15;13822:4;13819:1;13812:15;13838:127;13899:10;13894:3;13890:20;13887:1;13880:31;13930:4;13927:1;13920:15;13954:4;13951:1;13944:15;13970:127;14031:10;14026:3;14022:20;14019:1;14012:31;14062:4;14059:1;14052:15;14086:4;14083:1;14076:15;14102:131;-1:-1:-1;;;;;;14176:32:1;;14166:43;;14156:71;;14223:1;14220;14213:12

Swarm Source

ipfs://98f107994b43df4e25fea805246d2c3a576f0c13eec1348b566cadabb3d493b2
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.