ETH Price: $2,961.83 (-1.69%)
Gas: 3 Gwei

Token

NEOSTACKEY (NSK)
 

Overview

Max Total Supply

1,650 NSK

Holders

580

Market

Volume (24H)

4.079 ETH

Min Price (24H)

$1,925.19 @ 0.650000 ETH

Max Price (24H)

$2,070.32 @ 0.699000 ETH
Balance
1 NSK
0xed87631022d31dc2f1827fbf03057f153dbb91dc
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

NEO STACKEY was born as a sister IP of Neo Samurai Monkeys.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
NEOSTACKEY

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-21
*/

//SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}




// 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);
}




// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}



pragma solidity ^0.8.7;


abstract contract MerkleProof {
    bytes32 internal _vipMerkleRoot;
    bytes32 internal _wlMerkleRoot;

    function _setWlMerkleRoot(bytes32 merkleRoot_) internal virtual {
        _wlMerkleRoot = merkleRoot_;
    }

    function isWhitelisted(address address_, bytes32[] memory proof_) public view returns (bool) {
        bytes32 _leaf = keccak256(abi.encodePacked(address_));
        for (uint256 i = 0; i < proof_.length; i++) {
            _leaf = _leaf < proof_[i] ? keccak256(abi.encodePacked(_leaf, proof_[i])) : keccak256(abi.encodePacked(proof_[i], _leaf));
        }
        return _leaf == _wlMerkleRoot;
    }
}



// OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides a set of functions to operate with Base64 strings.
 *
 * _Available since v4.5._
 */
library Base64 {
    /**
     * @dev Base64 Encoding/Decoding Table
     */
    string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /**
     * @dev Converts a `bytes` to its Bytes64 `string` representation.
     */
    function encode(bytes memory data) internal pure returns (string memory) {
        /**
         * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
         * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
         */
        if (data.length == 0) return "";

        // Loads the table into memory
        string memory table = _TABLE;

        // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
        // and split into 4 numbers of 6 bits.
        // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
        // - `data.length + 2`  -> Round up
        // - `/ 3`              -> Number of 3-bytes chunks
        // - `4 *`              -> 4 characters for each chunk
        string memory result = new string(4 * ((data.length + 2) / 3));

        /// @solidity memory-safe-assembly
        assembly {
            // Prepare the lookup table (skip the first "length" byte)
            let tablePtr := add(table, 1)

            // Prepare result pointer, jump over length
            let resultPtr := add(result, 32)

            // Run over the input, 3 bytes at a time
            for {
                let dataPtr := data
                let endPtr := add(data, mload(data))
            } lt(dataPtr, endPtr) {

            } {
                // Advance 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // To write each character, shift the 3 bytes (18 bits) chunk
                // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
                // and apply logical AND with 0x3F which is the number of
                // the previous character in the ASCII table prior to the Base64 Table
                // The result is then added to the table to get the character to write,
                // and finally write it in the result pointer but with a left shift
                // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits

                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance
            }

            // When data `bytes` is not exactly 3 bytes long
            // it is padded with `=` characters at the end
            switch mod(mload(data), 3)
            case 1 {
                mstore8(sub(resultPtr, 1), 0x3d)
                mstore8(sub(resultPtr, 2), 0x3d)
            }
            case 2 {
                mstore8(sub(resultPtr, 1), 0x3d)
            }
        }

        return result;
    }
}




// 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);
}




// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}




// 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);
}




// 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);
}




// 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;
    }
}




// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}




// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;



/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {
        return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}




// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}




// 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;
    }
}




// 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 virtual 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 {}
}




// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

pragma solidity ^0.8.13;


/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);
    bool public operatorFilteringEnabled = true;

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0 && operatorFilteringEnabled) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0 && operatorFilteringEnabled) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
        _;
    }
}


pragma solidity ^0.8.13;
/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}



pragma solidity ^0.8.7;
/*
  🐒                                   🐒🐒
┏━┓╋┏┳━━━┳━━━┳━━━┳━━━━┳━━━┳━━━┳┓┏━┳━━━┳┓╋╋┏┓
┃┃┗┓┃┃┏━━┫┏━┓┃┏━┓┃┏┓┏┓┃┏━┓┃┏━┓┃┃┃┏┫┏━━┫┗┓┏┛┃
┃┏┓┗┛┃┗━━┫┃╋┃┃┗━━╋┛┃┃┗┫┃╋┃┃┃╋┗┫┗┛┛┃┗━━╋┓┗┛┏┛
┃┃┗┓┃┃┏━━┫┃╋┃┣━━┓┃╋┃┃╋┃┗━┛┃┃╋┏┫┏┓┃┃┏━━┛┗┓┏┛
┃┃╋┃┃┃┗━━┫┗━┛┃┗━┛┃╋┃┃╋┃┏━┓┃┗━┛┃┃┃┗┫┗━━┓╋┃┃🐒
┗┛╋┗━┻━━━┻━━━┻━━━┛╋┗┛╋┗┛╋┗┻━━━┻┛┗━┻━━━┛╋┗┛🐒
    🐒              🐒  🐒 🐒              🐒
//Neo-Stackey🐒
*/
contract NEOSTACKEY is Ownable, ERC721A, ReentrancyGuard, MerkleProof, ERC2981, DefaultOperatorFilterer {
  //Project Settings
  uint256 public wlMintPrice = 0.03 ether;
  uint256 public psMintPrice = 0.05 ether;
  uint256 public maxMintsPerWL = 1;
  uint256 public maxMintsPerPS = 2;
  uint256 public maxSupply = 1650;
  uint256 public maxReveal;// = 3;
  uint256 public cntHodl;// = 3;
  uint256 public cntBlock;// = 604800;
  address payable internal _withdrawWallet;

  //URI
  string internal hiddenURI;
  string internal _baseTokenURI;
  string public _baseExtension = ".json";

  //flags
  bool public isWlSaleEnabled;
  bool public isPublicSaleEnabled;
  bool public revealed = false;
  bool internal hodlCntSys = false;
  bool internal hodlTimSys = false;

  //mint records.
  mapping(address => uint256) internal _wlMinted;
  mapping(address => uint256) internal _psMinted;
  mapping(uint256 => uint256) internal _updateAt;
  mapping(uint256 => int256) internal _lockTim;
  
  constructor (
    address _royaltyReceiver,
    uint96 _royaltyFraction
  ) ERC721A ("NEOSTACKEY","NSK") {
    _setDefaultRoyalty(_royaltyReceiver,_royaltyFraction);
  }
  //start from 1.adjust.
  function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
  }
  //set Default Royalty._feeNumerator 500 = 5% Royalty
  function setDefaultRoyalty(address _receiver, uint96 _feeNumerator) external virtual onlyOwner {
      _setDefaultRoyalty(_receiver, _feeNumerator);
  }
  //for ERC2981
  function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, ERC2981) returns (bool) {
    return super.supportsInterface(interfaceId);
  }
  //for ERC2981 Opensea
  function contractURI() external view virtual returns (string memory) {
        return _formatContractURI();
  }
  //make contractURI
  function _formatContractURI() internal view returns (string memory) {
    (address receiver, uint256 royaltyFraction) = royaltyInfo(0,_feeDenominator());//tokenid=0
    return string(
      abi.encodePacked(
        "data:application/json;base64,",
        Base64.encode(
          bytes(
            abi.encodePacked(
                '{"seller_fee_basis_points":', Strings.toString(royaltyFraction),
                ', "fee_recipient":"', Strings.toHexString(uint256(uint160(receiver)), 20), '"}'
            )
          )
        )
      )
    );
  }
  //set owner's wallet.withdraw to this wallet.only owner.
  function setWithdrawWallet(address _owner) external virtual onlyOwner {
    _withdrawWallet = payable(_owner);
  }

  //set maxSupply.only owner.
  function setMaxSupply(uint256 _maxSupply) external virtual onlyOwner {
    require(totalSupply() <= _maxSupply, "Lower than _currentIndex.");
    maxSupply = _maxSupply;
  }

  // SET PRICES.
  function setWlPrice(uint256 newPrice) external virtual onlyOwner {
    wlMintPrice = newPrice;
  }
  function setPsPrice(uint256 newPrice) external virtual onlyOwner {
    psMintPrice = newPrice;
  }

  //set reveal.only owner.
  function setReveal(bool newRevealStatus) external virtual onlyOwner {
    revealed = newRevealStatus;
  }
  //return _isRevealed()
  function _isRevealed() internal view virtual returns (bool){
    return revealed;
  }
  
  //set hodlCnt.only owner.
  function sethodlCntSys(bool newhodlCntSysStatus) external virtual onlyOwner {
    hodlCntSys = newhodlCntSysStatus;
  }

  //set hodlTimSys.only owner.
  function sethodlTimSys(bool newhodlTimSysStatus) external virtual onlyOwner {
    hodlTimSys = newhodlTimSysStatus;
  }
  
  // GET MINTED COUNT.
  function wlMinted(address _address) external view virtual returns (uint256){
    return _wlMinted[_address];
  }
  function psMinted(address _address) external view virtual returns (uint256){
    return _psMinted[_address];
  }

  // SET MAX MINTS.
  function setWlMaxMints(uint256 _max) external virtual onlyOwner {
    maxMintsPerWL = _max;
  }
  function setPsMaxMints(uint256 _max) external virtual onlyOwner {
    maxMintsPerPS = _max;
  }
  // SET MAX Rev.
  function setmaxReveal(uint256 _max) external virtual onlyOwner {
    maxReveal = _max;
  }
  // SET Cntable.
  function setcntBlock(uint256 _cnt) external virtual onlyOwner {
    cntBlock = _cnt;
  }

  // SET SALES ENABLE.
  function setWhitelistSaleEnable(bool bool_) external virtual onlyOwner {
    isWlSaleEnabled = bool_;
  }
  function setPublicSaleEnable(bool bool_) external virtual onlyOwner {
    isPublicSaleEnabled = bool_;
  }

  // SET MERKLE ROOT.
  function setWlMerkleRoot(bytes32 merkleRoot_) external virtual onlyOwner {
    _setWlMerkleRoot(merkleRoot_);
  }

  //set HiddenBaseURI.only owner.
  function setHiddenURI(string memory uri_) external virtual onlyOwner {
    hiddenURI = uri_;
  }

  //return _currentIndex
  function getCurrentIndex() external view virtual returns (uint256){
    return _currentIndex;
  }

  //set BaseURI at after reveal. only owner.
  function setBaseURI(string memory uri_) external virtual onlyOwner {
    _baseTokenURI = uri_;
  }


  function setBaseExtension(string memory _newBaseExtension) external onlyOwner
  {
    _baseExtension = _newBaseExtension;
  }

  //retuen BaseURI.internal.
  function _currentBaseURI() internal view returns (string memory){
    return _baseTokenURI;
  }



  function getTokenTim(uint256 _tokenId) external view  virtual returns (uint256) {
    require(_exists(_tokenId), "URI query for nonexistent token");
      return _updateAt[_tokenId];
  }

  function getTokenTimId(uint256 _tokenId) internal view  virtual returns (int256) {
    require(_exists(_tokenId), "URI query for nonexistent token");
    int256 revealId = (int256(block.timestamp)-int256(_updateAt[_tokenId])) / int256(cntBlock);
    if (revealId >= int256(maxReveal)){
        revealId = int256(maxReveal);
    }
    return revealId;
  }

  function getHodlCntId(uint256 _tokenId) internal view  virtual returns (int256) {
    require(_exists(_tokenId), "URI query for nonexistent token");
    address ownerAddress_ = ownerOf(_tokenId);
    uint256 tokenBalance_ = balanceOf(ownerAddress_);
    int256 revealId = int256(tokenBalance_) / int256(cntHodl);
    if (revealId >= int256(maxReveal)){
        revealId = int256(maxReveal);
    }
    return revealId;
  }
  
  function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
    require(_exists(_tokenId), "URI query for nonexistent token");
    if(_isRevealed()){
        if(_lockTim[_tokenId] > 0){
            return string(abi.encodePacked(_currentBaseURI(), Strings.toString(uint256(_lockTim[_tokenId])) ,"/", Strings.toString((_tokenId)), _baseExtension));
        }
        if(hodlCntSys){
            int256 revealId = getHodlCntId(_tokenId);
            return string(abi.encodePacked(_currentBaseURI(), Strings.toString(uint256(revealId)) ,"/", Strings.toString((_tokenId)), _baseExtension));
        }
        if(hodlTimSys){
            int256 revealId = getTokenTimId(_tokenId);
            return string(abi.encodePacked(_currentBaseURI(), Strings.toString(uint256(revealId)) ,"/", Strings.toString((_tokenId)), _baseExtension));
        }
        return string(abi.encodePacked(_currentBaseURI(), Strings.toString(_tokenId), _baseExtension));
    }
    return hiddenURI;
  }

  //fixrevId
  function fixToken(uint256 _tokenId) external virtual {
    require(_exists(_tokenId), "URI query for nonexistent token");
    require(ownerOf(_tokenId) == msg.sender, "isnt owner token");
    if(_isRevealed()){
        if(hodlCntSys){
            int256 revealId = getHodlCntId(_tokenId);
            _lockTim[_tokenId] = revealId;
        }
        if(hodlTimSys){
            int256 revealId = getTokenTimId(_tokenId);
            _lockTim[_tokenId] = revealId;
        }
    }
  }

  //unfixrevId
  function unfixToken(uint256 _tokenId) external virtual {
    require(_exists(_tokenId), "URI query for nonexistent token");
    require(ownerOf(_tokenId) == msg.sender, "isnt owner token");
    _lockTim[_tokenId] = 0;
  }


  //owner mint.transfer to _address.only owner.
  function ownerMint(uint256 _amount, address _address) external virtual onlyOwner { 
    require((_amount + totalSupply()) <= (maxSupply), "No more NFTs");
    _safeMint(_address, _amount);
  }


  //WL mint.
  function whitelistMint(uint256 _amount, bytes32[] memory proof_) external payable virtual nonReentrant {
    require(isWlSaleEnabled, "whitelistMint is Paused");
    require(isWhitelisted(msg.sender, proof_), "You are not whitelisted!");
    require(maxMintsPerWL >= _amount, "whitelistMint: Over max mints per wallet");
    require(maxMintsPerWL >= _wlMinted[msg.sender] + _amount, "You have no whitelistMint left");
    require(msg.value == wlMintPrice * _amount, "ETH value is not correct");
    require((_amount + totalSupply()) <= (maxSupply), "No more NFTs");
    _wlMinted[msg.sender] += _amount;
    _safeMint(msg.sender, _amount);
  }
  
  //Public mint.
  function publicMint(uint256 _amount) external payable virtual nonReentrant {
    require(isPublicSaleEnabled, "publicMint is Paused");
    require(maxMintsPerPS >= _amount, "publicMint: Over max mints per wallet");
    require(maxMintsPerPS >= _psMinted[msg.sender] + _amount, "You have no publicMint left");
    require(msg.value == psMintPrice * _amount, "ETH value is not correct");
    require((_amount + totalSupply()) <= (maxSupply), "No more NFTs");

    _psMinted[msg.sender] += _amount;
    _safeMint(msg.sender, _amount);
  }

  //burn
  function burn(uint256 tokenId) external virtual {
    _burn(tokenId, true);
  }



  //widraw ETH from this contract.only owner. 
  function withdraw() external payable virtual onlyOwner nonReentrant{
    // This will payout the owner 100% of the contract balance.
    // Do not remove this otherwise you will not be able to withdraw the funds.
    // =============================================================================
    bool os;
    if(_withdrawWallet != address(0)){//if _withdrawWallet has.
      (os, ) = payable(_withdrawWallet).call{value: address(this).balance}("");
    }else{
      (os, ) = payable(owner()).call{value: address(this).balance}("");
    }
    require(os);
    // =============================================================================
  }


  //return wallet owned tokenids.
  function walletOfOwner(address _address) external view virtual returns (uint256[] memory) {
    uint256 ownerTokenCount = balanceOf(_address);
    uint256[] memory tokenIds = new uint256[](ownerTokenCount);
    //search from all tonkenid. so spend high gas values.attention.
    uint256 tokenindex = 0;
    for (uint256 i = _startTokenId(); i < _currentIndex; i++) {
      if(_address == this.tryOwnerOf(i)) tokenIds[tokenindex++] = i;
    }
    return tokenIds;
  }

  //try catch vaersion ownerOf. support burned tokenid.
  function tryOwnerOf(uint256 tokenId) external view  virtual returns (address) {
    try this.ownerOf(tokenId) returns (address _address) {
      return(_address);
    } catch {
        return (address(0));//return 0x0 if error.
    }
  }

    /**
     * @notice Set the state of the OpenSea operator filter
     * @param value Flag indicating if the operator filter should be applied to transfers and approvals
     */
    function setOperatorFilteringEnabled(bool value) external onlyOwner {
        operatorFilteringEnabled = value;
    }

    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) {
        super.approve(operator, tokenId);
    }

    function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }

    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal override {
        _updateAt[startTokenId] = block.timestamp;
        uint256 updatedIndex = startTokenId;
        uint256 end = updatedIndex + quantity;
        do {
            _updateAt[updatedIndex++] = block.timestamp;
        } while (updatedIndex < end);
        super._beforeTokenTransfers(from, to, startTokenId, quantity);
    }
}
//CODE.BY.FRICKLIK

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_royaltyReceiver","type":"address"},{"internalType":"uint96","name":"_royaltyFraction","type":"uint96"}],"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":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cntBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cntHodl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"fixToken","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":[],"name":"getCurrentIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getTokenTim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"isPublicSaleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWlSaleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsPerPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsPerWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxReveal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","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":"operatorFilteringEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"psMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"psMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setHiddenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setOperatorFilteringEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setPsMaxMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPsPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setPublicSaleEnable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newRevealStatus","type":"bool"}],"name":"setReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setWhitelistSaleEnable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setWithdrawWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setWlMaxMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setWlMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setWlPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cnt","type":"uint256"}],"name":"setcntBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newhodlCntSysStatus","type":"bool"}],"name":"sethodlCntSys","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newhodlTimSysStatus","type":"bool"}],"name":"sethodlTimSys","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setmaxReveal","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tryOwnerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"unfixToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"wlMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"wlMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

600e805460ff19166001908117909155666a94d74f430000600f5566b1a2bc2ec50000601055601155600260125561067260135560c06040526005608081905264173539b7b760d91b60a09081526200005c91601a9190620003f6565b50601b805464ffffff0000191690553480156200007857600080fd5b5060405162004333380380620043338339810160408190526200009b916200049c565b733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600a8152602001694e454f535441434b455960b01b815250604051806040016040528060038152602001624e534b60e81b8152506200010b620001056200029d60201b60201c565b620002a1565b815162000120906003906020850190620003f6565b50805162000136906004906020840190620003f6565b50600180815560095550506daaeb6d7670e522a718067333cd4e3b1562000286578015620001d457604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b158015620001b557600080fd5b505af1158015620001ca573d6000803e3d6000fd5b5050505062000286565b6001600160a01b03821615620002255760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af2903906044016200019a565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200026c57600080fd5b505af115801562000281573d6000803e3d6000fd5b505050505b506200029590508282620002f1565b50506200052d565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6127106001600160601b0382161115620003655760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084015b60405180910390fd5b6001600160a01b038216620003bd5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016200035c565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600c55565b8280546200040490620004f1565b90600052602060002090601f01602090048101928262000428576000855562000473565b82601f106200044357805160ff191683800117855562000473565b8280016001018555821562000473579182015b828111156200047357825182559160200191906001019062000456565b506200048192915062000485565b5090565b5b8082111562000481576000815560010162000486565b60008060408385031215620004b057600080fd5b82516001600160a01b0381168114620004c857600080fd5b60208401519092506001600160601b0381168114620004e657600080fd5b809150509250929050565b600181811c908216806200050657607f821691505b6020821081036200052757634e487b7160e01b600052602260045260246000fd5b50919050565b613df6806200053d6000396000f3fe6080604052600436106103d95760003560e01c80637254d90c116101fd578063a355fd2911610118578063d5abeb01116100ab578063e985e9c51161007a578063e985e9c514610b4a578063f2fde38b14610b93578063facd92d414610bb3578063fb796e6c14610bd3578063fe8b456e14610bed57600080fd5b8063d5abeb0114610adf578063d78be71c14610af5578063da3ef23f14610b15578063e8a3d48514610b3557600080fd5b8063c3faf724116100e7578063c3faf72414610a6c578063c87b56dd14610a8c578063d2cab05614610aac578063d52c57e014610abf57600080fd5b8063a355fd29146109ec578063b7c0b8e814610a0c578063b88d4fde14610a2c578063bbaac02f14610a4c57600080fd5b80638c5668be11610190578063942958f41161015f578063942958f41461096b57806395d89b41146109a15780639970cc29146109b6578063a22cb465146109cc57600080fd5b80638c5668be146108ed5780638da5cb5b1461090d5780638dd07d0f1461092b5780639373f4321461094b57600080fd5b80637fc69f5a116101cc5780637fc69f5a14610877578063813779ef1461088d578063830b3a64146108ad5780638ac1e161146108cd57600080fd5b80637254d90c146107eb57806374dfc982146108015780637558be9e1461082157806378a923801461084157600080fd5b80633c136054116102f8578063518302271161028b5780636f8b44b01161025a5780636f8b44b014610756578063709411d21461077657806370a0823114610796578063715018a6146107b6578063719eaef8146107cb57600080fd5b806351830227146106d657806355f804b3146106f65780635a23dd99146107165780636352211e1461073657600080fd5b806342454db9116102c757806342454db91461065357806342842e0e1461066957806342966c6814610689578063438b6300146106a957600080fd5b80633c136054146105ea5780633ccfd60b1461060a5780634009920d1461061257806341f434341461063157600080fd5b8063189f3de1116103705780632a3f300c1161033f5780632a3f300c146105625780632a55205a146105825780632c4e9fc6146105c15780632db11544146105d757600080fd5b8063189f3de1146104fd5780631a09cfe21461051757806323b872dd1461052d5780632672c9021461054d57600080fd5b8063095ea7b3116103ac578063095ea7b31461048f5780630a594d41146104af5780630d9005ae146104d357806318160ddd146104e857600080fd5b806301ffc9a7146103de57806304634d8d1461041357806306fdde0314610435578063081812fc14610457575b600080fd5b3480156103ea57600080fd5b506103fe6103f93660046133bc565b610c0d565b60405190151581526020015b60405180910390f35b34801561041f57600080fd5b5061043361042e3660046133ee565b610c1e565b005b34801561044157600080fd5b5061044a610c34565b60405161040a919061348b565b34801561046357600080fd5b5061047761047236600461349e565b610cc6565b6040516001600160a01b03909116815260200161040a565b34801561049b57600080fd5b506104336104aa3660046134b7565b610d0a565b3480156104bb57600080fd5b506104c560155481565b60405190815260200161040a565b3480156104df57600080fd5b506001546104c5565b3480156104f457600080fd5b506104c5610de8565b34801561050957600080fd5b50601b546103fe9060ff1681565b34801561052357600080fd5b506104c560125481565b34801561053957600080fd5b506104336105483660046134e3565b610df6565b34801561055957600080fd5b5061044a610edf565b34801561056e57600080fd5b5061043361057d366004613532565b610f6d565b34801561058e57600080fd5b506105a261059d36600461354f565b610f91565b604080516001600160a01b03909316835260208301919091520161040a565b3480156105cd57600080fd5b506104c5600f5481565b6104336105e536600461349e565b61103d565b3480156105f657600080fd5b50610433610605366004613532565b61123f565b610433611267565b34801561061e57600080fd5b50601b546103fe90610100900460ff1681565b34801561063d57600080fd5b506104776daaeb6d7670e522a718067333cd4e81565b34801561065f57600080fd5b506104c560105481565b34801561067557600080fd5b506104336106843660046134e3565b611372565b34801561069557600080fd5b506104336106a436600461349e565b611450565b3480156106b557600080fd5b506106c96106c4366004613571565b61145e565b60405161040a919061358e565b3480156106e257600080fd5b50601b546103fe9062010000900460ff1681565b34801561070257600080fd5b5061043361071136600461366f565b611581565b34801561072257600080fd5b506103fe610731366004613736565b61159c565b34801561074257600080fd5b5061047761075136600461349e565b6116c0565b34801561076257600080fd5b5061043361077136600461349e565b6116d2565b34801561078257600080fd5b5061043361079136600461349e565b611736565b3480156107a257600080fd5b506104c56107b1366004613571565b6117bf565b3480156107c257600080fd5b5061043361180d565b3480156107d757600080fd5b506104336107e636600461349e565b611821565b3480156107f757600080fd5b506104c560165481565b34801561080d57600080fd5b506104c561081c36600461349e565b61182e565b34801561082d57600080fd5b5061043361083c36600461349e565b611868565b34801561084d57600080fd5b506104c561085c366004613571565b6001600160a01b03166000908152601c602052604090205490565b34801561088357600080fd5b506104c560145481565b34801561089957600080fd5b506104336108a836600461349e565b611875565b3480156108b957600080fd5b506104776108c836600461349e565b611882565b3480156108d957600080fd5b506104336108e836600461349e565b6118e9565b3480156108f957600080fd5b5061043361090836600461349e565b6118fa565b34801561091957600080fd5b506000546001600160a01b0316610477565b34801561093757600080fd5b5061043361094636600461349e565b6119e2565b34801561095757600080fd5b50610433610966366004613571565b6119ef565b34801561097757600080fd5b506104c5610986366004613571565b6001600160a01b03166000908152601d602052604090205490565b3480156109ad57600080fd5b5061044a611a19565b3480156109c257600080fd5b506104c560115481565b3480156109d857600080fd5b506104336109e7366004613785565b611a28565b3480156109f857600080fd5b50610433610a07366004613532565b611afc565b348015610a1857600080fd5b50610433610a27366004613532565b611b1e565b348015610a3857600080fd5b50610433610a473660046137b3565b611b39565b348015610a5857600080fd5b50610433610a6736600461366f565b611c25565b348015610a7857600080fd5b50610433610a87366004613532565b611c40565b348015610a9857600080fd5b5061044a610aa736600461349e565b611c5b565b610433610aba366004613832565b611e36565b348015610acb57600080fd5b50610433610ada366004613862565b612096565b348015610aeb57600080fd5b506104c560135481565b348015610b0157600080fd5b50610433610b1036600461349e565b6120db565b348015610b2157600080fd5b50610433610b3036600461366f565b6120e8565b348015610b4157600080fd5b5061044a612103565b348015610b5657600080fd5b506103fe610b65366004613887565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b348015610b9f57600080fd5b50610433610bae366004613571565b612112565b348015610bbf57600080fd5b50610433610bce366004613532565b612188565b348015610bdf57600080fd5b50600e546103fe9060ff1681565b348015610bf957600080fd5b50610433610c0836600461349e565b6121ae565b6000610c18826121bb565b92915050565b610c266121e0565b610c30828261223a565b5050565b606060038054610c43906138b5565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6f906138b5565b8015610cbc5780601f10610c9157610100808354040283529160200191610cbc565b820191906000526020600020905b815481529060010190602001808311610c9f57829003601f168201915b5050505050905090565b6000610cd182612337565b610cee576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b816daaeb6d7670e522a718067333cd4e3b15801590610d2b5750600e5460ff165b15610dd957604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610d88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dac91906138ef565b610dd957604051633b79c77360e21b81526001600160a01b03821660048201526024015b60405180910390fd5b610de38383612370565b505050565b600254600154036000190190565b826daaeb6d7670e522a718067333cd4e3b15801590610e175750600e5460ff165b15610ece57336001600160a01b03821603610e3c57610e378484846123f1565b610ed9565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610e8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eaf91906138ef565b610ece57604051633b79c77360e21b8152336004820152602401610dd0565b610ed98484846123f1565b50505050565b601a8054610eec906138b5565b80601f0160208091040260200160405190810160405280929190818152602001828054610f18906138b5565b8015610f655780601f10610f3a57610100808354040283529160200191610f65565b820191906000526020600020905b815481529060010190602001808311610f4857829003601f168201915b505050505081565b610f756121e0565b601b8054911515620100000262ff000019909216919091179055565b6000828152600d602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291611006575060408051808201909152600c546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090611025906001600160601b031687613922565b61102f9190613957565b915196919550909350505050565b60026009540361105f5760405162461bcd60e51b8152600401610dd09061396b565b6002600955601b54610100900460ff166110b25760405162461bcd60e51b81526020600482015260146024820152731c1d589b1a58d35a5b9d081a5cc814185d5cd95960621b6044820152606401610dd0565b8060125410156111125760405162461bcd60e51b815260206004820152602560248201527f7075626c69634d696e743a204f766572206d6178206d696e7473207065722077604482015264185b1b195d60da1b6064820152608401610dd0565b336000908152601d602052604090205461112d9082906139a2565b601254101561117e5760405162461bcd60e51b815260206004820152601b60248201527f596f752068617665206e6f207075626c69634d696e74206c65667400000000006044820152606401610dd0565b8060105461118c9190613922565b34146111d55760405162461bcd60e51b8152602060048201526018602482015277115512081d985b1d59481a5cc81b9bdd0818dbdc9c9958dd60421b6044820152606401610dd0565b6013546111e0610de8565b6111ea90836139a2565b11156112085760405162461bcd60e51b8152600401610dd0906139ba565b336000908152601d6020526040812080548392906112279084906139a2565b90915550611237905033826123fc565b506001600955565b6112476121e0565b601b80549115156401000000000264ff0000000019909216919091179055565b61126f6121e0565b6002600954036112915760405162461bcd60e51b8152600401610dd09061396b565b60026009556017546000906001600160a01b031615611307576017546040516001600160a01b03909116904790600081818185875af1925050503d80600081146112f7576040519150601f19603f3d011682016040523d82523d6000602084013e6112fc565b606091505b505080915050611368565b6000546001600160a01b03166001600160a01b03164760405160006040518083038185875af1925050503d806000811461135d576040519150601f19603f3d011682016040523d82523d6000602084013e611362565b606091505b50909150505b8061123757600080fd5b826daaeb6d7670e522a718067333cd4e3b158015906113935750600e5460ff165b1561144557336001600160a01b038216036113b357610e37848484612416565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611402573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142691906138ef565b61144557604051633b79c77360e21b8152336004820152602401610dd0565b610ed9848484612416565b61145b816001612431565b50565b6060600061146b836117bf565b90506000816001600160401b03811115611487576114876135d2565b6040519080825280602002602001820160405280156114b0578160200160208202803683370190505b509050600060015b600154811015611577576040516320c2ce9960e21b815260048101829052309063830b3a6490602401602060405180830381865afa1580156114fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152291906139e0565b6001600160a01b0316866001600160a01b03160361156557808383611546816139fd565b94508151811061155857611558613a16565b6020026020010181815250505b8061156f816139fd565b9150506114b8565b5090949350505050565b6115896121e0565b8051610c3090601990602084019061330d565b6040516bffffffffffffffffffffffff19606084901b166020820152600090819060340160405160208183030381529060405280519060200120905060005b83518110156116b4578381815181106115f6576115f6613a16565b602002602001015182106116545783818151811061161657611616613a16565b602002602001015182604051602001611639929190918252602082015260400190565b604051602081830303815290604052805190602001206116a0565b8184828151811061166757611667613a16565b6020026020010151604051602001611689929190918252602082015260400190565b604051602081830303815290604052805190602001205b9150806116ac816139fd565b9150506115db565b50600b54149392505050565b60006116cb826125f3565b5192915050565b6116da6121e0565b806116e3610de8565b11156117315760405162461bcd60e51b815260206004820152601960248201527f4c6f776572207468616e205f63757272656e74496e6465782e000000000000006044820152606401610dd0565b601355565b61173f81612337565b61175b5760405162461bcd60e51b8152600401610dd090613a2c565b33611765826116c0565b6001600160a01b0316146117ae5760405162461bcd60e51b815260206004820152601060248201526f34b9b73a1037bbb732b9103a37b5b2b760811b6044820152606401610dd0565b6000908152601f6020526040812055565b60006001600160a01b0382166117e8576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b6118156121e0565b61181f6000612715565b565b6118296121e0565b601155565b600061183982612337565b6118555760405162461bcd60e51b8152600401610dd090613a2c565b506000908152601e602052604090205490565b6118706121e0565b601455565b61187d6121e0565b601255565b6040516331a9108f60e11b8152600481018290526000903090636352211e90602401602060405180830381865afa9250505080156118dd575060408051601f3d908101601f191682019092526118da918101906139e0565b60015b610c1857506000919050565b6118f16121e0565b61145b81600b55565b61190381612337565b61191f5760405162461bcd60e51b8152600401610dd090613a2c565b33611929826116c0565b6001600160a01b0316146119725760405162461bcd60e51b815260206004820152601060248201526f34b9b73a1037bbb732b9103a37b5b2b760811b6044820152606401610dd0565b601b5462010000900460ff161561145b57601b546301000000900460ff16156119b15760006119a082612765565b6000838152601f6020526040902055505b601b54640100000000900460ff161561145b5760006119cf826127ce565b6000838152601f60205260409020555050565b6119ea6121e0565b600f55565b6119f76121e0565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b606060048054610c43906138b5565b816daaeb6d7670e522a718067333cd4e3b15801590611a495750600e5460ff165b15611af257604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611aa6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aca91906138ef565b611af257604051633b79c77360e21b81526001600160a01b0382166004820152602401610dd0565b610de38383612833565b611b046121e0565b601b80549115156101000261ff0019909216919091179055565b611b266121e0565b600e805460ff1916911515919091179055565b836daaeb6d7670e522a718067333cd4e3b15801590611b5a5750600e5460ff165b15611c1257336001600160a01b03821603611b8057611b7b858585856128c8565b611c1e565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611bcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf391906138ef565b611c1257604051633b79c77360e21b8152336004820152602401610dd0565b611c1e858585856128c8565b5050505050565b611c2d6121e0565b8051610c3090601890602084019061330d565b611c486121e0565b601b805460ff1916911515919091179055565b6060611c6682612337565b611c825760405162461bcd60e51b8152600401610dd090613a2c565b601b5462010000900460ff1615611da4576000828152601f60205260408120541315611cfc57611cb061290c565b6000838152601f6020526040902054611cc89061291b565b611cd18461291b565b601a604051602001611ce69493929190613afc565b6040516020818303038152906040529050919050565b601b546301000000900460ff1615611d61576000611d1983612765565b9050611d2361290c565b611d2c8261291b565b611d358561291b565b601a604051602001611d4a9493929190613afc565b604051602081830303815290604052915050919050565b601b54640100000000900460ff1615611d7f576000611d19836127ce565b611d8761290c565b611d908361291b565b601a604051602001611ce693929190613b5a565b60188054611db1906138b5565b80601f0160208091040260200160405190810160405280929190818152602001828054611ddd906138b5565b8015611e2a5780601f10611dff57610100808354040283529160200191611e2a565b820191906000526020600020905b815481529060010190602001808311611e0d57829003601f168201915b50505050509050919050565b600260095403611e585760405162461bcd60e51b8152600401610dd09061396b565b6002600955601b5460ff16611eaf5760405162461bcd60e51b815260206004820152601760248201527f77686974656c6973744d696e74206973205061757365640000000000000000006044820152606401610dd0565b611eb9338261159c565b611f055760405162461bcd60e51b815260206004820152601860248201527f596f7520617265206e6f742077686974656c69737465642100000000000000006044820152606401610dd0565b816011541015611f685760405162461bcd60e51b815260206004820152602860248201527f77686974656c6973744d696e743a204f766572206d6178206d696e74732070656044820152671c881dd85b1b195d60c21b6064820152608401610dd0565b336000908152601c6020526040902054611f839083906139a2565b6011541015611fd45760405162461bcd60e51b815260206004820152601e60248201527f596f752068617665206e6f2077686974656c6973744d696e74206c65667400006044820152606401610dd0565b81600f54611fe29190613922565b341461202b5760405162461bcd60e51b8152602060048201526018602482015277115512081d985b1d59481a5cc81b9bdd0818dbdc9c9958dd60421b6044820152606401610dd0565b601354612036610de8565b61204090846139a2565b111561205e5760405162461bcd60e51b8152600401610dd0906139ba565b336000908152601c60205260408120805484929061207d9084906139a2565b9091555061208d905033836123fc565b50506001600955565b61209e6121e0565b6013546120a9610de8565b6120b390846139a2565b11156120d15760405162461bcd60e51b8152600401610dd0906139ba565b610c3081836123fc565b6120e36121e0565b601055565b6120f06121e0565b8051610c3090601a90602084019061330d565b606061210d612a1b565b905090565b61211a6121e0565b6001600160a01b03811661217f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610dd0565b61145b81612715565b6121906121e0565b601b805491151563010000000263ff00000019909216919091179055565b6121b66121e0565b601655565b60006001600160e01b0319821663152a902d60e11b1480610c185750610c1882612a9b565b6000546001600160a01b0316331461181f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dd0565b6127106001600160601b03821611156122a85760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610dd0565b6001600160a01b0382166122fe5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610dd0565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600c55565b60008160011115801561234b575060015482105b8015610c18575050600090815260056020526040902054600160e01b900460ff161590565b600061237b826116c0565b9050806001600160a01b0316836001600160a01b0316036123af5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216146123e6576123c98133610b65565b6123e6576040516367d9dca160e11b815260040160405180910390fd5b610de3838383612aeb565b610de3838383612b47565b610c30828260405180602001604052806000815250612d2d565b610de383838360405180602001604052806000815250611b39565b600061243c836125f3565b805190915082156124a2576000336001600160a01b038316148061246557506124658233610b65565b8061248057503361247586610cc6565b6001600160a01b0316145b9050806124a057604051632ce44b5f60e11b815260040160405180910390fd5b505b6124b0816000866001612edc565b6124bc60008583612aeb565b6001600160a01b0380821660008181526006602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526005909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b1785559189018084529220805491949091166125ba5760015482146125ba57805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b03841690600080516020613da1833981519152908390a450506002805460010190555050565b604080516060810182526000808252602082018190529181019190915281806001116126fc576001548110156126fc57600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906126fa5780516001600160a01b031615612691579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156126f5579392505050565b612691565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600061277082612337565b61278c5760405162461bcd60e51b8152600401610dd090613a2c565b6000612797836116c0565b905060006127a4826117bf565b90506000601554826127b69190613b8c565b905060145481126127c657506014545b949350505050565b60006127d982612337565b6127f55760405162461bcd60e51b8152600401610dd090613a2c565b6016546000838152601e60205260408120549091906128149042613bba565b61281e9190613b8c565b90506014548112610c18575060145492915050565b336001600160a01b0383160361285c5760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6128d3848484612b47565b6001600160a01b0383163b15610ed9576128ef84848484612f2e565b610ed9576040516368d2bf6b60e11b815260040160405180910390fd5b606060198054610c43906138b5565b6060816000036129425750506040805180820190915260018152600360fc1b602082015290565b8160005b811561296c5780612956816139fd565b91506129659050600a83613957565b9150612946565b6000816001600160401b03811115612986576129866135d2565b6040519080825280601f01601f1916602001820160405280156129b0576020820181803683370190505b5090505b84156127c6576129c5600183613bf9565b91506129d2600a86613c10565b6129dd9060306139a2565b60f81b8183815181106129f2576129f2613a16565b60200101906001600160f81b031916908160001a905350612a14600a86613957565b94506129b4565b6060600080612a2c81612710610f91565b91509150612a75612a3c8261291b565b612a50846001600160a01b03166014613019565b604051602001612a61929190613c24565b6040516020818303038152906040526131bb565b604051602001612a859190613caa565b6040516020818303038152906040529250505090565b60006001600160e01b031982166380ac58cd60e01b1480612acc57506001600160e01b03198216635b5e139f60e01b145b80610c1857506301ffc9a760e01b6001600160e01b0319831614610c18565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000612b52826125f3565b9050836001600160a01b031681600001516001600160a01b031614612b895760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480612ba75750612ba78533610b65565b80612bc2575033612bb784610cc6565b6001600160a01b0316145b905080612be257604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416612c0957604051633a954ecd60e21b815260040160405180910390fd5b612c168585856001612edc565b612c2260008487612aeb565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116612cf6576001548214612cf657805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b0316600080516020613da183398151915260405160405180910390a4611c1e565b6001546001600160a01b038416612d5657604051622e076360e81b815260040160405180910390fd5b82600003612d775760405163b562e8dd60e01b815260040160405180910390fd5b612d846000858386612edc565b6001600160a01b038416600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600590925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15612e9a575b60405182906001600160a01b03881690600090600080516020613da1833981519152908290a4612e636000878480600101955087612f2e565b612e80576040516368d2bf6b60e11b815260040160405180910390fd5b808210612e2a578260015414612e9557600080fd5b612ecd565b5b6040516001830192906001600160a01b03881690600090600080516020613da1833981519152908290a4808210612e9b575b50600155610ed9600085838684565b6000828152601e602052604081204290558290612ef983836139a2565b90505b42601e600084612f0b816139fd565b9550815260200190815260200160002081905550808210612efc57505050505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612f63903390899088908890600401613cef565b6020604051808303816000875af1925050508015612f9e575060408051601f3d908101601f19168201909252612f9b91810190613d2c565b60015b612ffc573d808015612fcc576040519150601f19603f3d011682016040523d82523d6000602084013e612fd1565b606091505b508051600003612ff4576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b60606000613028836002613922565b6130339060026139a2565b6001600160401b0381111561304a5761304a6135d2565b6040519080825280601f01601f191660200182016040528015613074576020820181803683370190505b509050600360fc1b8160008151811061308f5761308f613a16565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106130be576130be613a16565b60200101906001600160f81b031916908160001a90535060006130e2846002613922565b6130ed9060016139a2565b90505b6001811115613165576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061312157613121613a16565b1a60f81b82828151811061313757613137613a16565b60200101906001600160f81b031916908160001a90535060049490941c9361315e81613d49565b90506130f0565b5083156131b45760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610dd0565b9392505050565b606081516000036131da57505060408051602081019091526000815290565b6000604051806060016040528060408152602001613d61604091399050600060038451600261320991906139a2565b6132139190613957565b61321e906004613922565b6001600160401b03811115613235576132356135d2565b6040519080825280601f01601f19166020018201604052801561325f576020820181803683370190505b509050600182016020820185865187015b808210156132cb576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250613270565b50506003865106600181146132e757600281146132fa57613302565b603d6001830353603d6002830353613302565b603d60018303535b509195945050505050565b828054613319906138b5565b90600052602060002090601f01602090048101928261333b5760008555613381565b82601f1061335457805160ff1916838001178555613381565b82800160010185558215613381579182015b82811115613381578251825591602001919060010190613366565b5061338d929150613391565b5090565b5b8082111561338d5760008155600101613392565b6001600160e01b03198116811461145b57600080fd5b6000602082840312156133ce57600080fd5b81356131b4816133a6565b6001600160a01b038116811461145b57600080fd5b6000806040838503121561340157600080fd5b823561340c816133d9565b915060208301356001600160601b038116811461342857600080fd5b809150509250929050565b60005b8381101561344e578181015183820152602001613436565b83811115610ed95750506000910152565b60008151808452613477816020860160208601613433565b601f01601f19169290920160200192915050565b6020815260006131b4602083018461345f565b6000602082840312156134b057600080fd5b5035919050565b600080604083850312156134ca57600080fd5b82356134d5816133d9565b946020939093013593505050565b6000806000606084860312156134f857600080fd5b8335613503816133d9565b92506020840135613513816133d9565b929592945050506040919091013590565b801515811461145b57600080fd5b60006020828403121561354457600080fd5b81356131b481613524565b6000806040838503121561356257600080fd5b50508035926020909101359150565b60006020828403121561358357600080fd5b81356131b4816133d9565b6020808252825182820181905260009190848201906040850190845b818110156135c6578351835292840192918401916001016135aa565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613610576136106135d2565b604052919050565b60006001600160401b03831115613631576136316135d2565b613644601f8401601f19166020016135e8565b905082815283838301111561365857600080fd5b828260208301376000602084830101529392505050565b60006020828403121561368157600080fd5b81356001600160401b0381111561369757600080fd5b8201601f810184136136a857600080fd5b6127c684823560208401613618565b600082601f8301126136c857600080fd5b813560206001600160401b038211156136e3576136e36135d2565b8160051b6136f28282016135e8565b928352848101820192828101908785111561370c57600080fd5b83870192505b8483101561372b57823582529183019190830190613712565b979650505050505050565b6000806040838503121561374957600080fd5b8235613754816133d9565b915060208301356001600160401b0381111561376f57600080fd5b61377b858286016136b7565b9150509250929050565b6000806040838503121561379857600080fd5b82356137a3816133d9565b9150602083013561342881613524565b600080600080608085870312156137c957600080fd5b84356137d4816133d9565b935060208501356137e4816133d9565b92506040850135915060608501356001600160401b0381111561380657600080fd5b8501601f8101871361381757600080fd5b61382687823560208401613618565b91505092959194509250565b6000806040838503121561384557600080fd5b8235915060208301356001600160401b0381111561376f57600080fd5b6000806040838503121561387557600080fd5b823591506020830135613428816133d9565b6000806040838503121561389a57600080fd5b82356138a5816133d9565b91506020830135613428816133d9565b600181811c908216806138c957607f821691505b6020821081036138e957634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561390157600080fd5b81516131b481613524565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561393c5761393c61390c565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261396657613966613941565b500490565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600082198211156139b5576139b561390c565b500190565b6020808252600c908201526b4e6f206d6f7265204e46547360a01b604082015260600190565b6000602082840312156139f257600080fd5b81516131b4816133d9565b600060018201613a0f57613a0f61390c565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6020808252601f908201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00604082015260600190565b8054600090600181811c9080831680613a7d57607f831692505b60208084108203613a9e57634e487b7160e01b600052602260045260246000fd5b818015613ab25760018114613ac357613af0565b60ff19861689528489019650613af0565b60008881526020902060005b86811015613ae85781548b820152908501908301613acf565b505084890196505b50505050505092915050565b60008551613b0e818460208a01613433565b855190830190613b22818360208a01613433565b602f60f81b91019081528451613b3f816001840160208901613433565b613b4e60018284010186613a63565b98975050505050505050565b60008451613b6c818460208901613433565b845190830190613b80818360208901613433565b61372b81830186613a63565b600082613b9b57613b9b613941565b600160ff1b821460001984141615613bb557613bb561390c565b500590565b60008083128015600160ff1b850184121615613bd857613bd861390c565b6001600160ff1b0384018313811615613bf357613bf361390c565b50500390565b600082821015613c0b57613c0b61390c565b500390565b600082613c1f57613c1f613941565b500690565b7f7b2273656c6c65725f6665655f62617369735f706f696e7473223a0000000000815260008351613c5c81601b850160208801613433565b721610113332b2afb932b1b4b834b2b73a111d1160691b601b918401918201528351613c8f81602e840160208801613433565b61227d60f01b602e9290910191820152603001949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613ce281601d850160208701613433565b91909101601d0192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613d229083018461345f565b9695505050505050565b600060208284031215613d3e57600080fd5b81516131b4816133a6565b600081613d5857613d5861390c565b50600019019056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122061e84593d10c60fdd68fd2e828407692c705e10e85c3f74e48a6c4a1b0bd92d364736f6c634300080d0033000000000000000000000000b4250f715995683c6ea5bc7c5e2cdf9b1601ba3f00000000000000000000000000000000000000000000000000000000000003e8

Deployed Bytecode

0x6080604052600436106103d95760003560e01c80637254d90c116101fd578063a355fd2911610118578063d5abeb01116100ab578063e985e9c51161007a578063e985e9c514610b4a578063f2fde38b14610b93578063facd92d414610bb3578063fb796e6c14610bd3578063fe8b456e14610bed57600080fd5b8063d5abeb0114610adf578063d78be71c14610af5578063da3ef23f14610b15578063e8a3d48514610b3557600080fd5b8063c3faf724116100e7578063c3faf72414610a6c578063c87b56dd14610a8c578063d2cab05614610aac578063d52c57e014610abf57600080fd5b8063a355fd29146109ec578063b7c0b8e814610a0c578063b88d4fde14610a2c578063bbaac02f14610a4c57600080fd5b80638c5668be11610190578063942958f41161015f578063942958f41461096b57806395d89b41146109a15780639970cc29146109b6578063a22cb465146109cc57600080fd5b80638c5668be146108ed5780638da5cb5b1461090d5780638dd07d0f1461092b5780639373f4321461094b57600080fd5b80637fc69f5a116101cc5780637fc69f5a14610877578063813779ef1461088d578063830b3a64146108ad5780638ac1e161146108cd57600080fd5b80637254d90c146107eb57806374dfc982146108015780637558be9e1461082157806378a923801461084157600080fd5b80633c136054116102f8578063518302271161028b5780636f8b44b01161025a5780636f8b44b014610756578063709411d21461077657806370a0823114610796578063715018a6146107b6578063719eaef8146107cb57600080fd5b806351830227146106d657806355f804b3146106f65780635a23dd99146107165780636352211e1461073657600080fd5b806342454db9116102c757806342454db91461065357806342842e0e1461066957806342966c6814610689578063438b6300146106a957600080fd5b80633c136054146105ea5780633ccfd60b1461060a5780634009920d1461061257806341f434341461063157600080fd5b8063189f3de1116103705780632a3f300c1161033f5780632a3f300c146105625780632a55205a146105825780632c4e9fc6146105c15780632db11544146105d757600080fd5b8063189f3de1146104fd5780631a09cfe21461051757806323b872dd1461052d5780632672c9021461054d57600080fd5b8063095ea7b3116103ac578063095ea7b31461048f5780630a594d41146104af5780630d9005ae146104d357806318160ddd146104e857600080fd5b806301ffc9a7146103de57806304634d8d1461041357806306fdde0314610435578063081812fc14610457575b600080fd5b3480156103ea57600080fd5b506103fe6103f93660046133bc565b610c0d565b60405190151581526020015b60405180910390f35b34801561041f57600080fd5b5061043361042e3660046133ee565b610c1e565b005b34801561044157600080fd5b5061044a610c34565b60405161040a919061348b565b34801561046357600080fd5b5061047761047236600461349e565b610cc6565b6040516001600160a01b03909116815260200161040a565b34801561049b57600080fd5b506104336104aa3660046134b7565b610d0a565b3480156104bb57600080fd5b506104c560155481565b60405190815260200161040a565b3480156104df57600080fd5b506001546104c5565b3480156104f457600080fd5b506104c5610de8565b34801561050957600080fd5b50601b546103fe9060ff1681565b34801561052357600080fd5b506104c560125481565b34801561053957600080fd5b506104336105483660046134e3565b610df6565b34801561055957600080fd5b5061044a610edf565b34801561056e57600080fd5b5061043361057d366004613532565b610f6d565b34801561058e57600080fd5b506105a261059d36600461354f565b610f91565b604080516001600160a01b03909316835260208301919091520161040a565b3480156105cd57600080fd5b506104c5600f5481565b6104336105e536600461349e565b61103d565b3480156105f657600080fd5b50610433610605366004613532565b61123f565b610433611267565b34801561061e57600080fd5b50601b546103fe90610100900460ff1681565b34801561063d57600080fd5b506104776daaeb6d7670e522a718067333cd4e81565b34801561065f57600080fd5b506104c560105481565b34801561067557600080fd5b506104336106843660046134e3565b611372565b34801561069557600080fd5b506104336106a436600461349e565b611450565b3480156106b557600080fd5b506106c96106c4366004613571565b61145e565b60405161040a919061358e565b3480156106e257600080fd5b50601b546103fe9062010000900460ff1681565b34801561070257600080fd5b5061043361071136600461366f565b611581565b34801561072257600080fd5b506103fe610731366004613736565b61159c565b34801561074257600080fd5b5061047761075136600461349e565b6116c0565b34801561076257600080fd5b5061043361077136600461349e565b6116d2565b34801561078257600080fd5b5061043361079136600461349e565b611736565b3480156107a257600080fd5b506104c56107b1366004613571565b6117bf565b3480156107c257600080fd5b5061043361180d565b3480156107d757600080fd5b506104336107e636600461349e565b611821565b3480156107f757600080fd5b506104c560165481565b34801561080d57600080fd5b506104c561081c36600461349e565b61182e565b34801561082d57600080fd5b5061043361083c36600461349e565b611868565b34801561084d57600080fd5b506104c561085c366004613571565b6001600160a01b03166000908152601c602052604090205490565b34801561088357600080fd5b506104c560145481565b34801561089957600080fd5b506104336108a836600461349e565b611875565b3480156108b957600080fd5b506104776108c836600461349e565b611882565b3480156108d957600080fd5b506104336108e836600461349e565b6118e9565b3480156108f957600080fd5b5061043361090836600461349e565b6118fa565b34801561091957600080fd5b506000546001600160a01b0316610477565b34801561093757600080fd5b5061043361094636600461349e565b6119e2565b34801561095757600080fd5b50610433610966366004613571565b6119ef565b34801561097757600080fd5b506104c5610986366004613571565b6001600160a01b03166000908152601d602052604090205490565b3480156109ad57600080fd5b5061044a611a19565b3480156109c257600080fd5b506104c560115481565b3480156109d857600080fd5b506104336109e7366004613785565b611a28565b3480156109f857600080fd5b50610433610a07366004613532565b611afc565b348015610a1857600080fd5b50610433610a27366004613532565b611b1e565b348015610a3857600080fd5b50610433610a473660046137b3565b611b39565b348015610a5857600080fd5b50610433610a6736600461366f565b611c25565b348015610a7857600080fd5b50610433610a87366004613532565b611c40565b348015610a9857600080fd5b5061044a610aa736600461349e565b611c5b565b610433610aba366004613832565b611e36565b348015610acb57600080fd5b50610433610ada366004613862565b612096565b348015610aeb57600080fd5b506104c560135481565b348015610b0157600080fd5b50610433610b1036600461349e565b6120db565b348015610b2157600080fd5b50610433610b3036600461366f565b6120e8565b348015610b4157600080fd5b5061044a612103565b348015610b5657600080fd5b506103fe610b65366004613887565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b348015610b9f57600080fd5b50610433610bae366004613571565b612112565b348015610bbf57600080fd5b50610433610bce366004613532565b612188565b348015610bdf57600080fd5b50600e546103fe9060ff1681565b348015610bf957600080fd5b50610433610c0836600461349e565b6121ae565b6000610c18826121bb565b92915050565b610c266121e0565b610c30828261223a565b5050565b606060038054610c43906138b5565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6f906138b5565b8015610cbc5780601f10610c9157610100808354040283529160200191610cbc565b820191906000526020600020905b815481529060010190602001808311610c9f57829003601f168201915b5050505050905090565b6000610cd182612337565b610cee576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b816daaeb6d7670e522a718067333cd4e3b15801590610d2b5750600e5460ff165b15610dd957604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610d88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dac91906138ef565b610dd957604051633b79c77360e21b81526001600160a01b03821660048201526024015b60405180910390fd5b610de38383612370565b505050565b600254600154036000190190565b826daaeb6d7670e522a718067333cd4e3b15801590610e175750600e5460ff165b15610ece57336001600160a01b03821603610e3c57610e378484846123f1565b610ed9565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610e8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eaf91906138ef565b610ece57604051633b79c77360e21b8152336004820152602401610dd0565b610ed98484846123f1565b50505050565b601a8054610eec906138b5565b80601f0160208091040260200160405190810160405280929190818152602001828054610f18906138b5565b8015610f655780601f10610f3a57610100808354040283529160200191610f65565b820191906000526020600020905b815481529060010190602001808311610f4857829003601f168201915b505050505081565b610f756121e0565b601b8054911515620100000262ff000019909216919091179055565b6000828152600d602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291611006575060408051808201909152600c546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090611025906001600160601b031687613922565b61102f9190613957565b915196919550909350505050565b60026009540361105f5760405162461bcd60e51b8152600401610dd09061396b565b6002600955601b54610100900460ff166110b25760405162461bcd60e51b81526020600482015260146024820152731c1d589b1a58d35a5b9d081a5cc814185d5cd95960621b6044820152606401610dd0565b8060125410156111125760405162461bcd60e51b815260206004820152602560248201527f7075626c69634d696e743a204f766572206d6178206d696e7473207065722077604482015264185b1b195d60da1b6064820152608401610dd0565b336000908152601d602052604090205461112d9082906139a2565b601254101561117e5760405162461bcd60e51b815260206004820152601b60248201527f596f752068617665206e6f207075626c69634d696e74206c65667400000000006044820152606401610dd0565b8060105461118c9190613922565b34146111d55760405162461bcd60e51b8152602060048201526018602482015277115512081d985b1d59481a5cc81b9bdd0818dbdc9c9958dd60421b6044820152606401610dd0565b6013546111e0610de8565b6111ea90836139a2565b11156112085760405162461bcd60e51b8152600401610dd0906139ba565b336000908152601d6020526040812080548392906112279084906139a2565b90915550611237905033826123fc565b506001600955565b6112476121e0565b601b80549115156401000000000264ff0000000019909216919091179055565b61126f6121e0565b6002600954036112915760405162461bcd60e51b8152600401610dd09061396b565b60026009556017546000906001600160a01b031615611307576017546040516001600160a01b03909116904790600081818185875af1925050503d80600081146112f7576040519150601f19603f3d011682016040523d82523d6000602084013e6112fc565b606091505b505080915050611368565b6000546001600160a01b03166001600160a01b03164760405160006040518083038185875af1925050503d806000811461135d576040519150601f19603f3d011682016040523d82523d6000602084013e611362565b606091505b50909150505b8061123757600080fd5b826daaeb6d7670e522a718067333cd4e3b158015906113935750600e5460ff165b1561144557336001600160a01b038216036113b357610e37848484612416565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611402573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142691906138ef565b61144557604051633b79c77360e21b8152336004820152602401610dd0565b610ed9848484612416565b61145b816001612431565b50565b6060600061146b836117bf565b90506000816001600160401b03811115611487576114876135d2565b6040519080825280602002602001820160405280156114b0578160200160208202803683370190505b509050600060015b600154811015611577576040516320c2ce9960e21b815260048101829052309063830b3a6490602401602060405180830381865afa1580156114fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152291906139e0565b6001600160a01b0316866001600160a01b03160361156557808383611546816139fd565b94508151811061155857611558613a16565b6020026020010181815250505b8061156f816139fd565b9150506114b8565b5090949350505050565b6115896121e0565b8051610c3090601990602084019061330d565b6040516bffffffffffffffffffffffff19606084901b166020820152600090819060340160405160208183030381529060405280519060200120905060005b83518110156116b4578381815181106115f6576115f6613a16565b602002602001015182106116545783818151811061161657611616613a16565b602002602001015182604051602001611639929190918252602082015260400190565b604051602081830303815290604052805190602001206116a0565b8184828151811061166757611667613a16565b6020026020010151604051602001611689929190918252602082015260400190565b604051602081830303815290604052805190602001205b9150806116ac816139fd565b9150506115db565b50600b54149392505050565b60006116cb826125f3565b5192915050565b6116da6121e0565b806116e3610de8565b11156117315760405162461bcd60e51b815260206004820152601960248201527f4c6f776572207468616e205f63757272656e74496e6465782e000000000000006044820152606401610dd0565b601355565b61173f81612337565b61175b5760405162461bcd60e51b8152600401610dd090613a2c565b33611765826116c0565b6001600160a01b0316146117ae5760405162461bcd60e51b815260206004820152601060248201526f34b9b73a1037bbb732b9103a37b5b2b760811b6044820152606401610dd0565b6000908152601f6020526040812055565b60006001600160a01b0382166117e8576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b6118156121e0565b61181f6000612715565b565b6118296121e0565b601155565b600061183982612337565b6118555760405162461bcd60e51b8152600401610dd090613a2c565b506000908152601e602052604090205490565b6118706121e0565b601455565b61187d6121e0565b601255565b6040516331a9108f60e11b8152600481018290526000903090636352211e90602401602060405180830381865afa9250505080156118dd575060408051601f3d908101601f191682019092526118da918101906139e0565b60015b610c1857506000919050565b6118f16121e0565b61145b81600b55565b61190381612337565b61191f5760405162461bcd60e51b8152600401610dd090613a2c565b33611929826116c0565b6001600160a01b0316146119725760405162461bcd60e51b815260206004820152601060248201526f34b9b73a1037bbb732b9103a37b5b2b760811b6044820152606401610dd0565b601b5462010000900460ff161561145b57601b546301000000900460ff16156119b15760006119a082612765565b6000838152601f6020526040902055505b601b54640100000000900460ff161561145b5760006119cf826127ce565b6000838152601f60205260409020555050565b6119ea6121e0565b600f55565b6119f76121e0565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b606060048054610c43906138b5565b816daaeb6d7670e522a718067333cd4e3b15801590611a495750600e5460ff165b15611af257604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611aa6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aca91906138ef565b611af257604051633b79c77360e21b81526001600160a01b0382166004820152602401610dd0565b610de38383612833565b611b046121e0565b601b80549115156101000261ff0019909216919091179055565b611b266121e0565b600e805460ff1916911515919091179055565b836daaeb6d7670e522a718067333cd4e3b15801590611b5a5750600e5460ff165b15611c1257336001600160a01b03821603611b8057611b7b858585856128c8565b611c1e565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611bcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf391906138ef565b611c1257604051633b79c77360e21b8152336004820152602401610dd0565b611c1e858585856128c8565b5050505050565b611c2d6121e0565b8051610c3090601890602084019061330d565b611c486121e0565b601b805460ff1916911515919091179055565b6060611c6682612337565b611c825760405162461bcd60e51b8152600401610dd090613a2c565b601b5462010000900460ff1615611da4576000828152601f60205260408120541315611cfc57611cb061290c565b6000838152601f6020526040902054611cc89061291b565b611cd18461291b565b601a604051602001611ce69493929190613afc565b6040516020818303038152906040529050919050565b601b546301000000900460ff1615611d61576000611d1983612765565b9050611d2361290c565b611d2c8261291b565b611d358561291b565b601a604051602001611d4a9493929190613afc565b604051602081830303815290604052915050919050565b601b54640100000000900460ff1615611d7f576000611d19836127ce565b611d8761290c565b611d908361291b565b601a604051602001611ce693929190613b5a565b60188054611db1906138b5565b80601f0160208091040260200160405190810160405280929190818152602001828054611ddd906138b5565b8015611e2a5780601f10611dff57610100808354040283529160200191611e2a565b820191906000526020600020905b815481529060010190602001808311611e0d57829003601f168201915b50505050509050919050565b600260095403611e585760405162461bcd60e51b8152600401610dd09061396b565b6002600955601b5460ff16611eaf5760405162461bcd60e51b815260206004820152601760248201527f77686974656c6973744d696e74206973205061757365640000000000000000006044820152606401610dd0565b611eb9338261159c565b611f055760405162461bcd60e51b815260206004820152601860248201527f596f7520617265206e6f742077686974656c69737465642100000000000000006044820152606401610dd0565b816011541015611f685760405162461bcd60e51b815260206004820152602860248201527f77686974656c6973744d696e743a204f766572206d6178206d696e74732070656044820152671c881dd85b1b195d60c21b6064820152608401610dd0565b336000908152601c6020526040902054611f839083906139a2565b6011541015611fd45760405162461bcd60e51b815260206004820152601e60248201527f596f752068617665206e6f2077686974656c6973744d696e74206c65667400006044820152606401610dd0565b81600f54611fe29190613922565b341461202b5760405162461bcd60e51b8152602060048201526018602482015277115512081d985b1d59481a5cc81b9bdd0818dbdc9c9958dd60421b6044820152606401610dd0565b601354612036610de8565b61204090846139a2565b111561205e5760405162461bcd60e51b8152600401610dd0906139ba565b336000908152601c60205260408120805484929061207d9084906139a2565b9091555061208d905033836123fc565b50506001600955565b61209e6121e0565b6013546120a9610de8565b6120b390846139a2565b11156120d15760405162461bcd60e51b8152600401610dd0906139ba565b610c3081836123fc565b6120e36121e0565b601055565b6120f06121e0565b8051610c3090601a90602084019061330d565b606061210d612a1b565b905090565b61211a6121e0565b6001600160a01b03811661217f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610dd0565b61145b81612715565b6121906121e0565b601b805491151563010000000263ff00000019909216919091179055565b6121b66121e0565b601655565b60006001600160e01b0319821663152a902d60e11b1480610c185750610c1882612a9b565b6000546001600160a01b0316331461181f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dd0565b6127106001600160601b03821611156122a85760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610dd0565b6001600160a01b0382166122fe5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610dd0565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600c55565b60008160011115801561234b575060015482105b8015610c18575050600090815260056020526040902054600160e01b900460ff161590565b600061237b826116c0565b9050806001600160a01b0316836001600160a01b0316036123af5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216146123e6576123c98133610b65565b6123e6576040516367d9dca160e11b815260040160405180910390fd5b610de3838383612aeb565b610de3838383612b47565b610c30828260405180602001604052806000815250612d2d565b610de383838360405180602001604052806000815250611b39565b600061243c836125f3565b805190915082156124a2576000336001600160a01b038316148061246557506124658233610b65565b8061248057503361247586610cc6565b6001600160a01b0316145b9050806124a057604051632ce44b5f60e11b815260040160405180910390fd5b505b6124b0816000866001612edc565b6124bc60008583612aeb565b6001600160a01b0380821660008181526006602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526005909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b1785559189018084529220805491949091166125ba5760015482146125ba57805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b03841690600080516020613da1833981519152908390a450506002805460010190555050565b604080516060810182526000808252602082018190529181019190915281806001116126fc576001548110156126fc57600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906126fa5780516001600160a01b031615612691579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156126f5579392505050565b612691565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600061277082612337565b61278c5760405162461bcd60e51b8152600401610dd090613a2c565b6000612797836116c0565b905060006127a4826117bf565b90506000601554826127b69190613b8c565b905060145481126127c657506014545b949350505050565b60006127d982612337565b6127f55760405162461bcd60e51b8152600401610dd090613a2c565b6016546000838152601e60205260408120549091906128149042613bba565b61281e9190613b8c565b90506014548112610c18575060145492915050565b336001600160a01b0383160361285c5760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6128d3848484612b47565b6001600160a01b0383163b15610ed9576128ef84848484612f2e565b610ed9576040516368d2bf6b60e11b815260040160405180910390fd5b606060198054610c43906138b5565b6060816000036129425750506040805180820190915260018152600360fc1b602082015290565b8160005b811561296c5780612956816139fd565b91506129659050600a83613957565b9150612946565b6000816001600160401b03811115612986576129866135d2565b6040519080825280601f01601f1916602001820160405280156129b0576020820181803683370190505b5090505b84156127c6576129c5600183613bf9565b91506129d2600a86613c10565b6129dd9060306139a2565b60f81b8183815181106129f2576129f2613a16565b60200101906001600160f81b031916908160001a905350612a14600a86613957565b94506129b4565b6060600080612a2c81612710610f91565b91509150612a75612a3c8261291b565b612a50846001600160a01b03166014613019565b604051602001612a61929190613c24565b6040516020818303038152906040526131bb565b604051602001612a859190613caa565b6040516020818303038152906040529250505090565b60006001600160e01b031982166380ac58cd60e01b1480612acc57506001600160e01b03198216635b5e139f60e01b145b80610c1857506301ffc9a760e01b6001600160e01b0319831614610c18565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000612b52826125f3565b9050836001600160a01b031681600001516001600160a01b031614612b895760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480612ba75750612ba78533610b65565b80612bc2575033612bb784610cc6565b6001600160a01b0316145b905080612be257604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416612c0957604051633a954ecd60e21b815260040160405180910390fd5b612c168585856001612edc565b612c2260008487612aeb565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116612cf6576001548214612cf657805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b0316600080516020613da183398151915260405160405180910390a4611c1e565b6001546001600160a01b038416612d5657604051622e076360e81b815260040160405180910390fd5b82600003612d775760405163b562e8dd60e01b815260040160405180910390fd5b612d846000858386612edc565b6001600160a01b038416600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600590925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15612e9a575b60405182906001600160a01b03881690600090600080516020613da1833981519152908290a4612e636000878480600101955087612f2e565b612e80576040516368d2bf6b60e11b815260040160405180910390fd5b808210612e2a578260015414612e9557600080fd5b612ecd565b5b6040516001830192906001600160a01b03881690600090600080516020613da1833981519152908290a4808210612e9b575b50600155610ed9600085838684565b6000828152601e602052604081204290558290612ef983836139a2565b90505b42601e600084612f0b816139fd565b9550815260200190815260200160002081905550808210612efc57505050505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612f63903390899088908890600401613cef565b6020604051808303816000875af1925050508015612f9e575060408051601f3d908101601f19168201909252612f9b91810190613d2c565b60015b612ffc573d808015612fcc576040519150601f19603f3d011682016040523d82523d6000602084013e612fd1565b606091505b508051600003612ff4576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b60606000613028836002613922565b6130339060026139a2565b6001600160401b0381111561304a5761304a6135d2565b6040519080825280601f01601f191660200182016040528015613074576020820181803683370190505b509050600360fc1b8160008151811061308f5761308f613a16565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106130be576130be613a16565b60200101906001600160f81b031916908160001a90535060006130e2846002613922565b6130ed9060016139a2565b90505b6001811115613165576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061312157613121613a16565b1a60f81b82828151811061313757613137613a16565b60200101906001600160f81b031916908160001a90535060049490941c9361315e81613d49565b90506130f0565b5083156131b45760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610dd0565b9392505050565b606081516000036131da57505060408051602081019091526000815290565b6000604051806060016040528060408152602001613d61604091399050600060038451600261320991906139a2565b6132139190613957565b61321e906004613922565b6001600160401b03811115613235576132356135d2565b6040519080825280601f01601f19166020018201604052801561325f576020820181803683370190505b509050600182016020820185865187015b808210156132cb576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250613270565b50506003865106600181146132e757600281146132fa57613302565b603d6001830353603d6002830353613302565b603d60018303535b509195945050505050565b828054613319906138b5565b90600052602060002090601f01602090048101928261333b5760008555613381565b82601f1061335457805160ff1916838001178555613381565b82800160010185558215613381579182015b82811115613381578251825591602001919060010190613366565b5061338d929150613391565b5090565b5b8082111561338d5760008155600101613392565b6001600160e01b03198116811461145b57600080fd5b6000602082840312156133ce57600080fd5b81356131b4816133a6565b6001600160a01b038116811461145b57600080fd5b6000806040838503121561340157600080fd5b823561340c816133d9565b915060208301356001600160601b038116811461342857600080fd5b809150509250929050565b60005b8381101561344e578181015183820152602001613436565b83811115610ed95750506000910152565b60008151808452613477816020860160208601613433565b601f01601f19169290920160200192915050565b6020815260006131b4602083018461345f565b6000602082840312156134b057600080fd5b5035919050565b600080604083850312156134ca57600080fd5b82356134d5816133d9565b946020939093013593505050565b6000806000606084860312156134f857600080fd5b8335613503816133d9565b92506020840135613513816133d9565b929592945050506040919091013590565b801515811461145b57600080fd5b60006020828403121561354457600080fd5b81356131b481613524565b6000806040838503121561356257600080fd5b50508035926020909101359150565b60006020828403121561358357600080fd5b81356131b4816133d9565b6020808252825182820181905260009190848201906040850190845b818110156135c6578351835292840192918401916001016135aa565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613610576136106135d2565b604052919050565b60006001600160401b03831115613631576136316135d2565b613644601f8401601f19166020016135e8565b905082815283838301111561365857600080fd5b828260208301376000602084830101529392505050565b60006020828403121561368157600080fd5b81356001600160401b0381111561369757600080fd5b8201601f810184136136a857600080fd5b6127c684823560208401613618565b600082601f8301126136c857600080fd5b813560206001600160401b038211156136e3576136e36135d2565b8160051b6136f28282016135e8565b928352848101820192828101908785111561370c57600080fd5b83870192505b8483101561372b57823582529183019190830190613712565b979650505050505050565b6000806040838503121561374957600080fd5b8235613754816133d9565b915060208301356001600160401b0381111561376f57600080fd5b61377b858286016136b7565b9150509250929050565b6000806040838503121561379857600080fd5b82356137a3816133d9565b9150602083013561342881613524565b600080600080608085870312156137c957600080fd5b84356137d4816133d9565b935060208501356137e4816133d9565b92506040850135915060608501356001600160401b0381111561380657600080fd5b8501601f8101871361381757600080fd5b61382687823560208401613618565b91505092959194509250565b6000806040838503121561384557600080fd5b8235915060208301356001600160401b0381111561376f57600080fd5b6000806040838503121561387557600080fd5b823591506020830135613428816133d9565b6000806040838503121561389a57600080fd5b82356138a5816133d9565b91506020830135613428816133d9565b600181811c908216806138c957607f821691505b6020821081036138e957634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561390157600080fd5b81516131b481613524565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561393c5761393c61390c565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261396657613966613941565b500490565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600082198211156139b5576139b561390c565b500190565b6020808252600c908201526b4e6f206d6f7265204e46547360a01b604082015260600190565b6000602082840312156139f257600080fd5b81516131b4816133d9565b600060018201613a0f57613a0f61390c565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6020808252601f908201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00604082015260600190565b8054600090600181811c9080831680613a7d57607f831692505b60208084108203613a9e57634e487b7160e01b600052602260045260246000fd5b818015613ab25760018114613ac357613af0565b60ff19861689528489019650613af0565b60008881526020902060005b86811015613ae85781548b820152908501908301613acf565b505084890196505b50505050505092915050565b60008551613b0e818460208a01613433565b855190830190613b22818360208a01613433565b602f60f81b91019081528451613b3f816001840160208901613433565b613b4e60018284010186613a63565b98975050505050505050565b60008451613b6c818460208901613433565b845190830190613b80818360208901613433565b61372b81830186613a63565b600082613b9b57613b9b613941565b600160ff1b821460001984141615613bb557613bb561390c565b500590565b60008083128015600160ff1b850184121615613bd857613bd861390c565b6001600160ff1b0384018313811615613bf357613bf361390c565b50500390565b600082821015613c0b57613c0b61390c565b500390565b600082613c1f57613c1f613941565b500690565b7f7b2273656c6c65725f6665655f62617369735f706f696e7473223a0000000000815260008351613c5c81601b850160208801613433565b721610113332b2afb932b1b4b834b2b73a111d1160691b601b918401918201528351613c8f81602e840160208801613433565b61227d60f01b602e9290910191820152603001949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613ce281601d850160208701613433565b91909101601d0192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613d229083018461345f565b9695505050505050565b600060208284031215613d3e57600080fd5b81516131b4816133a6565b600081613d5857613d5861390c565b50600019019056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122061e84593d10c60fdd68fd2e828407692c705e10e85c3f74e48a6c4a1b0bd92d364736f6c634300080d0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000b4250f715995683c6ea5bc7c5e2cdf9b1601ba3f00000000000000000000000000000000000000000000000000000000000003e8

-----Decoded View---------------
Arg [0] : _royaltyReceiver (address): 0xB4250F715995683c6EA5BC7c5e2CDF9b1601ba3f
Arg [1] : _royaltyFraction (uint96): 1000

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000b4250f715995683c6ea5bc7c5e2cdf9b1601ba3f
Arg [1] : 00000000000000000000000000000000000000000000000000000000000003e8


Deployed Bytecode Sourcemap

65757:13135:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67312:165;;;;;;;;;;-1:-1:-1;67312:165:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;67312:165:0;;;;;;;;67137:154;;;;;;;;;;-1:-1:-1;67137:154:0;;;;;:::i;:::-;;:::i;:::-;;40869:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;42381:204::-;;;;;;;;;;-1:-1:-1;42381:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2268:32:1;;;2250:51;;2238:2;2223:18;42381:204:0;2104:203:1;77643:157:0;;;;;;;;;;-1:-1:-1;77643:157:0;;;;;:::i;:::-;;:::i;66122:22::-;;;;;;;;;;;;;;;;;;;2778:25:1;;;2766:2;2751:18;66122:22:0;2632:177:1;70689:99:0;;;;;;;;;;-1:-1:-1;70769:13:0;;70689:99;;36994:312;;;;;;;;;;;;;:::i;66372:27::-;;;;;;;;;;-1:-1:-1;66372:27:0;;;;;;;;66013:32;;;;;;;;;;;;;;;;77808:163;;;;;;;;;;-1:-1:-1;77808:163:0;;;;;:::i;:::-;;:::i;66316:38::-;;;;;;;;;;;;;:::i;68867:107::-;;;;;;;;;;-1:-1:-1;68867:107:0;;;;;:::i;:::-;;:::i;28905:442::-;;;;;;;;;;-1:-1:-1;28905:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4089:32:1;;;4071:51;;4153:2;4138:18;;4131:34;;;;4044:18;28905:442:0;3897:274:1;65888:39:0;;;;;;;;;;;;;;;;74956:544;;;;;;:::i;:::-;;:::i;69287:121::-;;;;;;;;;;-1:-1:-1;69287:121:0;;;;;:::i;:::-;;:::i;75655:661::-;;;:::i;66404:31::-;;;;;;;;;;-1:-1:-1;66404:31:0;;;;;;;;;;;62069:143;;;;;;;;;;;;62169:42;62069:143;;65932:39;;;;;;;;;;;;;;;;77979:171;;;;;;;;;;-1:-1:-1;77979:171:0;;;;;:::i;:::-;;:::i;75516:81::-;;;;;;;;;;-1:-1:-1;75516:81:0;;;;;:::i;:::-;;:::i;76359:475::-;;;;;;;;;;-1:-1:-1;76359:475:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;66440:28::-;;;;;;;;;;-1:-1:-1;66440:28:0;;;;;;;;;;;70840:100;;;;;;;;;;-1:-1:-1;70840:100:0;;;;;:::i;:::-;;:::i;12161:407::-;;;;;;;;;;-1:-1:-1;12161:407:0;;;;;:::i;:::-;;:::i;40677:125::-;;;;;;;;;;-1:-1:-1;40677:125:0;;;;;:::i;:::-;;:::i;68429:176::-;;;;;;;;;;-1:-1:-1;68429:176:0;;;;;:::i;:::-;;:::i;73779:225::-;;;;;;;;;;-1:-1:-1;73779:225:0;;;;;:::i;:::-;;:::i;38123:206::-;;;;;;;;;;-1:-1:-1;38123:206:0;;;;;:::i;:::-;;:::i;58408:103::-;;;;;;;;;;;;;:::i;69699:97::-;;;;;;;;;;-1:-1:-1;69699:97:0;;;;;:::i;:::-;;:::i;66156:23::-;;;;;;;;;;;;;;;;71219:189;;;;;;;;;;-1:-1:-1;71219:189:0;;;;;:::i;:::-;;:::i;69920:92::-;;;;;;;;;;-1:-1:-1;69920:92:0;;;;;:::i;:::-;;:::i;69440:114::-;;;;;;;;;;-1:-1:-1;69440:114:0;;;;;:::i;:::-;-1:-1:-1;;;;;69529:19:0;69507:7;69529:19;;;:9;:19;;;;;;;69440:114;66086:24;;;;;;;;;;;;;;;;69800:97;;;;;;;;;;-1:-1:-1;69800:97:0;;;;;:::i;:::-;;:::i;76897:243::-;;;;;;;;;;-1:-1:-1;76897:243:0;;;;;:::i;:::-;;:::i;70403:115::-;;;;;;;;;;-1:-1:-1;70403:115:0;;;;;:::i;:::-;;:::i;73261:496::-;;;;;;;;;;-1:-1:-1;73261:496:0;;;;;:::i;:::-;;:::i;57760:87::-;;;;;;;;;;-1:-1:-1;57806:7:0;57833:6;-1:-1:-1;;;;;57833:6:0;57760:87;;68629:100;;;;;;;;;;-1:-1:-1;68629:100:0;;;;;:::i;:::-;;:::i;68276:116::-;;;;;;;;;;-1:-1:-1;68276:116:0;;;;;:::i;:::-;;:::i;69558:114::-;;;;;;;;;;-1:-1:-1;69558:114:0;;;;;:::i;:::-;-1:-1:-1;;;;;69647:19:0;69625:7;69647:19;;;:9;:19;;;;;;;69558:114;41038:104;;;;;;;;;;;;;:::i;65976:32::-;;;;;;;;;;;;;;;;77459:176;;;;;;;;;;-1:-1:-1;77459:176:0;;;;;:::i;:::-;;:::i;70266:108::-;;;;;;;;;;-1:-1:-1;70266:108:0;;;;;:::i;:::-;;:::i;77332:119::-;;;;;;;;;;-1:-1:-1;77332:119:0;;;;;:::i;:::-;;:::i;78158:228::-;;;;;;;;;;-1:-1:-1;78158:228:0;;;;;:::i;:::-;;:::i;70559:98::-;;;;;;;;;;-1:-1:-1;70559:98:0;;;;;:::i;:::-;;:::i;70155:107::-;;;;;;;;;;-1:-1:-1;70155:107:0;;;;;:::i;:::-;;:::i;72219:1022::-;;;;;;;;;;-1:-1:-1;72219:1022:0;;;;;:::i;:::-;;:::i;74278:652::-;;;;;;:::i;:::-;;:::i;74061:195::-;;;;;;;;;;-1:-1:-1;74061:195:0;;;;;:::i;:::-;;:::i;66050:31::-;;;;;;;;;;;;;;;;68733:100;;;;;;;;;;-1:-1:-1;68733:100:0;;;;;:::i;:::-;;:::i;70948:128::-;;;;;;;;;;-1:-1:-1;70948:128:0;;;;;:::i;:::-;;:::i;67506:113::-;;;;;;;;;;;;;:::i;43015:164::-;;;;;;;;;;-1:-1:-1;43015:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;43136:25:0;;;43112:4;43136:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;43015:164;58666:201;;;;;;;;;;-1:-1:-1;58666:201:0;;;;;:::i;:::-;;:::i;69128:121::-;;;;;;;;;;-1:-1:-1;69128:121:0;;;;;:::i;:::-;;:::i;62017:43::-;;;;;;;;;;-1:-1:-1;62017:43:0;;;;;;;;70035:90;;;;;;;;;;-1:-1:-1;70035:90:0;;;;;:::i;:::-;;:::i;67312:165::-;67415:4;67435:36;67459:11;67435:23;:36::i;:::-;67428:43;67312:165;-1:-1:-1;;67312:165:0:o;67137:154::-;57646:13;:11;:13::i;:::-;67241:44:::1;67260:9;67271:13;67241:18;:44::i;:::-;67137:154:::0;;:::o;40869:100::-;40923:13;40956:5;40949:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40869:100;:::o;42381:204::-;42449:7;42474:16;42482:7;42474;:16::i;:::-;42469:64;;42499:34;;-1:-1:-1;;;42499:34:0;;;;;;;;;;;42469:64;-1:-1:-1;42553:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;42553:24:0;;42381:204::o;77643:157::-;77739:8;62169:42;64091:45;:49;;;;:77;;-1:-1:-1;64144:24:0;;;;64091:77;64087:253;;;64190:67;;-1:-1:-1;;;64190:67:0;;64241:4;64190:67;;;10893:34:1;-1:-1:-1;;;;;10963:15:1;;10943:18;;;10936:43;62169:42:0;;64190;;10828:18:1;;64190:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64185:144;;64285:28;;-1:-1:-1;;;64285:28:0;;-1:-1:-1;;;;;2268:32:1;;64285:28:0;;;2250:51:1;2223:18;;64285:28:0;;;;;;;;64185:144;77760:32:::1;77774:8;77784:7;77760:13;:32::i;:::-;77643:157:::0;;;:::o;36994:312::-;37257:12;;67070:1;37241:13;:28;-1:-1:-1;;37241:46:0;;36994:312::o;77808:163::-;77909:4;62169:42;63317:45;:49;;;;:77;;-1:-1:-1;63370:24:0;;;;63317:77;63313:567;;;63634:10;-1:-1:-1;;;;;63626:18:0;;;63622:85;;77926:37:::1;77945:4;77951:2;77955:7;77926:18;:37::i;:::-;63685:7:::0;;63622:85;63726:69;;-1:-1:-1;;;63726:69:0;;63777:4;63726:69;;;10893:34:1;63784:10:0;10943:18:1;;;10936:43;62169:42:0;;63726;;10828:18:1;;63726:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63721:148;;63823:30;;-1:-1:-1;;;63823:30:0;;63842:10;63823:30;;;2250:51:1;2223:18;;63823:30:0;2104:203:1;63721:148:0;77926:37:::1;77945:4;77951:2;77955:7;77926:18;:37::i;:::-;77808:163:::0;;;;:::o;66316:38::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;68867:107::-;57646:13;:11;:13::i;:::-;68942:8:::1;:26:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;68942:26:0;;::::1;::::0;;;::::1;::::0;;68867:107::o;28905:442::-;29002:7;29060:27;;;:17;:27;;;;;;;;29031:56;;;;;;;;;-1:-1:-1;;;;;29031:56:0;;;;;-1:-1:-1;;;29031:56:0;;;-1:-1:-1;;;;;29031:56:0;;;;;;;;29002:7;;29100:92;;-1:-1:-1;29151:29:0;;;;;;;;;29161:19;29151:29;-1:-1:-1;;;;;29151:29:0;;;;-1:-1:-1;;;29151:29:0;;-1:-1:-1;;;;;29151:29:0;;;;;29100:92;29242:23;;;;29204:21;;29713:5;;29229:36;;-1:-1:-1;;;;;29229:36:0;:10;:36;:::i;:::-;29228:58;;;;:::i;:::-;29307:16;;;;;-1:-1:-1;28905:442:0;;-1:-1:-1;;;;28905:442:0:o;74956:544::-;33153:1;33751:7;;:19;33743:63;;;;-1:-1:-1;;;33743:63:0;;;;;;;:::i;:::-;33153:1;33884:7;:18;75046:19:::1;::::0;::::1;::::0;::::1;;;75038:52;;;::::0;-1:-1:-1;;;75038:52:0;;12364:2:1;75038:52:0::1;::::0;::::1;12346:21:1::0;12403:2;12383:18;;;12376:30;-1:-1:-1;;;12422:18:1;;;12415:50;12482:18;;75038:52:0::1;12162:344:1::0;75038:52:0::1;75122:7;75105:13;;:24;;75097:74;;;::::0;-1:-1:-1;;;75097:74:0;;12713:2:1;75097:74:0::1;::::0;::::1;12695:21:1::0;12752:2;12732:18;;;12725:30;12791:34;12771:18;;;12764:62;-1:-1:-1;;;12842:18:1;;;12835:35;12887:19;;75097:74:0::1;12511:401:1::0;75097:74:0::1;75213:10;75203:21;::::0;;;:9:::1;:21;::::0;;;;;:31:::1;::::0;75227:7;;75203:31:::1;:::i;:::-;75186:13;;:48;;75178:88;;;::::0;-1:-1:-1;;;75178:88:0;;13252:2:1;75178:88:0::1;::::0;::::1;13234:21:1::0;13291:2;13271:18;;;13264:30;13330:29;13310:18;;;13303:57;13377:18;;75178:88:0::1;13050:351:1::0;75178:88:0::1;75308:7;75294:11;;:21;;;;:::i;:::-;75281:9;:34;75273:71;;;::::0;-1:-1:-1;;;75273:71:0;;13608:2:1;75273:71:0::1;::::0;::::1;13590:21:1::0;13647:2;13627:18;;;13620:30;-1:-1:-1;;;13666:18:1;;;13659:54;13730:18;;75273:71:0::1;13406:348:1::0;75273:71:0::1;75389:9;;75370:13;:11;:13::i;:::-;75360:23;::::0;:7;:23:::1;:::i;:::-;75359:40;;75351:65;;;;-1:-1:-1::0;;;75351:65:0::1;;;;;;;:::i;:::-;75435:10;75425:21;::::0;;;:9:::1;:21;::::0;;;;:32;;75450:7;;75425:21;:32:::1;::::0;75450:7;;75425:32:::1;:::i;:::-;::::0;;;-1:-1:-1;75464:30:0::1;::::0;-1:-1:-1;75474:10:0::1;75486:7:::0;75464:9:::1;:30::i;:::-;-1:-1:-1::0;33109:1:0;34063:7;:22;74956:544::o;69287:121::-;57646:13;:11;:13::i;:::-;69370:10:::1;:32:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;69370:32:0;;::::1;::::0;;;::::1;::::0;;69287:121::o;75655:661::-;57646:13;:11;:13::i;:::-;33153:1:::1;33751:7;;:19:::0;33743:63:::1;;;;-1:-1:-1::0;;;33743:63:0::1;;;;;;;:::i;:::-;33153:1;33884:7;:18:::0;75978:15:::2;::::0;75961:7:::2;::::0;-1:-1:-1;;;;;75978:15:0::2;:29:::0;75975:232:::2;;76059:15;::::0;76051:63:::2;::::0;-1:-1:-1;;;;;76059:15:0;;::::2;::::0;76088:21:::2;::::0;76051:63:::2;::::0;;;76088:21;76059:15;76051:63:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76042:72;;;;;75975:232;;;57806:7:::0;57833:6;-1:-1:-1;;;;;57833:6:0;-1:-1:-1;;;;;76144:21:0::2;76173;76144:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;76135:64:0;;-1:-1:-1;;75975:232:0::2;76221:2;76213:11;;;::::0;::::2;77979:171:::0;78084:4;62169:42;63317:45;:49;;;;:77;;-1:-1:-1;63370:24:0;;;;63317:77;63313:567;;;63634:10;-1:-1:-1;;;;;63626:18:0;;;63622:85;;78101:41:::1;78124:4;78130:2;78134:7;78101:22;:41::i;63622:85::-:0;63726:69;;-1:-1:-1;;;63726:69:0;;63777:4;63726:69;;;10893:34:1;63784:10:0;10943:18:1;;;10936:43;62169:42:0;;63726;;10828:18:1;;63726:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63721:148;;63823:30;;-1:-1:-1;;;63823:30:0;;63842:10;63823:30;;;2250:51:1;2223:18;;63823:30:0;2104:203:1;63721:148:0;78101:41:::1;78124:4;78130:2;78134:7;78101:22;:41::i;75516:81::-:0;75571:20;75577:7;75586:4;75571:5;:20::i;:::-;75516:81;:::o;76359:475::-;76431:16;76456:23;76482:19;76492:8;76482:9;:19::i;:::-;76456:45;;76508:25;76550:15;-1:-1:-1;;;;;76536:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76536:30:0;-1:-1:-1;76508:58:0;-1:-1:-1;76642:18:0;67070:1;76671:136;76709:13;;76705:1;:17;76671:136;;;76753:18;;-1:-1:-1;;;76753:18:0;;;;;2778:25:1;;;76753:4:0;;:15;;2751:18:1;;76753::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;76741:30:0;:8;-1:-1:-1;;;;;76741:30:0;;76738:61;;76798:1;76773:8;76782:12;;;;:::i;:::-;;;76773:22;;;;;;;;:::i;:::-;;;;;;:26;;;;;76738:61;76724:3;;;;:::i;:::-;;;;76671:136;;;-1:-1:-1;76820:8:0;;76359:475;-1:-1:-1;;;;76359:475:0:o;70840:100::-;57646:13;:11;:13::i;:::-;70914:20;;::::1;::::0;:13:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;12161:407::-:0;12291:26;;-1:-1:-1;;14987:2:1;14983:15;;;14979:53;12291:26:0;;;14967:66:1;12248:4:0;;;;15049:12:1;;12291:26:0;;;;;;;;;;;;12281:37;;;;;;12265:53;;12334:9;12329:192;12353:6;:13;12349:1;:17;12329:192;;;12404:6;12411:1;12404:9;;;;;;;;:::i;:::-;;;;;;;12396:5;:17;:113;;12491:6;12498:1;12491:9;;;;;;;;:::i;:::-;;;;;;;12502:5;12474:34;;;;;;;;15229:19:1;;;15273:2;15264:12;;15257:28;15310:2;15301:12;;15072:247;12474:34:0;;;;;;;;;;;;;12464:45;;;;;;12396:113;;;12443:5;12450:6;12457:1;12450:9;;;;;;;;:::i;:::-;;;;;;;12426:34;;;;;;;;15229:19:1;;;15273:2;15264:12;;15257:28;15310:2;15301:12;;15072:247;12426:34:0;;;;;;;;;;;;;12416:45;;;;;;12396:113;12388:121;-1:-1:-1;12368:3:0;;;;:::i;:::-;;;;12329:192;;;-1:-1:-1;12547:13:0;;12538:22;;12161:407;-1:-1:-1;;;12161:407:0:o;40677:125::-;40741:7;40768:21;40781:7;40768:12;:21::i;:::-;:26;;40677:125;-1:-1:-1;;40677:125:0:o;68429:176::-;57646:13;:11;:13::i;:::-;68530:10:::1;68513:13;:11;:13::i;:::-;:27;;68505:65;;;::::0;-1:-1:-1;;;68505:65:0;;15526:2:1;68505:65:0::1;::::0;::::1;15508:21:1::0;15565:2;15545:18;;;15538:30;15604:27;15584:18;;;15577:55;15649:18;;68505:65:0::1;15324:349:1::0;68505:65:0::1;68577:9;:22:::0;68429:176::o;73779:225::-;73849:17;73857:8;73849:7;:17::i;:::-;73841:61;;;;-1:-1:-1;;;73841:61:0;;;;;;;:::i;:::-;73938:10;73917:17;73925:8;73917:7;:17::i;:::-;-1:-1:-1;;;;;73917:31:0;;73909:60;;;;-1:-1:-1;;;73909:60:0;;16240:2:1;73909:60:0;;;16222:21:1;16279:2;16259:18;;;16252:30;-1:-1:-1;;;16298:18:1;;;16291:46;16354:18;;73909:60:0;16038:340:1;73909:60:0;73997:1;73976:18;;;:8;:18;;;;;:22;73779:225::o;38123:206::-;38187:7;-1:-1:-1;;;;;38211:19:0;;38207:60;;38239:28;;-1:-1:-1;;;38239:28:0;;;;;;;;;;;38207:60;-1:-1:-1;;;;;;38293:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;38293:27:0;;38123:206::o;58408:103::-;57646:13;:11;:13::i;:::-;58473:30:::1;58500:1;58473:18;:30::i;:::-;58408:103::o:0;69699:97::-;57646:13;:11;:13::i;:::-;69770::::1;:20:::0;69699:97::o;71219:189::-;71290:7;71314:17;71322:8;71314:7;:17::i;:::-;71306:61;;;;-1:-1:-1;;;71306:61:0;;;;;;;:::i;:::-;-1:-1:-1;71383:19:0;;;;:9;:19;;;;;;;71219:189::o;69920:92::-;57646:13;:11;:13::i;:::-;69990:9:::1;:16:::0;69920:92::o;69800:97::-;57646:13;:11;:13::i;:::-;69871::::1;:20:::0;69800:97::o;76897:243::-;76986:21;;-1:-1:-1;;;76986:21:0;;;;;2778:25:1;;;76966:7:0;;76986:4;;:12;;2751:18:1;;76986:21:0;;;;;;;;;;;;;;;;;;-1:-1:-1;76986:21:0;;;;;;;;-1:-1:-1;;76986:21:0;;;;;;;;;;;;:::i;:::-;;;76982:153;;-1:-1:-1;77102:1:0;;76897:243;-1:-1:-1;76897:243:0:o;70403:115::-;57646:13;:11;:13::i;:::-;70483:29:::1;70500:11;12118:13:::0;:27;12043:110;73261:496;73329:17;73337:8;73329:7;:17::i;:::-;73321:61;;;;-1:-1:-1;;;73321:61:0;;;;;;;:::i;:::-;73418:10;73397:17;73405:8;73397:7;:17::i;:::-;-1:-1:-1;;;;;73397:31:0;;73389:60;;;;-1:-1:-1;;;73389:60:0;;16240:2:1;73389:60:0;;;16222:21:1;16279:2;16259:18;;;16252:30;-1:-1:-1;;;16298:18:1;;;16291:46;16354:18;;73389:60:0;16038:340:1;73389:60:0;69077:8;;;;;;;73456:296;;;73487:10;;;;;;;73484:125;;;73513:15;73531:22;73544:8;73531:12;:22::i;:::-;73568:18;;;;:8;:18;;;;;:29;-1:-1:-1;73484:125:0;73622:10;;;;;;;73619:126;;;73648:15;73666:23;73680:8;73666:13;:23::i;:::-;73704:18;;;;:8;:18;;;;;:29;-1:-1:-1;73261:496:0;:::o;68629:100::-;57646:13;:11;:13::i;:::-;68701:11:::1;:22:::0;68629:100::o;68276:116::-;57646:13;:11;:13::i;:::-;68353:15:::1;:33:::0;;-1:-1:-1;;;;;;68353:33:0::1;-1:-1:-1::0;;;;;68353:33:0;;;::::1;::::0;;;::::1;::::0;;68276:116::o;41038:104::-;41094:13;41127:7;41120:14;;;;;:::i;77459:176::-;77563:8;62169:42;64091:45;:49;;;;:77;;-1:-1:-1;64144:24:0;;;;64091:77;64087:253;;;64190:67;;-1:-1:-1;;;64190:67:0;;64241:4;64190:67;;;10893:34:1;-1:-1:-1;;;;;10963:15:1;;10943:18;;;10936:43;62169:42:0;;64190;;10828:18:1;;64190:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64185:144;;64285:28;;-1:-1:-1;;;64285:28:0;;-1:-1:-1;;;;;2268:32:1;;64285:28:0;;;2250:51:1;2223:18;;64285:28:0;2104:203:1;64185:144:0;77584:43:::1;77608:8;77618;77584:23;:43::i;70266:108::-:0;57646:13;:11;:13::i;:::-;70341:19:::1;:27:::0;;;::::1;;;;-1:-1:-1::0;;70341:27:0;;::::1;::::0;;;::::1;::::0;;70266:108::o;77332:119::-;57646:13;:11;:13::i;:::-;77411:24:::1;:32:::0;;-1:-1:-1;;77411:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;77332:119::o;78158:228::-;78309:4;62169:42;63317:45;:49;;;;:77;;-1:-1:-1;63370:24:0;;;;63317:77;63313:567;;;63634:10;-1:-1:-1;;;;;63626:18:0;;;63622:85;;78331:47:::1;78354:4;78360:2;78364:7;78373:4;78331:22;:47::i;:::-;63685:7:::0;;63622:85;63726:69;;-1:-1:-1;;;63726:69:0;;63777:4;63726:69;;;10893:34:1;63784:10:0;10943:18:1;;;10936:43;62169:42:0;;63726;;10828:18:1;;63726:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63721:148;;63823:30;;-1:-1:-1;;;63823:30:0;;63842:10;63823:30;;;2250:51:1;2223:18;;63823:30:0;2104:203:1;63721:148:0;78331:47:::1;78354:4;78360:2;78364:7;78373:4;78331:22;:47::i;:::-;78158:228:::0;;;;;:::o;70559:98::-;57646:13;:11;:13::i;:::-;70635:16;;::::1;::::0;:9:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;70155:107::-:0;57646:13;:11;:13::i;:::-;70233:15:::1;:23:::0;;-1:-1:-1;;70233:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;70155:107::o;72219:1022::-;72293:13;72323:17;72331:8;72323:7;:17::i;:::-;72315:61;;;;-1:-1:-1;;;72315:61:0;;;;;;;:::i;:::-;69077:8;;;;;;;72383:830;;;72435:1;72414:18;;;:8;:18;;;;;;:22;72411:201;;;72483:17;:15;:17::i;:::-;72527:18;;;;:8;:18;;;;;;72502:45;;:16;:45::i;:::-;72554:28;72572:8;72554:16;:28::i;:::-;72584:14;72466:133;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;72452:148;;72219:1022;;;:::o;72411:201::-;72625:10;;;;;;;72622:234;;;72651:15;72669:22;72682:8;72669:12;:22::i;:::-;72651:40;;72737:17;:15;:17::i;:::-;72756:35;72781:8;72756:16;:35::i;:::-;72798:28;72816:8;72798:16;:28::i;:::-;72828:14;72720:123;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;72706:138;;;72219:1022;;;:::o;72622:234::-;72869:10;;;;;;;72866:235;;;72895:15;72913:23;72927:8;72913:13;:23::i;72866:235::-;73142:17;:15;:17::i;:::-;73161:26;73178:8;73161:16;:26::i;:::-;73189:14;73125:79;;;;;;;;;;:::i;72383:830::-;73226:9;73219:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72219:1022;;;:::o;74278:652::-;33153:1;33751:7;;:19;33743:63;;;;-1:-1:-1;;;33743:63:0;;;;;;;:::i;:::-;33153:1;33884:7;:18;74396:15:::1;::::0;::::1;;74388:51;;;::::0;-1:-1:-1;;;74388:51:0;;19137:2:1;74388:51:0::1;::::0;::::1;19119:21:1::0;19176:2;19156:18;;;19149:30;19215:25;19195:18;;;19188:53;19258:18;;74388:51:0::1;18935:347:1::0;74388:51:0::1;74454:33;74468:10;74480:6;74454:13;:33::i;:::-;74446:70;;;::::0;-1:-1:-1;;;74446:70:0;;19489:2:1;74446:70:0::1;::::0;::::1;19471:21:1::0;19528:2;19508:18;;;19501:30;19567:26;19547:18;;;19540:54;19611:18;;74446:70:0::1;19287:348:1::0;74446:70:0::1;74548:7;74531:13;;:24;;74523:77;;;::::0;-1:-1:-1;;;74523:77:0;;19842:2:1;74523:77:0::1;::::0;::::1;19824:21:1::0;19881:2;19861:18;;;19854:30;19920:34;19900:18;;;19893:62;-1:-1:-1;;;19971:18:1;;;19964:38;20019:19;;74523:77:0::1;19640:404:1::0;74523:77:0::1;74642:10;74632:21;::::0;;;:9:::1;:21;::::0;;;;;:31:::1;::::0;74656:7;;74632:31:::1;:::i;:::-;74615:13;;:48;;74607:91;;;::::0;-1:-1:-1;;;74607:91:0;;20251:2:1;74607:91:0::1;::::0;::::1;20233:21:1::0;20290:2;20270:18;;;20263:30;20329:32;20309:18;;;20302:60;20379:18;;74607:91:0::1;20049:354:1::0;74607:91:0::1;74740:7;74726:11;;:21;;;;:::i;:::-;74713:9;:34;74705:71;;;::::0;-1:-1:-1;;;74705:71:0;;13608:2:1;74705:71:0::1;::::0;::::1;13590:21:1::0;13647:2;13627:18;;;13620:30;-1:-1:-1;;;13666:18:1;;;13659:54;13730:18;;74705:71:0::1;13406:348:1::0;74705:71:0::1;74821:9;;74802:13;:11;:13::i;:::-;74792:23;::::0;:7;:23:::1;:::i;:::-;74791:40;;74783:65;;;;-1:-1:-1::0;;;74783:65:0::1;;;;;;;:::i;:::-;74865:10;74855:21;::::0;;;:9:::1;:21;::::0;;;;:32;;74880:7;;74855:21;:32:::1;::::0;74880:7;;74855:32:::1;:::i;:::-;::::0;;;-1:-1:-1;74894:30:0::1;::::0;-1:-1:-1;74904:10:0::1;74916:7:::0;74894:9:::1;:30::i;:::-;-1:-1:-1::0;;33109:1:0;34063:7;:22;74278:652::o;74061:195::-;57646:13;:11;:13::i;:::-;74188:9:::1;;74169:13;:11;:13::i;:::-;74159:23;::::0;:7;:23:::1;:::i;:::-;74158:40;;74150:65;;;;-1:-1:-1::0;;;74150:65:0::1;;;;;;;:::i;:::-;74222:28;74232:8;74242:7;74222:9;:28::i;68733:100::-:0;57646:13;:11;:13::i;:::-;68805:11:::1;:22:::0;68733:100::o;70948:128::-;57646:13;:11;:13::i;:::-;71036:34;;::::1;::::0;:14:::1;::::0;:34:::1;::::0;::::1;::::0;::::1;:::i;67506:113::-:0;67560:13;67593:20;:18;:20::i;:::-;67586:27;;67506:113;:::o;58666:201::-;57646:13;:11;:13::i;:::-;-1:-1:-1;;;;;58755:22:0;::::1;58747:73;;;::::0;-1:-1:-1;;;58747:73:0;;20610:2:1;58747:73:0::1;::::0;::::1;20592:21:1::0;20649:2;20629:18;;;20622:30;20688:34;20668:18;;;20661:62;-1:-1:-1;;;20739:18:1;;;20732:36;20785:19;;58747:73:0::1;20408:402:1::0;58747:73:0::1;58831:28;58850:8;58831:18;:28::i;69128:121::-:0;57646:13;:11;:13::i;:::-;69211:10:::1;:32:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;69211:32:0;;::::1;::::0;;;::::1;::::0;;69128:121::o;70035:90::-;57646:13;:11;:13::i;:::-;70104:8:::1;:15:::0;70035:90::o;28635:215::-;28737:4;-1:-1:-1;;;;;;28761:41:0;;-1:-1:-1;;;28761:41:0;;:81;;;28806:36;28830:11;28806:23;:36::i;57925:132::-;57806:7;57833:6;-1:-1:-1;;;;;57833:6:0;34809:10;57989:23;57981:68;;;;-1:-1:-1;;;57981:68:0;;21017:2:1;57981:68:0;;;20999:21:1;;;21036:18;;;21029:30;21095:34;21075:18;;;21068:62;21147:18;;57981:68:0;20815:356:1;29997:332:0;29713:5;-1:-1:-1;;;;;30100:33:0;;;;30092:88;;;;-1:-1:-1;;;30092:88:0;;21378:2:1;30092:88:0;;;21360:21:1;21417:2;21397:18;;;21390:30;21456:34;21436:18;;;21429:62;-1:-1:-1;;;21507:18:1;;;21500:40;21557:19;;30092:88:0;21176:406:1;30092:88:0;-1:-1:-1;;;;;30199:22:0;;30191:60;;;;-1:-1:-1;;;30191:60:0;;21789:2:1;30191:60:0;;;21771:21:1;21828:2;21808:18;;;21801:30;21867:27;21847:18;;;21840:55;21912:18;;30191:60:0;21587:349:1;30191:60:0;30286:35;;;;;;;;;-1:-1:-1;;;;;30286:35:0;;;;;;-1:-1:-1;;;;;30286:35:0;;;;;;;;;;-1:-1:-1;;;30264:57:0;;;;:19;:57;29997:332::o;44368:174::-;44425:4;44468:7;67070:1;44449:26;;:53;;;;;44489:13;;44479:7;:23;44449:53;:85;;;;-1:-1:-1;;44507:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;44507:27:0;;;;44506:28;;44368:174::o;41935:380::-;42016:13;42032:24;42048:7;42032:15;:24::i;:::-;42016:40;;42077:5;-1:-1:-1;;;;;42071:11:0;:2;-1:-1:-1;;;;;42071:11:0;;42067:48;;42091:24;;-1:-1:-1;;;42091:24:0;;;;;;;;;;;42067:48;34809:10;-1:-1:-1;;;;;42132:21:0;;;42128:139;;42159:37;42176:5;34809:10;43015:164;:::i;42159:37::-;42155:112;;42220:35;;-1:-1:-1;;;42220:35:0;;;;;;;;;;;42155:112;42279:28;42288:2;42292:7;42301:5;42279:8;:28::i;43246:170::-;43380:28;43390:4;43396:2;43400:7;43380:9;:28::i;44626:104::-;44695:27;44705:2;44709:8;44695:27;;;;;;;;;;;;:9;:27::i;43487:185::-;43625:39;43642:4;43648:2;43652:7;43625:39;;;;;;;;;;;;:16;:39::i;51064:2408::-;51144:35;51182:21;51195:7;51182:12;:21::i;:::-;51231:18;;51144:59;;-1:-1:-1;51262:290:0;;;;51296:22;34809:10;-1:-1:-1;;;;;51322:20:0;;;;:77;;-1:-1:-1;51363:36:0;51380:4;34809:10;43015:164;:::i;51363:36::-;51322:134;;;-1:-1:-1;34809:10:0;51420:20;51432:7;51420:11;:20::i;:::-;-1:-1:-1;;;;;51420:36:0;;51322:134;51296:161;;51479:17;51474:66;;51505:35;;-1:-1:-1;;;51505:35:0;;;;;;;;;;;51474:66;51281:271;51262:290;51564:51;51586:4;51600:1;51604:7;51613:1;51564:21;:51::i;:::-;51680:35;51697:1;51701:7;51710:4;51680:8;:35::i;:::-;-1:-1:-1;;;;;52045:18:0;;;52011:31;52045:18;;;:12;:18;;;;;;;;52078:24;;-1:-1:-1;;;;;;;;;;52078:24:0;;;;;;;;;-1:-1:-1;;52078:24:0;;;;52117:29;;;;;52101:1;52117:29;;;;;;;;-1:-1:-1;;52117:29:0;;;;;;;;;;52279:20;;;:11;:20;;;;;;52314;;-1:-1:-1;;;;52382:15:0;52349:49;;;-1:-1:-1;;;52349:49:0;-1:-1:-1;;;;;;52349:49:0;;;;;;;;;;52413:22;-1:-1:-1;;;52413:22:0;;;52705:11;;;52765:24;;;;;52808:13;;52045:18;;52765:24;;52808:13;52804:384;;53018:13;;53003:11;:28;52999:174;;53056:20;;53125:28;;;;-1:-1:-1;;;;;53099:54:0;-1:-1:-1;;;53099:54:0;-1:-1:-1;;;;;;53099:54:0;;;-1:-1:-1;;;;;53056:20:0;;53099:54;;;;52999:174;-1:-1:-1;;53216:35:0;;53243:7;;-1:-1:-1;53239:1:0;;-1:-1:-1;;;;;;53216:35:0;;;-1:-1:-1;;;;;;;;;;;53216:35:0;53239:1;;53216:35;-1:-1:-1;;53439:12:0;:14;;;;;;-1:-1:-1;;51064:2408:0:o;39504:1111::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;39615:7:0;;67070:1;39664:23;39660:888;;39700:13;;39693:4;:20;39689:859;;;39734:31;39768:17;;;:11;:17;;;;;;;;;39734:51;;;;;;;;;-1:-1:-1;;;;;39734:51:0;;;;-1:-1:-1;;;39734:51:0;;-1:-1:-1;;;;;39734:51:0;;;;;;;;-1:-1:-1;;;39734:51:0;;;;;;;;;;;;;;39804:729;;39854:14;;-1:-1:-1;;;;;39854:28:0;;39850:101;;39918:9;39504:1111;-1:-1:-1;;;39504:1111:0:o;39850:101::-;-1:-1:-1;;;40293:6:0;40338:17;;;;:11;:17;;;;;;;;;40326:29;;;;;;;;;-1:-1:-1;;;;;40326:29:0;;;;;-1:-1:-1;;;40326:29:0;;-1:-1:-1;;;;;40326:29:0;;;;;;;;-1:-1:-1;;;40326:29:0;;;;;;;;;;;;;40386:28;40382:109;;40454:9;39504:1111;-1:-1:-1;;;39504:1111:0:o;40382:109::-;40253:261;;;39715:833;39689:859;40576:31;;-1:-1:-1;;;40576:31:0;;;;;;;;;;;59027:191;59101:16;59120:6;;-1:-1:-1;;;;;59137:17:0;;;-1:-1:-1;;;;;;59137:17:0;;;;;;59170:40;;59120:6;;;;;;;59170:40;;59101:16;59170:40;59090:128;59027:191;:::o;71781:430::-;71853:6;71876:17;71884:8;71876:7;:17::i;:::-;71868:61;;;;-1:-1:-1;;;71868:61:0;;;;;;;:::i;:::-;71936:21;71960:17;71968:8;71960:7;:17::i;:::-;71936:41;;71984:21;72008:24;72018:13;72008:9;:24::i;:::-;71984:48;;72039:15;72088:7;;72064:13;72057:39;;;;:::i;:::-;72039:57;;72126:9;;72107:8;:29;72103:81;;-1:-1:-1;72166:9:0;;72103:81;72197:8;71781:430;-1:-1:-1;;;;71781:430:0:o;71414:361::-;71487:6;71510:17;71518:8;71510:7;:17::i;:::-;71502:61;;;;-1:-1:-1;;;71502:61:0;;;;;;;:::i;:::-;71651:8;;71570:15;71620:19;;;:9;:19;;;;;;71570:15;;71651:8;71589:51;;71596:15;71589:51;:::i;:::-;71588:72;;;;:::i;:::-;71570:90;;71690:9;;71671:8;:29;71667:81;;-1:-1:-1;71730:9:0;;71761:8;71414:361;-1:-1:-1;;71414:361:0:o;42657:287::-;34809:10;-1:-1:-1;;;;;42756:24:0;;;42752:54;;42789:17;;-1:-1:-1;;;42789:17:0;;;;;;;;;;;42752:54;34809:10;42819:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;42819:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;42819:53:0;;;;;;;;;;42888:48;;540:41:1;;;42819:42:0;;34809:10;42888:48;;513:18:1;42888:48:0;;;;;;;42657:287;;:::o;43743:370::-;43910:28;43920:4;43926:2;43930:7;43910:9;:28::i;:::-;-1:-1:-1;;;;;43953:13:0;;1435:19;:23;43949:157;;43974:56;44005:4;44011:2;44015:7;44024:5;43974:30;:56::i;:::-;43970:136;;44054:40;;-1:-1:-1;;;44054:40:0;;;;;;;;;;;71112:97;71162:13;71190;71183:20;;;;;:::i;9829:723::-;9885:13;10106:5;10115:1;10106:10;10102:53;;-1:-1:-1;;10133:10:0;;;;;;;;;;;;-1:-1:-1;;;10133:10:0;;;;;9829:723::o;10102:53::-;10180:5;10165:12;10221:78;10228:9;;10221:78;;10254:8;;;;:::i;:::-;;-1:-1:-1;10277:10:0;;-1:-1:-1;10285:2:0;10277:10;;:::i;:::-;;;10221:78;;;10309:19;10341:6;-1:-1:-1;;;;;10331:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10331:17:0;;10309:39;;10359:154;10366:10;;10359:154;;10393:11;10403:1;10393:11;;:::i;:::-;;-1:-1:-1;10462:10:0;10470:2;10462:5;:10;:::i;:::-;10449:24;;:2;:24;:::i;:::-;10436:39;;10419:6;10426;10419:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;10419:56:0;;;;;;;;-1:-1:-1;10490:11:0;10499:2;10490:11;;:::i;:::-;;;10359:154;;67645:567;67698:13;67721:16;;67766:32;67721:16;29713:5;67766:11;:32::i;:::-;67720:78;;;;67907:283;68019:33;68036:15;68019:16;:33::i;:::-;68094:51;68130:8;-1:-1:-1;;;;;68114:26:0;68142:2;68094:19;:51::i;:::-;67953:213;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67907:13;:283::i;:::-;67838:361;;;;;;;;:::i;:::-;;;;;;;;;;;;;67816:390;;;;67645:567;:::o;37754:305::-;37856:4;-1:-1:-1;;;;;;37893:40:0;;-1:-1:-1;;;37893:40:0;;:105;;-1:-1:-1;;;;;;;37950:48:0;;-1:-1:-1;;;37950:48:0;37893:105;:158;;;-1:-1:-1;;;;;;;;;;26409:40:0;;;38015:36;26300:157;53590:196;53705:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;53705:29:0;-1:-1:-1;;;;;53705:29:0;;;;;;;;;53750:28;;53705:24;;53750:28;;;;;;;53590:196;;;:::o;48538:2130::-;48653:35;48691:21;48704:7;48691:12;:21::i;:::-;48653:59;;48751:4;-1:-1:-1;;;;;48729:26:0;:13;:18;;;-1:-1:-1;;;;;48729:26:0;;48725:67;;48764:28;;-1:-1:-1;;;48764:28:0;;;;;;;;;;;48725:67;48805:22;34809:10;-1:-1:-1;;;;;48831:20:0;;;;:73;;-1:-1:-1;48868:36:0;48885:4;34809:10;43015:164;:::i;48868:36::-;48831:126;;;-1:-1:-1;34809:10:0;48921:20;48933:7;48921:11;:20::i;:::-;-1:-1:-1;;;;;48921:36:0;;48831:126;48805:153;;48976:17;48971:66;;49002:35;;-1:-1:-1;;;49002:35:0;;;;;;;;;;;48971:66;-1:-1:-1;;;;;49052:16:0;;49048:52;;49077:23;;-1:-1:-1;;;49077:23:0;;;;;;;;;;;49048:52;49113:43;49135:4;49141:2;49145:7;49154:1;49113:21;:43::i;:::-;49221:35;49238:1;49242:7;49251:4;49221:8;:35::i;:::-;-1:-1:-1;;;;;49552:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;49552:31:0;;;-1:-1:-1;;;;;49552:31:0;;;-1:-1:-1;;49552:31:0;;;;;;;49598:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;49598:29:0;;;;;;;;;;;49678:20;;;:11;:20;;;;;;49713:18;;-1:-1:-1;;;;;;49746:49:0;;;;-1:-1:-1;;;49779:15:0;49746:49;;;;;;;;;;50069:11;;50129:24;;;;;50172:13;;49678:20;;50129:24;;50172:13;50168:384;;50382:13;;50367:11;:28;50363:174;;50420:20;;50489:28;;;;-1:-1:-1;;;;;50463:54:0;-1:-1:-1;;;50463:54:0;-1:-1:-1;;;;;;50463:54:0;;;-1:-1:-1;;;;;50420:20:0;;50463:54;;;;50363:174;49527:1036;;;50599:7;50595:2;-1:-1:-1;;;;;50580:27:0;50589:4;-1:-1:-1;;;;;50580:27:0;-1:-1:-1;;;;;;;;;;;50580:27:0;;;;;;;;;50618:42;77808:163;45103:1749;45249:13;;-1:-1:-1;;;;;45277:16:0;;45273:48;;45302:19;;-1:-1:-1;;;45302:19:0;;;;;;;;;;;45273:48;45336:8;45348:1;45336:13;45332:44;;45358:18;;-1:-1:-1;;;45358:18:0;;;;;;;;;;;45332:44;45389:61;45419:1;45423:2;45427:12;45441:8;45389:21;:61::i;:::-;-1:-1:-1;;;;;45727:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;45786:49:0;;-1:-1:-1;;;;;45727:44:0;;;;;;;45786:49;;;;-1:-1:-1;;45727:44:0;;;;;;45786:49;;;;;;;;;;;;;;;;45852:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;45902:66:0;;;-1:-1:-1;;;45952:15:0;45902:66;;;;;;;;;;;;;45852:25;;46049:23;;;;1435:19;:23;46089:631;;46129:313;46160:38;;46185:12;;-1:-1:-1;;;;;46160:38:0;;;46177:1;;-1:-1:-1;;;;;;;;;;;46160:38:0;46177:1;;46160:38;46226:69;46265:1;46269:2;46273:14;;;;;;46289:5;46226:30;:69::i;:::-;46221:174;;46331:40;;-1:-1:-1;;;46331:40:0;;;;;;;;;;;46221:174;46437:3;46422:12;:18;46129:313;;46523:12;46506:13;;:29;46502:43;;46537:8;;;46502:43;46089:631;;;46586:119;46617:40;;46642:14;;;;;-1:-1:-1;;;;;46617:40:0;;;46634:1;;-1:-1:-1;;;;;;;;;;;46617:40:0;46634:1;;46617:40;46700:3;46685:12;:18;46586:119;;46089:631;-1:-1:-1;46734:13:0;:28;46784:60;46813:1;46817:2;46821:12;46835:8;46784:60;:::i;78394:495::-;78563:23;;;;:9;:23;;;;;78589:15;78563:41;;78573:12;;78675:23;78690:8;78573:12;78675:23;:::i;:::-;78661:37;;78709:101;78755:15;78727:9;:25;78737:14;;;;:::i;:::-;;;78727:25;;;;;;;;;;;:43;;;;78805:3;78790:12;:18;78709:101;;78552:337;;78394:495;;;;:::o;54278:667::-;54462:72;;-1:-1:-1;;;54462:72:0;;54441:4;;-1:-1:-1;;;;;54462:36:0;;;;;:72;;34809:10;;54513:4;;54519:7;;54528:5;;54462:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54462:72:0;;;;;;;;-1:-1:-1;;54462:72:0;;;;;;;;;;;;:::i;:::-;;;54458:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54696:6;:13;54713:1;54696:18;54692:235;;54742:40;;-1:-1:-1;;;54742:40:0;;;;;;;;;;;54692:235;54885:6;54879:13;54870:6;54866:2;54862:15;54855:38;54458:480;-1:-1:-1;;;;;;54581:55:0;-1:-1:-1;;;54581:55:0;;-1:-1:-1;54278:667:0;;;;;;:::o;11130:451::-;11205:13;11231:19;11263:10;11267:6;11263:1;:10;:::i;:::-;:14;;11276:1;11263:14;:::i;:::-;-1:-1:-1;;;;;11253:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11253:25:0;;11231:47;;-1:-1:-1;;;11289:6:0;11296:1;11289:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;11289:15:0;;;;;;;;;-1:-1:-1;;;11315:6:0;11322:1;11315:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;11315:15:0;;;;;;;;-1:-1:-1;11346:9:0;11358:10;11362:6;11358:1;:10;:::i;:::-;:14;;11371:1;11358:14;:::i;:::-;11346:26;;11341:135;11378:1;11374;:5;11341:135;;;-1:-1:-1;;;11426:5:0;11434:3;11426:11;11413:25;;;;;;;:::i;:::-;;;;11401:6;11408:1;11401:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;11401:37:0;;;;;;;;-1:-1:-1;11463:1:0;11453:11;;;;;11381:3;;;:::i;:::-;;;11341:135;;;-1:-1:-1;11494:10:0;;11486:55;;;;-1:-1:-1;;;11486:55:0;;25231:2:1;11486:55:0;;;25213:21:1;;;25250:18;;;25243:30;25309:34;25289:18;;;25282:62;25361:18;;11486:55:0;25029:356:1;11486:55:0;11566:6;11130:451;-1:-1:-1;;;11130:451:0:o;13070:3097::-;13128:13;13365:4;:11;13380:1;13365:16;13361:31;;-1:-1:-1;;13383:9:0;;;;;;;;;-1:-1:-1;13383:9:0;;;13070:3097::o;13361:31::-;13445:19;13467:6;;;;;;;;;;;;;;;;;13445:28;;13884:20;13943:1;13924:4;:11;13938:1;13924:15;;;;:::i;:::-;13923:21;;;;:::i;:::-;13918:27;;:1;:27;:::i;:::-;-1:-1:-1;;;;;13907:39:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13907:39:0;;13884:62;;14126:1;14119:5;14115:13;14230:2;14222:6;14218:15;14341:4;14393;14387:11;14381:4;14377:22;14303:1432;14427:6;14418:7;14415:19;14303:1432;;;14533:1;14524:7;14520:15;14509:26;;14572:7;14566:14;15225:4;15217:5;15213:2;15209:14;15205:25;15195:8;15191:40;15185:47;15174:9;15166:67;15279:1;15268:9;15264:17;15251:30;;15371:4;15363:5;15359:2;15355:14;15351:25;15341:8;15337:40;15331:47;15320:9;15312:67;15425:1;15414:9;15410:17;15397:30;;15516:4;15508:5;15505:1;15501:13;15497:24;15487:8;15483:39;15477:46;15466:9;15458:66;15570:1;15559:9;15555:17;15542:30;;15653:4;15646:5;15642:16;15632:8;15628:31;15622:38;15611:9;15603:58;;15707:1;15696:9;15692:17;15679:30;;14303:1432;;;14307:107;;15897:1;15890:4;15884:11;15880:19;15918:1;15913:123;;;;16055:1;16050:73;;;;15873:250;;15913:123;15966:4;15962:1;15951:9;15947:17;15939:32;16016:4;16012:1;16001:9;15997:17;15989:32;15913:123;;16050:73;16103:4;16099:1;16088:9;16084:17;16076:32;15873:250;-1:-1:-1;16153:6:0;;13070:3097;-1:-1:-1;;;;;13070:3097:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:131::-;-1:-1:-1;;;;;667:31:1;;657:42;;647:70;;713:1;710;703:12;728:435;795:6;803;856:2;844:9;835:7;831:23;827:32;824:52;;;872:1;869;862:12;824:52;911:9;898:23;930:31;955:5;930:31;:::i;:::-;980:5;-1:-1:-1;1037:2:1;1022:18;;1009:32;-1:-1:-1;;;;;1072:40:1;;1060:53;;1050:81;;1127:1;1124;1117:12;1050:81;1150:7;1140:17;;;728:435;;;;;:::o;1168:258::-;1240:1;1250:113;1264:6;1261:1;1258:13;1250:113;;;1340:11;;;1334:18;1321:11;;;1314:39;1286:2;1279:10;1250:113;;;1381:6;1378:1;1375:13;1372:48;;;-1:-1:-1;;1416:1:1;1398:16;;1391:27;1168:258::o;1431:::-;1473:3;1511:5;1505:12;1538:6;1533:3;1526:19;1554:63;1610:6;1603:4;1598:3;1594:14;1587:4;1580:5;1576:16;1554:63;:::i;:::-;1671:2;1650:15;-1:-1:-1;;1646:29:1;1637:39;;;;1678:4;1633:50;;1431:258;-1:-1:-1;;1431:258:1:o;1694:220::-;1843:2;1832:9;1825:21;1806:4;1863:45;1904:2;1893:9;1889:18;1881:6;1863:45;:::i;1919:180::-;1978:6;2031:2;2019:9;2010:7;2006:23;2002:32;1999:52;;;2047:1;2044;2037:12;1999:52;-1:-1:-1;2070:23:1;;1919:180;-1:-1:-1;1919:180:1:o;2312:315::-;2380:6;2388;2441:2;2429:9;2420:7;2416:23;2412:32;2409:52;;;2457:1;2454;2447:12;2409:52;2496:9;2483:23;2515:31;2540:5;2515:31;:::i;:::-;2565:5;2617:2;2602:18;;;;2589:32;;-1:-1:-1;;;2312:315:1:o;2814:456::-;2891:6;2899;2907;2960:2;2948:9;2939:7;2935:23;2931:32;2928:52;;;2976:1;2973;2966:12;2928:52;3015:9;3002:23;3034:31;3059:5;3034:31;:::i;:::-;3084:5;-1:-1:-1;3141:2:1;3126:18;;3113:32;3154:33;3113:32;3154:33;:::i;:::-;2814:456;;3206:7;;-1:-1:-1;;;3260:2:1;3245:18;;;;3232:32;;2814:456::o;3275:118::-;3361:5;3354:13;3347:21;3340:5;3337:32;3327:60;;3383:1;3380;3373:12;3398:241;3454:6;3507:2;3495:9;3486:7;3482:23;3478:32;3475:52;;;3523:1;3520;3513:12;3475:52;3562:9;3549:23;3581:28;3603:5;3581:28;:::i;3644:248::-;3712:6;3720;3773:2;3761:9;3752:7;3748:23;3744:32;3741:52;;;3789:1;3786;3779:12;3741:52;-1:-1:-1;;3812:23:1;;;3882:2;3867:18;;;3854:32;;-1:-1:-1;3644:248:1:o;4416:247::-;4475:6;4528:2;4516:9;4507:7;4503:23;4499:32;4496:52;;;4544:1;4541;4534:12;4496:52;4583:9;4570:23;4602:31;4627:5;4602:31;:::i;4668:632::-;4839:2;4891:21;;;4961:13;;4864:18;;;4983:22;;;4810:4;;4839:2;5062:15;;;;5036:2;5021:18;;;4810:4;5105:169;5119:6;5116:1;5113:13;5105:169;;;5180:13;;5168:26;;5249:15;;;;5214:12;;;;5141:1;5134:9;5105:169;;;-1:-1:-1;5291:3:1;;4668:632;-1:-1:-1;;;;;;4668:632:1:o;5305:127::-;5366:10;5361:3;5357:20;5354:1;5347:31;5397:4;5394:1;5387:15;5421:4;5418:1;5411:15;5437:275;5508:2;5502:9;5573:2;5554:13;;-1:-1:-1;;5550:27:1;5538:40;;-1:-1:-1;;;;;5593:34:1;;5629:22;;;5590:62;5587:88;;;5655:18;;:::i;:::-;5691:2;5684:22;5437:275;;-1:-1:-1;5437:275:1:o;5717:407::-;5782:5;-1:-1:-1;;;;;5808:6:1;5805:30;5802:56;;;5838:18;;:::i;:::-;5876:57;5921:2;5900:15;;-1:-1:-1;;5896:29:1;5927:4;5892:40;5876:57;:::i;:::-;5867:66;;5956:6;5949:5;5942:21;5996:3;5987:6;5982:3;5978:16;5975:25;5972:45;;;6013:1;6010;6003:12;5972:45;6062:6;6057:3;6050:4;6043:5;6039:16;6026:43;6116:1;6109:4;6100:6;6093:5;6089:18;6085:29;6078:40;5717:407;;;;;:::o;6129:451::-;6198:6;6251:2;6239:9;6230:7;6226:23;6222:32;6219:52;;;6267:1;6264;6257:12;6219:52;6307:9;6294:23;-1:-1:-1;;;;;6332:6:1;6329:30;6326:50;;;6372:1;6369;6362:12;6326:50;6395:22;;6448:4;6440:13;;6436:27;-1:-1:-1;6426:55:1;;6477:1;6474;6467:12;6426:55;6500:74;6566:7;6561:2;6548:16;6543:2;6539;6535:11;6500:74;:::i;6585:712::-;6639:5;6692:3;6685:4;6677:6;6673:17;6669:27;6659:55;;6710:1;6707;6700:12;6659:55;6746:6;6733:20;6772:4;-1:-1:-1;;;;;6791:2:1;6788:26;6785:52;;;6817:18;;:::i;:::-;6863:2;6860:1;6856:10;6886:28;6910:2;6906;6902:11;6886:28;:::i;:::-;6948:15;;;7018;;;7014:24;;;6979:12;;;;7050:15;;;7047:35;;;7078:1;7075;7068:12;7047:35;7114:2;7106:6;7102:15;7091:26;;7126:142;7142:6;7137:3;7134:15;7126:142;;;7208:17;;7196:30;;7159:12;;;;7246;;;;7126:142;;;7286:5;6585:712;-1:-1:-1;;;;;;;6585:712:1:o;7302:483::-;7395:6;7403;7456:2;7444:9;7435:7;7431:23;7427:32;7424:52;;;7472:1;7469;7462:12;7424:52;7511:9;7498:23;7530:31;7555:5;7530:31;:::i;:::-;7580:5;-1:-1:-1;7636:2:1;7621:18;;7608:32;-1:-1:-1;;;;;7652:30:1;;7649:50;;;7695:1;7692;7685:12;7649:50;7718:61;7771:7;7762:6;7751:9;7747:22;7718:61;:::i;:::-;7708:71;;;7302:483;;;;;:::o;7975:382::-;8040:6;8048;8101:2;8089:9;8080:7;8076:23;8072:32;8069:52;;;8117:1;8114;8107:12;8069:52;8156:9;8143:23;8175:31;8200:5;8175:31;:::i;:::-;8225:5;-1:-1:-1;8282:2:1;8267:18;;8254:32;8295:30;8254:32;8295:30;:::i;8362:795::-;8457:6;8465;8473;8481;8534:3;8522:9;8513:7;8509:23;8505:33;8502:53;;;8551:1;8548;8541:12;8502:53;8590:9;8577:23;8609:31;8634:5;8609:31;:::i;:::-;8659:5;-1:-1:-1;8716:2:1;8701:18;;8688:32;8729:33;8688:32;8729:33;:::i;:::-;8781:7;-1:-1:-1;8835:2:1;8820:18;;8807:32;;-1:-1:-1;8890:2:1;8875:18;;8862:32;-1:-1:-1;;;;;8906:30:1;;8903:50;;;8949:1;8946;8939:12;8903:50;8972:22;;9025:4;9017:13;;9013:27;-1:-1:-1;9003:55:1;;9054:1;9051;9044:12;9003:55;9077:74;9143:7;9138:2;9125:16;9120:2;9116;9112:11;9077:74;:::i;:::-;9067:84;;;8362:795;;;;;;;:::o;9162:416::-;9255:6;9263;9316:2;9304:9;9295:7;9291:23;9287:32;9284:52;;;9332:1;9329;9322:12;9284:52;9368:9;9355:23;9345:33;;9429:2;9418:9;9414:18;9401:32;-1:-1:-1;;;;;9448:6:1;9445:30;9442:50;;;9488:1;9485;9478:12;9583:315;9651:6;9659;9712:2;9700:9;9691:7;9687:23;9683:32;9680:52;;;9728:1;9725;9718:12;9680:52;9764:9;9751:23;9741:33;;9824:2;9813:9;9809:18;9796:32;9837:31;9862:5;9837:31;:::i;9903:388::-;9971:6;9979;10032:2;10020:9;10011:7;10007:23;10003:32;10000:52;;;10048:1;10045;10038:12;10000:52;10087:9;10074:23;10106:31;10131:5;10106:31;:::i;:::-;10156:5;-1:-1:-1;10213:2:1;10198:18;;10185:32;10226:33;10185:32;10226:33;:::i;10296:380::-;10375:1;10371:12;;;;10418;;;10439:61;;10493:4;10485:6;10481:17;10471:27;;10439:61;10546:2;10538:6;10535:14;10515:18;10512:38;10509:161;;10592:10;10587:3;10583:20;10580:1;10573:31;10627:4;10624:1;10617:15;10655:4;10652:1;10645:15;10509:161;;10296:380;;;:::o;10990:245::-;11057:6;11110:2;11098:9;11089:7;11085:23;11081:32;11078:52;;;11126:1;11123;11116:12;11078:52;11158:9;11152:16;11177:28;11199:5;11177:28;:::i;11240:127::-;11301:10;11296:3;11292:20;11289:1;11282:31;11332:4;11329:1;11322:15;11356:4;11353:1;11346:15;11372:168;11412:7;11478:1;11474;11470:6;11466:14;11463:1;11460:21;11455:1;11448:9;11441:17;11437:45;11434:71;;;11485:18;;:::i;:::-;-1:-1:-1;11525:9:1;;11372:168::o;11545:127::-;11606:10;11601:3;11597:20;11594:1;11587:31;11637:4;11634:1;11627:15;11661:4;11658:1;11651:15;11677:120;11717:1;11743;11733:35;;11748:18;;:::i;:::-;-1:-1:-1;11782:9:1;;11677:120::o;11802:355::-;12004:2;11986:21;;;12043:2;12023:18;;;12016:30;12082:33;12077:2;12062:18;;12055:61;12148:2;12133:18;;11802:355::o;12917:128::-;12957:3;12988:1;12984:6;12981:1;12978:13;12975:39;;;12994:18;;:::i;:::-;-1:-1:-1;13030:9:1;;12917:128::o;13759:336::-;13961:2;13943:21;;;14000:2;13980:18;;;13973:30;-1:-1:-1;;;14034:2:1;14019:18;;14012:42;14086:2;14071:18;;13759:336::o;14310:251::-;14380:6;14433:2;14421:9;14412:7;14408:23;14404:32;14401:52;;;14449:1;14446;14439:12;14401:52;14481:9;14475:16;14500:31;14525:5;14500:31;:::i;14566:135::-;14605:3;14626:17;;;14623:43;;14646:18;;:::i;:::-;-1:-1:-1;14693:1:1;14682:13;;14566:135::o;14706:127::-;14767:10;14762:3;14758:20;14755:1;14748:31;14798:4;14795:1;14788:15;14822:4;14819:1;14812:15;15678:355;15880:2;15862:21;;;15919:2;15899:18;;;15892:30;15958:33;15953:2;15938:18;;15931:61;16024:2;16009:18;;15678:355::o;16509:973::-;16594:12;;16559:3;;16649:1;16669:18;;;;16722;;;;16749:61;;16803:4;16795:6;16791:17;16781:27;;16749:61;16829:2;16877;16869:6;16866:14;16846:18;16843:38;16840:161;;16923:10;16918:3;16914:20;16911:1;16904:31;16958:4;16955:1;16948:15;16986:4;16983:1;16976:15;16840:161;17017:18;17044:104;;;;17162:1;17157:319;;;;17010:466;;17044:104;-1:-1:-1;;17077:24:1;;17065:37;;17122:16;;;;-1:-1:-1;17044:104:1;;17157:319;16456:1;16449:14;;;16493:4;16480:18;;17251:1;17265:165;17279:6;17276:1;17273:13;17265:165;;;17357:14;;17344:11;;;17337:35;17400:16;;;;17294:10;;17265:165;;;17269:3;;17459:6;17454:3;17450:16;17443:23;;17010:466;;;;;;;16509:973;;;;:::o;17487:888::-;17860:3;17898:6;17892:13;17914:53;17960:6;17955:3;17948:4;17940:6;17936:17;17914:53;:::i;:::-;18030:13;;17989:16;;;;18052:57;18030:13;17989:16;18086:4;18074:17;;18052:57;:::i;:::-;-1:-1:-1;;;18131:20:1;;18160:18;;;18203:13;;18225:65;18203:13;18277:1;18266:13;;18259:4;18247:17;;18225:65;:::i;:::-;18306:63;18366:1;18355:8;18348:5;18344:20;18340:28;18332:6;18306:63;:::i;:::-;18299:70;17487:888;-1:-1:-1;;;;;;;;17487:888:1:o;18380:550::-;18604:3;18642:6;18636:13;18658:53;18704:6;18699:3;18692:4;18684:6;18680:17;18658:53;:::i;:::-;18774:13;;18733:16;;;;18796:57;18774:13;18733:16;18830:4;18818:17;;18796:57;:::i;:::-;18869:55;18914:8;18907:5;18903:20;18895:6;18869:55;:::i;21941:193::-;21980:1;22006;21996:35;;22011:18;;:::i;:::-;-1:-1:-1;;;22047:18:1;;-1:-1:-1;;22067:13:1;;22043:38;22040:64;;;22084:18;;:::i;:::-;-1:-1:-1;22118:10:1;;21941:193::o;22139:267::-;22178:4;22207:9;;;22232:10;;-1:-1:-1;;;22251:19:1;;22244:27;;22228:44;22225:70;;;22275:18;;:::i;:::-;-1:-1:-1;;;;;22322:27:1;;22315:35;;22307:44;;22304:70;;;22354:18;;:::i;:::-;-1:-1:-1;;22391:9:1;;22139:267::o;22411:125::-;22451:4;22479:1;22476;22473:8;22470:34;;;22484:18;;:::i;:::-;-1:-1:-1;22521:9:1;;22411:125::o;22541:112::-;22573:1;22599;22589:35;;22604:18;;:::i;:::-;-1:-1:-1;22638:9:1;;22541:112::o;22658:1024::-;23170:66;23165:3;23158:79;23140:3;23266:6;23260:13;23282:62;23337:6;23332:2;23327:3;23323:12;23316:4;23308:6;23304:17;23282:62;:::i;:::-;-1:-1:-1;;;23403:2:1;23363:16;;;23395:11;;;23388:71;23484:13;;23506:63;23484:13;23555:2;23547:11;;23540:4;23528:17;;23506:63;:::i;:::-;-1:-1:-1;;;23629:2:1;23588:17;;;;23621:11;;;23614:35;23673:2;23665:11;;22658:1024;-1:-1:-1;;;;22658:1024:1:o;23687:448::-;23949:31;23944:3;23937:44;23919:3;24010:6;24004:13;24026:62;24081:6;24076:2;24071:3;24067:12;24060:4;24052:6;24048:17;24026:62;:::i;:::-;24108:16;;;;24126:2;24104:25;;23687:448;-1:-1:-1;;23687:448:1:o;24140:489::-;-1:-1:-1;;;;;24409:15:1;;;24391:34;;24461:15;;24456:2;24441:18;;24434:43;24508:2;24493:18;;24486:34;;;24556:3;24551:2;24536:18;;24529:31;;;24334:4;;24577:46;;24603:19;;24595:6;24577:46;:::i;:::-;24569:54;24140:489;-1:-1:-1;;;;;;24140:489:1:o;24634:249::-;24703:6;24756:2;24744:9;24735:7;24731:23;24727:32;24724:52;;;24772:1;24769;24762:12;24724:52;24804:9;24798:16;24823:30;24847:5;24823:30;:::i;24888:136::-;24927:3;24955:5;24945:39;;24964:18;;:::i;:::-;-1:-1:-1;;;25000:18:1;;24888:136::o

Swarm Source

ipfs://61e84593d10c60fdd68fd2e828407692c705e10e85c3f74e48a6c4a1b0bd92d3
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.