ETH Price: $3,411.64 (+1.70%)

Token

Jidori (JIDORI)
 

Overview

Max Total Supply

3,950 JIDORI

Holders

1,218

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 JIDORI
0xb55f2682af328743fafedeaa2252af4bdcd749fd
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Jidori is a hand-painted NFT collection whose creative idea comes from people's usual selfie habits, and maybe it's similar to you.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Jidori

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-03
*/

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


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

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

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

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

    /**
     * @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 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);

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: erc721a/contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @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, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

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

    // 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 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 && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : '';
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !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() && !_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;
    }

    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 {
        _mint(to, quantity, _data, true);
    }

    /**
     * @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,
        bytes memory _data,
        bool safe
    ) 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 (safe && 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 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 This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: contracts/jidori.sol


/*
┌───────┐        ┌─┐                       ┌────────┐
└──┐ ┌──┘        | |                       |      ○ | 
   | |           | |                       |        | 
   | |         __| |   ___    _  __        |        | 
   | |   ●   / __  |  / _ \  | |/ / ●      |  FIND  | 
__ | |  ┌─┐ / /  | | | | | | |  /  ┌─┐     |  YOUR  |          
\ \/ /  | | | \__| | | |_| | | |   | |     | SELFIE | 
 \__/   |_|  \_____|  \___/  |_|   |_|     └────────┘

*/
pragma solidity ^0.8.4;






contract Jidori is Ownable, ERC721A, ReentrancyGuard {
    mapping(address => uint256) public whitelistPurchased;

    struct JidoriConfig {
        bytes32 rootHash;
        bool paused;
        bool isPublicSale;
        bool isPreSale;
        uint256 preSaleMaxMint;
        uint256 publicSaleMaxMint;
        uint256 publicSalePrice;
        uint256 preSalePrice;
        uint256 maxSupply;
        uint256 devMintAmount;
        uint256 freeSlots;
    }

    JidoriConfig public jidoriConfig;

    constructor() ERC721A("Jidori", "JIDORI") {
        initConfig( 
        0x0000000000000000000000000000000000000000000000000000000000000000, 
        true, 
        false, 
        true, 
        2, 
        8,
        9000000000000000,
        0,
        4000,
        50,
        0
        );
    }

    function initConfig(
        bytes32 rootHash, 
        bool paused, 
        bool isPublicSale, 
        bool isPreSale, 
        uint256 preSaleMaxMint, 
        uint256 publicSaleMaxMint,
        uint256 publicSalePrice,
        uint256 preSalePrice,
        uint256 maxSupply,
        uint256 devMintAmount,
        uint256 freeSlots
    ) private onlyOwner {
        jidoriConfig.rootHash = rootHash;
        jidoriConfig.paused = paused;
        jidoriConfig.isPublicSale = isPublicSale;
        jidoriConfig.isPreSale = isPreSale;
        jidoriConfig.preSaleMaxMint = preSaleMaxMint;
        jidoriConfig.publicSaleMaxMint = publicSaleMaxMint;
        jidoriConfig.publicSalePrice = publicSalePrice;
        jidoriConfig.preSalePrice = preSalePrice;
        jidoriConfig.maxSupply = maxSupply;
        jidoriConfig.devMintAmount = devMintAmount;
        jidoriConfig.freeSlots = freeSlots;
    }

    function preSaleMint(uint256 quantity, bytes32[] calldata proof)
        external
        payable
    {
        JidoriConfig memory config = jidoriConfig;

        bytes32 rootHash = bytes32(config.rootHash);
        bool paused = bool(config.paused);
        bool isPreSale = bool(config.isPreSale);
        uint256 preSaleMaxMint = uint256(config.preSaleMaxMint);
        uint256 devMintAmount = uint256(config.devMintAmount);
        uint256 maxSupply = uint256(config.maxSupply);

        require(!paused, "Sale paused or not start.");
        require(isPreSale, "Pre-sale not yet started.");

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(proof, rootHash, leaf), "Proof invalid.");
        require(
            whitelistPurchased[msg.sender] + quantity <= preSaleMaxMint,
            "Reached the maximum amount of whitelisted wallet."
        );
        require(
            totalSupply() + quantity + devMintAmount <= maxSupply,
            "Insufficient quantity left."
        );
        whitelistPurchased[msg.sender] += quantity;
        _safeMint(msg.sender, quantity);
    }

    function publicSaleMint(uint256 quantity) external payable {

        JidoriConfig memory config = jidoriConfig;

        bool paused = bool(config.paused);
        bool isPublicSale = bool(config.isPublicSale);
        uint256 publicSalePrice = uint256(config.publicSalePrice);
        uint256 publicSaleMaxMint = uint256(config.publicSaleMaxMint);
        uint256 preSaleMaxMint = uint256(config.preSaleMaxMint);
        uint256 devMintAmount = uint256(config.devMintAmount);
        uint256 maxSupply = uint256(config.maxSupply);
        uint256 freeSlots = uint256(config.freeSlots);

        require(!paused, "Sale paused or not start.");
        require(isPublicSale, "Public-sale not yet started.");
        require(
            totalSupply() + quantity + devMintAmount <= maxSupply,
            "Insufficient quantity left."
        );

        if (whitelistPurchased[msg.sender] == preSaleMaxMint) {
          require(
              addressMinted(msg.sender) + quantity <= publicSaleMaxMint + preSaleMaxMint,
              "Exceeds the maximum number per wallet."
          );
        } else {
          require(
              addressMinted(msg.sender) + quantity <= publicSaleMaxMint,
              "Exceeds the maximum number per wallet."
          );
        }

        if (totalSupply() + quantity <= freeSlots) {
            _safeMint(msg.sender, quantity);
        } else {
            require(
                quantity * publicSalePrice <= msg.value,
                "Insufficient balance."
            );
            _safeMint(msg.sender, quantity);
        }

    }

    function flipSaleStatus() public onlyOwner {
        jidoriConfig.isPreSale = !jidoriConfig.isPreSale;
        jidoriConfig.isPublicSale = !jidoriConfig.isPublicSale;
    }

    function setPaused(bool _state) public onlyOwner {
        jidoriConfig.paused = _state;
    }

    function setRootHash(bytes32 _hash) public onlyOwner {
        jidoriConfig.rootHash = _hash;
    }

    function setFreeSlots(uint256 _slots) public onlyOwner {
        jidoriConfig.freeSlots = _slots;
    }
    
    function addressMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

    function devMint(uint256 quantity) external onlyOwner {
        JidoriConfig memory config = jidoriConfig;
        uint256 maxSupply = uint256(config.maxSupply);

        require(totalSupply() + quantity <= maxSupply,
            "Insufficient quantity left."
        );

        uint256 numChunks = quantity / 5;
        for (uint256 i = 0; i < numChunks; i++) {
            _safeMint(msg.sender, 5);
        }
    }

    string private _baseTokenURI;

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

    function setBaseURI(string calldata baseURI) external onlyOwner {
        _baseTokenURI = baseURI;
    }

    function withdraw() external onlyOwner nonReentrant {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"addressMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jidoriConfig","outputs":[{"internalType":"bytes32","name":"rootHash","type":"bytes32"},{"internalType":"bool","name":"paused","type":"bool"},{"internalType":"bool","name":"isPublicSale","type":"bool"},{"internalType":"bool","name":"isPreSale","type":"bool"},{"internalType":"uint256","name":"preSaleMaxMint","type":"uint256"},{"internalType":"uint256","name":"publicSaleMaxMint","type":"uint256"},{"internalType":"uint256","name":"publicSalePrice","type":"uint256"},{"internalType":"uint256","name":"preSalePrice","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"devMintAmount","type":"uint256"},{"internalType":"uint256","name":"freeSlots","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"preSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_slots","type":"uint256"}],"name":"setFreeSlots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"}],"name":"setRootHash","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":"address","name":"","type":"address"}],"name":"whitelistPurchased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051806040016040528060068152602001654a69646f726960d01b815250604051806040016040528060068152602001654a49444f524960d01b8152506200006a62000064620000ca60201b60201c565b620000ce565b81516200007f906003906020850190620001de565b50805162000095906004906020840190620001de565b5050600060018181556009819055620000c49250818160026008661ff973cafa800084610fa06032826200011e565b620002c1565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b031633146200017d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b600b9a909a55600c805461ffff191699151561ff00191699909917610100981515989098029790971762ff00001916620100009615159690960295909517909655600d92909255600e55600f55601092909255601191909155601255601355565b828054620001ec9062000284565b90600052602060002090601f0160209004810192826200021057600085556200025b565b82601f106200022b57805160ff19168380011785556200025b565b828001600101855582156200025b579182015b828111156200025b5782518255916020019190600101906200023e565b50620002699291506200026d565b5090565b5b808211156200026957600081556001016200026e565b600181811c908216806200029957607f821691505b60208210811415620002bb57634e487b7160e01b600052602260045260246000fd5b50919050565b6122ea80620002d16000396000f3fe6080604052600436106101c25760003560e01c806367d949a6116100f7578063b3ab66b011610095578063e985e9c511610064578063e985e9c5146104e0578063f2fde38b14610529578063f92134c714610549578063fa30297e146105f657600080fd5b8063b3ab66b014610478578063b88d4fde1461048b578063c87b56dd146104ab578063ce03ec93146104cb57600080fd5b80637e237e2e116100d15780637e237e2e146104055780638da5cb5b1461042557806395d89b4114610443578063a22cb4651461045857600080fd5b806367d949a6146103a357806370a08231146103d0578063715018a6146103f057600080fd5b80632d7eae661161016457806342842e0e1161013e57806342842e0e146103305780634c220f6e1461035057806355f804b3146103635780636352211e1461038357600080fd5b80632d7eae66146102db578063375a069a146102fb5780633ccfd60b1461031b57600080fd5b8063095ea7b3116101a0578063095ea7b31461025657806316c38b3c1461027857806318160ddd1461029857806323b872dd146102bb57600080fd5b806301ffc9a7146101c757806306fdde03146101fc578063081812fc1461021e575b600080fd5b3480156101d357600080fd5b506101e76101e2366004611ec6565b610616565b60405190151581526020015b60405180910390f35b34801561020857600080fd5b50610211610668565b6040516101f39190612089565b34801561022a57600080fd5b5061023e610239366004611ead565b6106fa565b6040516001600160a01b0390911681526020016101f3565b34801561026257600080fd5b50610276610271366004611e68565b61073e565b005b34801561028457600080fd5b50610276610293366004611e92565b6107cc565b3480156102a457600080fd5b50600254600154035b6040519081526020016101f3565b3480156102c757600080fd5b506102766102d6366004611d26565b610812565b3480156102e757600080fd5b506102766102f6366004611ead565b61081d565b34801561030757600080fd5b50610276610316366004611ead565b61084c565b34801561032757600080fd5b50610276610966565b34801561033c57600080fd5b5061027661034b366004611d26565b610a7b565b61027661035e366004611f72565b610a96565b34801561036f57600080fd5b5061027661037e366004611f00565b610d77565b34801561038f57600080fd5b5061023e61039e366004611ead565b610dad565b3480156103af57600080fd5b506102ad6103be366004611cd8565b600a6020526000908152604090205481565b3480156103dc57600080fd5b506102ad6103eb366004611cd8565b610dbf565b3480156103fc57600080fd5b50610276610e0e565b34801561041157600080fd5b50610276610420366004611ead565b610e44565b34801561043157600080fd5b506000546001600160a01b031661023e565b34801561044f57600080fd5b50610211610e73565b34801561046457600080fd5b50610276610473366004611e3e565b610e82565b610276610486366004611ead565b610f18565b34801561049757600080fd5b506102766104a6366004611d62565b6111a3565b3480156104b757600080fd5b506102116104c6366004611ead565b6111f4565b3480156104d757600080fd5b50610276611279565b3480156104ec57600080fd5b506101e76104fb366004611cf3565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561053557600080fd5b50610276610544366004611cd8565b6112e2565b34801561055557600080fd5b50600b54600c54600d54600e54600f5460105460115460125460135461059d989760ff808216986101008304821698620100009093049091169690959194909391929091908b565b604080519b8c5299151560208c0152971515988a01989098529415156060890152608088019390935260a087019190915260c086015260e0850152610100840152610120830191909152610140820152610160016101f3565b34801561060257600080fd5b506102ad610611366004611cd8565b61137d565b60006001600160e01b031982166380ac58cd60e01b148061064757506001600160e01b03198216635b5e139f60e01b145b8061066257506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060038054610677906121dc565b80601f01602080910402602001604051908101604052809291908181526020018280546106a3906121dc565b80156106f05780601f106106c5576101008083540402835291602001916106f0565b820191906000526020600020905b8154815290600101906020018083116106d357829003601f168201915b5050505050905090565b6000610705826113ac565b610722576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b600061074982610dad565b9050806001600160a01b0316836001600160a01b0316141561077e5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061079e575061079c81336104fb565b155b156107bc576040516367d9dca160e11b815260040160405180910390fd5b6107c78383836113d8565b505050565b6000546001600160a01b031633146107ff5760405162461bcd60e51b81526004016107f69061209c565b60405180910390fd5b600c805460ff1916911515919091179055565b6107c7838383611434565b6000546001600160a01b031633146108475760405162461bcd60e51b81526004016107f69061209c565b600b55565b6000546001600160a01b031633146108765760405162461bcd60e51b81526004016107f69061209c565b6040805161016081018252600b548152600c5460ff808216151560208401526101008083048216151594840194909452620100009091041615156060820152600d546080820152600e5460a0820152600f5460c082015260105460e08201526011549181018290526012546101208201526013546101408201529080836109006002546001540390565b61090a919061214e565b11156109285760405162461bcd60e51b81526004016107f6906120d1565b6000610935600585612166565b905060005b8181101561095f5761094d336005611621565b8061095781612217565b91505061093a565b5050505050565b6000546001600160a01b031633146109905760405162461bcd60e51b81526004016107f69061209c565b600260095414156109e35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107f6565b6002600955604051600090339047908381818185875af1925050503d8060008114610a2a576040519150601f19603f3d011682016040523d82523d6000602084013e610a2f565b606091505b5050905080610a735760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b60448201526064016107f6565b506001600955565b6107c7838383604051806020016040528060008152506111a3565b6040805161016081018252600b54808252600c5460ff80821615801560208601819052610100808504841615159787019790975262010000909304909116151560608501819052600d5460808601819052600e5460a0870152600f5460c087015260105460e0870152601154968601879052601254610120870181905260135461014088015295969495939491939092909190610b715760405162461bcd60e51b815260206004820152601960248201527829b0b632903830bab9b2b21037b9103737ba1039ba30b93a1760391b60448201526064016107f6565b83610bbe5760405162461bcd60e51b815260206004820152601960248201527f5072652d73616c65206e6f742079657420737461727465642e0000000000000060448201526064016107f6565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610c378a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b925085915061163f9050565b610c745760405162461bcd60e51b815260206004820152600e60248201526d283937b7b31034b73b30b634b21760911b60448201526064016107f6565b336000908152600a60205260409020548490610c91908d9061214e565b1115610cf95760405162461bcd60e51b815260206004820152603160248201527f5265616368656420746865206d6178696d756d20616d6f756e74206f6620776860448201527034ba32b634b9ba32b2103bb0b63632ba1760791b60648201526084016107f6565b81838c610d096002546001540390565b610d13919061214e565b610d1d919061214e565b1115610d3b5760405162461bcd60e51b81526004016107f6906120d1565b336000908152600a6020526040812080548d9290610d5a90849061214e565b90915550610d6a9050338c611621565b5050505050505050505050565b6000546001600160a01b03163314610da15760405162461bcd60e51b81526004016107f69061209c565b6107c760148383611c13565b6000610db882611655565b5192915050565b60006001600160a01b038216610de8576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205467ffffffffffffffff1690565b6000546001600160a01b03163314610e385760405162461bcd60e51b81526004016107f69061209c565b610e426000611771565b565b6000546001600160a01b03163314610e6e5760405162461bcd60e51b81526004016107f69061209c565b601355565b606060048054610677906121dc565b6001600160a01b038216331415610eac5760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6040805161016081018252600b548152600c5460ff80821615801560208501819052610100808504841615159686018790526201000090940490921615156060850152600d5460808501819052600e5460a08601819052600f5460c0870181905260105460e08801526011549587018690526012546101208801819052601354610140890181905297989597959691959294909290610ff55760405162461bcd60e51b815260206004820152601960248201527829b0b632903830bab9b2b21037b9103737ba1039ba30b93a1760391b60448201526064016107f6565b866110425760405162461bcd60e51b815260206004820152601c60248201527f5075626c69632d73616c65206e6f742079657420737461727465642e0000000060448201526064016107f6565b81838b6110526002546001540390565b61105c919061214e565b611066919061214e565b11156110845760405162461bcd60e51b81526004016107f6906120d1565b336000908152600a60205260409020548414156110dc576110a5848661214e565b8a6110af3361137d565b6110b9919061214e565b11156110d75760405162461bcd60e51b81526004016107f690612108565b61110f565b848a6110e73361137d565b6110f1919061214e565b111561110f5760405162461bcd60e51b81526004016107f690612108565b808a61111e6002546001540390565b611128919061214e565b1161113c57611137338b611621565b611197565b34611147878c61217a565b111561118d5760405162461bcd60e51b815260206004820152601560248201527424b739bab33334b1b4b2b73a103130b630b731b29760591b60448201526064016107f6565b611197338b611621565b50505050505050505050565b6111ae848484611434565b6001600160a01b0383163b151580156111d057506111ce848484846117c1565b155b156111ee576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60606111ff826113ac565b61121c57604051630a14c4b560e41b815260040160405180910390fd5b60006112266118b9565b90508051600014156112475760405180602001604052806000815250611272565b80611251846118c8565b60405160200161126292919061201d565b6040516020818303038152906040525b9392505050565b6000546001600160a01b031633146112a35760405162461bcd60e51b81526004016107f69061209c565b600c805461010060ff620100008084048216150262ff000019841681178390049091161590910261ff001990911662ffff001990921691909117179055565b6000546001600160a01b0316331461130c5760405162461bcd60e51b81526004016107f69061209c565b6001600160a01b0381166113715760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107f6565b61137a81611771565b50565b6001600160a01b038116600090815260066020526040812054600160401b900467ffffffffffffffff16610662565b600060015482108015610662575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061143f82611655565b9050836001600160a01b031681600001516001600160a01b0316146114765760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611494575061149485336104fb565b806114af5750336114a4846106fa565b6001600160a01b0316145b9050806114cf57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0384166114f657604051633a954ecd60e21b815260040160405180910390fd5b611502600084876113d8565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b429092169190910217835587018084529220805491939091166115d85760015482146115d8578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461095f565b61163b8282604051806020016040528060008152506119c6565b5050565b60008261164c85846119d3565b14949350505050565b60408051606081018252600080825260208201819052918101919091528160015481101561175857600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161515918101829052906117565780516001600160a01b0316156116ec579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215611751579392505050565b6116ec565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906117f690339089908890889060040161204c565b602060405180830381600087803b15801561181057600080fd5b505af1925050508015611840575060408051601f3d908101601f1916820190925261183d91810190611ee3565b60015b61189b573d80801561186e576040519150601f19603f3d011682016040523d82523d6000602084013e611873565b606091505b508051611893576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606060148054610677906121dc565b6060816118ec5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611916578061190081612217565b915061190f9050600a83612166565b91506118f0565b60008167ffffffffffffffff81111561193157611931612288565b6040519080825280601f01601f19166020018201604052801561195b576020820181803683370190505b5090505b84156118b157611970600183612199565b915061197d600a86612232565b61198890603061214e565b60f81b81838151811061199d5761199d612272565b60200101906001600160f81b031916908160001a9053506119bf600a86612166565b945061195f565b6107c78383836001611a47565b600081815b8451811015611a3f5760008582815181106119f5576119f5612272565b60200260200101519050808311611a1b5760008381526020829052604090209250611a2c565b600081815260208490526040902092505b5080611a3781612217565b9150506119d8565b509392505050565b6001546001600160a01b038516611a7057604051622e076360e81b815260040160405180910390fd5b83611a8e5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600590925290912080546001600160e01b031916909217600160a01b429092169190910217905580808501838015611b3b57506001600160a01b0387163b15155b15611bc4575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611b8c60008884806001019550886117c1565b611ba9576040516368d2bf6b60e11b815260040160405180910390fd5b80821415611b41578260015414611bbf57600080fd5b611c0a565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415611bc5575b5060015561095f565b828054611c1f906121dc565b90600052602060002090601f016020900481019282611c415760008555611c87565b82601f10611c5a5782800160ff19823516178555611c87565b82800160010185558215611c87579182015b82811115611c87578235825591602001919060010190611c6c565b50611c93929150611c97565b5090565b5b80821115611c935760008155600101611c98565b80356001600160a01b0381168114611cc357600080fd5b919050565b80358015158114611cc357600080fd5b600060208284031215611cea57600080fd5b61127282611cac565b60008060408385031215611d0657600080fd5b611d0f83611cac565b9150611d1d60208401611cac565b90509250929050565b600080600060608486031215611d3b57600080fd5b611d4484611cac565b9250611d5260208501611cac565b9150604084013590509250925092565b60008060008060808587031215611d7857600080fd5b611d8185611cac565b9350611d8f60208601611cac565b925060408501359150606085013567ffffffffffffffff80821115611db357600080fd5b818701915087601f830112611dc757600080fd5b813581811115611dd957611dd9612288565b604051601f8201601f19908116603f01168101908382118183101715611e0157611e01612288565b816040528281528a6020848701011115611e1a57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611e5157600080fd5b611e5a83611cac565b9150611d1d60208401611cc8565b60008060408385031215611e7b57600080fd5b611e8483611cac565b946020939093013593505050565b600060208284031215611ea457600080fd5b61127282611cc8565b600060208284031215611ebf57600080fd5b5035919050565b600060208284031215611ed857600080fd5b81356112728161229e565b600060208284031215611ef557600080fd5b81516112728161229e565b60008060208385031215611f1357600080fd5b823567ffffffffffffffff80821115611f2b57600080fd5b818501915085601f830112611f3f57600080fd5b813581811115611f4e57600080fd5b866020828501011115611f6057600080fd5b60209290920196919550909350505050565b600080600060408486031215611f8757600080fd5b83359250602084013567ffffffffffffffff80821115611fa657600080fd5b818601915086601f830112611fba57600080fd5b813581811115611fc957600080fd5b8760208260051b8501011115611fde57600080fd5b6020830194508093505050509250925092565b600081518084526120098160208601602086016121b0565b601f01601f19169290920160200192915050565b6000835161202f8184602088016121b0565b8351908301906120438183602088016121b0565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061207f90830184611ff1565b9695505050505050565b6020815260006112726020830184611ff1565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601b908201527f496e73756666696369656e74207175616e74697479206c6566742e0000000000604082015260600190565b60208082526026908201527f4578636565647320746865206d6178696d756d206e756d62657220706572207760408201526530b63632ba1760d11b606082015260800190565b6000821982111561216157612161612246565b500190565b6000826121755761217561225c565b500490565b600081600019048311821515161561219457612194612246565b500290565b6000828210156121ab576121ab612246565b500390565b60005b838110156121cb5781810151838201526020016121b3565b838111156111ee5750506000910152565b600181811c908216806121f057607f821691505b6020821081141561221157634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561222b5761222b612246565b5060010190565b6000826122415761224161225c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461137a57600080fdfea2646970667358221220057aa10e56b96bfb70136bd6eceddd77b4c0847b72e49a1d7a79c2da802b5b9d64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101c25760003560e01c806367d949a6116100f7578063b3ab66b011610095578063e985e9c511610064578063e985e9c5146104e0578063f2fde38b14610529578063f92134c714610549578063fa30297e146105f657600080fd5b8063b3ab66b014610478578063b88d4fde1461048b578063c87b56dd146104ab578063ce03ec93146104cb57600080fd5b80637e237e2e116100d15780637e237e2e146104055780638da5cb5b1461042557806395d89b4114610443578063a22cb4651461045857600080fd5b806367d949a6146103a357806370a08231146103d0578063715018a6146103f057600080fd5b80632d7eae661161016457806342842e0e1161013e57806342842e0e146103305780634c220f6e1461035057806355f804b3146103635780636352211e1461038357600080fd5b80632d7eae66146102db578063375a069a146102fb5780633ccfd60b1461031b57600080fd5b8063095ea7b3116101a0578063095ea7b31461025657806316c38b3c1461027857806318160ddd1461029857806323b872dd146102bb57600080fd5b806301ffc9a7146101c757806306fdde03146101fc578063081812fc1461021e575b600080fd5b3480156101d357600080fd5b506101e76101e2366004611ec6565b610616565b60405190151581526020015b60405180910390f35b34801561020857600080fd5b50610211610668565b6040516101f39190612089565b34801561022a57600080fd5b5061023e610239366004611ead565b6106fa565b6040516001600160a01b0390911681526020016101f3565b34801561026257600080fd5b50610276610271366004611e68565b61073e565b005b34801561028457600080fd5b50610276610293366004611e92565b6107cc565b3480156102a457600080fd5b50600254600154035b6040519081526020016101f3565b3480156102c757600080fd5b506102766102d6366004611d26565b610812565b3480156102e757600080fd5b506102766102f6366004611ead565b61081d565b34801561030757600080fd5b50610276610316366004611ead565b61084c565b34801561032757600080fd5b50610276610966565b34801561033c57600080fd5b5061027661034b366004611d26565b610a7b565b61027661035e366004611f72565b610a96565b34801561036f57600080fd5b5061027661037e366004611f00565b610d77565b34801561038f57600080fd5b5061023e61039e366004611ead565b610dad565b3480156103af57600080fd5b506102ad6103be366004611cd8565b600a6020526000908152604090205481565b3480156103dc57600080fd5b506102ad6103eb366004611cd8565b610dbf565b3480156103fc57600080fd5b50610276610e0e565b34801561041157600080fd5b50610276610420366004611ead565b610e44565b34801561043157600080fd5b506000546001600160a01b031661023e565b34801561044f57600080fd5b50610211610e73565b34801561046457600080fd5b50610276610473366004611e3e565b610e82565b610276610486366004611ead565b610f18565b34801561049757600080fd5b506102766104a6366004611d62565b6111a3565b3480156104b757600080fd5b506102116104c6366004611ead565b6111f4565b3480156104d757600080fd5b50610276611279565b3480156104ec57600080fd5b506101e76104fb366004611cf3565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561053557600080fd5b50610276610544366004611cd8565b6112e2565b34801561055557600080fd5b50600b54600c54600d54600e54600f5460105460115460125460135461059d989760ff808216986101008304821698620100009093049091169690959194909391929091908b565b604080519b8c5299151560208c0152971515988a01989098529415156060890152608088019390935260a087019190915260c086015260e0850152610100840152610120830191909152610140820152610160016101f3565b34801561060257600080fd5b506102ad610611366004611cd8565b61137d565b60006001600160e01b031982166380ac58cd60e01b148061064757506001600160e01b03198216635b5e139f60e01b145b8061066257506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060038054610677906121dc565b80601f01602080910402602001604051908101604052809291908181526020018280546106a3906121dc565b80156106f05780601f106106c5576101008083540402835291602001916106f0565b820191906000526020600020905b8154815290600101906020018083116106d357829003601f168201915b5050505050905090565b6000610705826113ac565b610722576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b600061074982610dad565b9050806001600160a01b0316836001600160a01b0316141561077e5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061079e575061079c81336104fb565b155b156107bc576040516367d9dca160e11b815260040160405180910390fd5b6107c78383836113d8565b505050565b6000546001600160a01b031633146107ff5760405162461bcd60e51b81526004016107f69061209c565b60405180910390fd5b600c805460ff1916911515919091179055565b6107c7838383611434565b6000546001600160a01b031633146108475760405162461bcd60e51b81526004016107f69061209c565b600b55565b6000546001600160a01b031633146108765760405162461bcd60e51b81526004016107f69061209c565b6040805161016081018252600b548152600c5460ff808216151560208401526101008083048216151594840194909452620100009091041615156060820152600d546080820152600e5460a0820152600f5460c082015260105460e08201526011549181018290526012546101208201526013546101408201529080836109006002546001540390565b61090a919061214e565b11156109285760405162461bcd60e51b81526004016107f6906120d1565b6000610935600585612166565b905060005b8181101561095f5761094d336005611621565b8061095781612217565b91505061093a565b5050505050565b6000546001600160a01b031633146109905760405162461bcd60e51b81526004016107f69061209c565b600260095414156109e35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107f6565b6002600955604051600090339047908381818185875af1925050503d8060008114610a2a576040519150601f19603f3d011682016040523d82523d6000602084013e610a2f565b606091505b5050905080610a735760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b60448201526064016107f6565b506001600955565b6107c7838383604051806020016040528060008152506111a3565b6040805161016081018252600b54808252600c5460ff80821615801560208601819052610100808504841615159787019790975262010000909304909116151560608501819052600d5460808601819052600e5460a0870152600f5460c087015260105460e0870152601154968601879052601254610120870181905260135461014088015295969495939491939092909190610b715760405162461bcd60e51b815260206004820152601960248201527829b0b632903830bab9b2b21037b9103737ba1039ba30b93a1760391b60448201526064016107f6565b83610bbe5760405162461bcd60e51b815260206004820152601960248201527f5072652d73616c65206e6f742079657420737461727465642e0000000000000060448201526064016107f6565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610c378a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b925085915061163f9050565b610c745760405162461bcd60e51b815260206004820152600e60248201526d283937b7b31034b73b30b634b21760911b60448201526064016107f6565b336000908152600a60205260409020548490610c91908d9061214e565b1115610cf95760405162461bcd60e51b815260206004820152603160248201527f5265616368656420746865206d6178696d756d20616d6f756e74206f6620776860448201527034ba32b634b9ba32b2103bb0b63632ba1760791b60648201526084016107f6565b81838c610d096002546001540390565b610d13919061214e565b610d1d919061214e565b1115610d3b5760405162461bcd60e51b81526004016107f6906120d1565b336000908152600a6020526040812080548d9290610d5a90849061214e565b90915550610d6a9050338c611621565b5050505050505050505050565b6000546001600160a01b03163314610da15760405162461bcd60e51b81526004016107f69061209c565b6107c760148383611c13565b6000610db882611655565b5192915050565b60006001600160a01b038216610de8576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205467ffffffffffffffff1690565b6000546001600160a01b03163314610e385760405162461bcd60e51b81526004016107f69061209c565b610e426000611771565b565b6000546001600160a01b03163314610e6e5760405162461bcd60e51b81526004016107f69061209c565b601355565b606060048054610677906121dc565b6001600160a01b038216331415610eac5760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6040805161016081018252600b548152600c5460ff80821615801560208501819052610100808504841615159686018790526201000090940490921615156060850152600d5460808501819052600e5460a08601819052600f5460c0870181905260105460e08801526011549587018690526012546101208801819052601354610140890181905297989597959691959294909290610ff55760405162461bcd60e51b815260206004820152601960248201527829b0b632903830bab9b2b21037b9103737ba1039ba30b93a1760391b60448201526064016107f6565b866110425760405162461bcd60e51b815260206004820152601c60248201527f5075626c69632d73616c65206e6f742079657420737461727465642e0000000060448201526064016107f6565b81838b6110526002546001540390565b61105c919061214e565b611066919061214e565b11156110845760405162461bcd60e51b81526004016107f6906120d1565b336000908152600a60205260409020548414156110dc576110a5848661214e565b8a6110af3361137d565b6110b9919061214e565b11156110d75760405162461bcd60e51b81526004016107f690612108565b61110f565b848a6110e73361137d565b6110f1919061214e565b111561110f5760405162461bcd60e51b81526004016107f690612108565b808a61111e6002546001540390565b611128919061214e565b1161113c57611137338b611621565b611197565b34611147878c61217a565b111561118d5760405162461bcd60e51b815260206004820152601560248201527424b739bab33334b1b4b2b73a103130b630b731b29760591b60448201526064016107f6565b611197338b611621565b50505050505050505050565b6111ae848484611434565b6001600160a01b0383163b151580156111d057506111ce848484846117c1565b155b156111ee576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60606111ff826113ac565b61121c57604051630a14c4b560e41b815260040160405180910390fd5b60006112266118b9565b90508051600014156112475760405180602001604052806000815250611272565b80611251846118c8565b60405160200161126292919061201d565b6040516020818303038152906040525b9392505050565b6000546001600160a01b031633146112a35760405162461bcd60e51b81526004016107f69061209c565b600c805461010060ff620100008084048216150262ff000019841681178390049091161590910261ff001990911662ffff001990921691909117179055565b6000546001600160a01b0316331461130c5760405162461bcd60e51b81526004016107f69061209c565b6001600160a01b0381166113715760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107f6565b61137a81611771565b50565b6001600160a01b038116600090815260066020526040812054600160401b900467ffffffffffffffff16610662565b600060015482108015610662575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061143f82611655565b9050836001600160a01b031681600001516001600160a01b0316146114765760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611494575061149485336104fb565b806114af5750336114a4846106fa565b6001600160a01b0316145b9050806114cf57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0384166114f657604051633a954ecd60e21b815260040160405180910390fd5b611502600084876113d8565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b429092169190910217835587018084529220805491939091166115d85760015482146115d8578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461095f565b61163b8282604051806020016040528060008152506119c6565b5050565b60008261164c85846119d3565b14949350505050565b60408051606081018252600080825260208201819052918101919091528160015481101561175857600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161515918101829052906117565780516001600160a01b0316156116ec579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215611751579392505050565b6116ec565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906117f690339089908890889060040161204c565b602060405180830381600087803b15801561181057600080fd5b505af1925050508015611840575060408051601f3d908101601f1916820190925261183d91810190611ee3565b60015b61189b573d80801561186e576040519150601f19603f3d011682016040523d82523d6000602084013e611873565b606091505b508051611893576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606060148054610677906121dc565b6060816118ec5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611916578061190081612217565b915061190f9050600a83612166565b91506118f0565b60008167ffffffffffffffff81111561193157611931612288565b6040519080825280601f01601f19166020018201604052801561195b576020820181803683370190505b5090505b84156118b157611970600183612199565b915061197d600a86612232565b61198890603061214e565b60f81b81838151811061199d5761199d612272565b60200101906001600160f81b031916908160001a9053506119bf600a86612166565b945061195f565b6107c78383836001611a47565b600081815b8451811015611a3f5760008582815181106119f5576119f5612272565b60200260200101519050808311611a1b5760008381526020829052604090209250611a2c565b600081815260208490526040902092505b5080611a3781612217565b9150506119d8565b509392505050565b6001546001600160a01b038516611a7057604051622e076360e81b815260040160405180910390fd5b83611a8e5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600590925290912080546001600160e01b031916909217600160a01b429092169190910217905580808501838015611b3b57506001600160a01b0387163b15155b15611bc4575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611b8c60008884806001019550886117c1565b611ba9576040516368d2bf6b60e11b815260040160405180910390fd5b80821415611b41578260015414611bbf57600080fd5b611c0a565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415611bc5575b5060015561095f565b828054611c1f906121dc565b90600052602060002090601f016020900481019282611c415760008555611c87565b82601f10611c5a5782800160ff19823516178555611c87565b82800160010185558215611c87579182015b82811115611c87578235825591602001919060010190611c6c565b50611c93929150611c97565b5090565b5b80821115611c935760008155600101611c98565b80356001600160a01b0381168114611cc357600080fd5b919050565b80358015158114611cc357600080fd5b600060208284031215611cea57600080fd5b61127282611cac565b60008060408385031215611d0657600080fd5b611d0f83611cac565b9150611d1d60208401611cac565b90509250929050565b600080600060608486031215611d3b57600080fd5b611d4484611cac565b9250611d5260208501611cac565b9150604084013590509250925092565b60008060008060808587031215611d7857600080fd5b611d8185611cac565b9350611d8f60208601611cac565b925060408501359150606085013567ffffffffffffffff80821115611db357600080fd5b818701915087601f830112611dc757600080fd5b813581811115611dd957611dd9612288565b604051601f8201601f19908116603f01168101908382118183101715611e0157611e01612288565b816040528281528a6020848701011115611e1a57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611e5157600080fd5b611e5a83611cac565b9150611d1d60208401611cc8565b60008060408385031215611e7b57600080fd5b611e8483611cac565b946020939093013593505050565b600060208284031215611ea457600080fd5b61127282611cc8565b600060208284031215611ebf57600080fd5b5035919050565b600060208284031215611ed857600080fd5b81356112728161229e565b600060208284031215611ef557600080fd5b81516112728161229e565b60008060208385031215611f1357600080fd5b823567ffffffffffffffff80821115611f2b57600080fd5b818501915085601f830112611f3f57600080fd5b813581811115611f4e57600080fd5b866020828501011115611f6057600080fd5b60209290920196919550909350505050565b600080600060408486031215611f8757600080fd5b83359250602084013567ffffffffffffffff80821115611fa657600080fd5b818601915086601f830112611fba57600080fd5b813581811115611fc957600080fd5b8760208260051b8501011115611fde57600080fd5b6020830194508093505050509250925092565b600081518084526120098160208601602086016121b0565b601f01601f19169290920160200192915050565b6000835161202f8184602088016121b0565b8351908301906120438183602088016121b0565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061207f90830184611ff1565b9695505050505050565b6020815260006112726020830184611ff1565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601b908201527f496e73756666696369656e74207175616e74697479206c6566742e0000000000604082015260600190565b60208082526026908201527f4578636565647320746865206d6178696d756d206e756d62657220706572207760408201526530b63632ba1760d11b606082015260800190565b6000821982111561216157612161612246565b500190565b6000826121755761217561225c565b500490565b600081600019048311821515161561219457612194612246565b500290565b6000828210156121ab576121ab612246565b500390565b60005b838110156121cb5781810151838201526020016121b3565b838111156111ee5750506000910152565b600181811c908216806121f057607f821691505b6020821081141561221157634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561222b5761222b612246565b5060010190565b6000826122415761224161225c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461137a57600080fdfea2646970667358221220057aa10e56b96bfb70136bd6eceddd77b4c0847b72e49a1d7a79c2da802b5b9d64736f6c63430008070033

Deployed Bytecode Sourcemap

50513:6123:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29590:305;;;;;;;;;;-1:-1:-1;29590:305:0;;;;;:::i;:::-;;:::i;:::-;;;7198:14:1;;7191:22;7173:41;;7161:2;7146:18;29590:305:0;;;;;;;;32703:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;34206:204::-;;;;;;;;;;-1:-1:-1;34206:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6496:32:1;;;6478:51;;6466:2;6451:18;34206:204:0;6332:203:1;33769:371:0;;;;;;;;;;-1:-1:-1;33769:371:0;;;;;:::i;:::-;;:::i;:::-;;55285:96;;;;;;;;;;-1:-1:-1;55285:96:0;;;;;:::i;:::-;;:::i;28839:303::-;;;;;;;;;;-1:-1:-1;29093:12:0;;29077:13;;:28;28839:303;;;12939:25:1;;;12927:2;12912:18;28839:303:0;12793:177:1;35071:170:0;;;;;;;;;;-1:-1:-1;35071:170:0;;;;;:::i;:::-;;:::i;55389:101::-;;;;;;;;;;-1:-1:-1;55389:101:0;;;;;:::i;:::-;;:::i;55737:429::-;;;;;;;;;;-1:-1:-1;55737:429:0;;;;;:::i;:::-;;:::i;56447:186::-;;;;;;;;;;;;;:::i;35312:185::-;;;;;;;;;;-1:-1:-1;35312:185:0;;;;;:::i;:::-;;:::i;52293:1168::-;;;;;;:::i;:::-;;:::i;56333:106::-;;;;;;;;;;-1:-1:-1;56333:106:0;;;;;:::i;:::-;;:::i;32511:125::-;;;;;;;;;;-1:-1:-1;32511:125:0;;;;;:::i;:::-;;:::i;50573:53::-;;;;;;;;;;-1:-1:-1;50573:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;29959:206;;;;;;;;;;-1:-1:-1;29959:206:0;;;;;:::i;:::-;;:::i;49061:103::-;;;;;;;;;;;;;:::i;55498:105::-;;;;;;;;;;-1:-1:-1;55498:105:0;;;;;:::i;:::-;;:::i;48410:87::-;;;;;;;;;;-1:-1:-1;48456:7:0;48483:6;-1:-1:-1;;;;;48483:6:0;48410:87;;32872:104;;;;;;;;;;;;;:::i;34482:287::-;;;;;;;;;;-1:-1:-1;34482:287:0;;;;;:::i;:::-;;:::i;53469:1625::-;;;;;;:::i;:::-;;:::i;35568:369::-;;;;;;;;;;-1:-1:-1;35568:369:0;;;;;:::i;:::-;;:::i;33047:318::-;;;;;;;;;;-1:-1:-1;33047:318:0;;;;;:::i;:::-;;:::i;55102:175::-;;;;;;;;;;;;;:::i;34840:164::-;;;;;;;;;;-1:-1:-1;34840:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;34961:25:0;;;34937:4;34961:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34840:164;49319:201;;;;;;;;;;-1:-1:-1;49319:201:0;;;;;:::i;:::-;;:::i;50995:32::-;;;;;;;;;;-1:-1:-1;50995:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7635:25:1;;;7703:14;;7696:22;7691:2;7676:18;;7669:50;7762:14;;7755:22;7735:18;;;7728:50;;;;7821:14;;7814:22;7809:2;7794:18;;7787:50;7868:3;7853:19;;7846:35;;;;7912:3;7897:19;;7890:35;;;;7956:3;7941:19;;7934:35;8000:3;7985:19;;7978:35;8044:3;8029:19;;8022:35;8088:3;8073:19;;8066:35;;;;8132:3;8117:19;;8110:36;7622:3;7607:19;50995:32:0;7225:927:1;55615:114:0;;;;;;;;;;-1:-1:-1;55615:114:0;;;;;:::i;:::-;;:::i;29590:305::-;29692:4;-1:-1:-1;;;;;;29729:40:0;;-1:-1:-1;;;29729:40:0;;:105;;-1:-1:-1;;;;;;;29786:48:0;;-1:-1:-1;;;29786:48:0;29729:105;:158;;;-1:-1:-1;;;;;;;;;;11425:40:0;;;29851:36;29709:178;29590:305;-1:-1:-1;;29590:305:0:o;32703:100::-;32757:13;32790:5;32783:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32703:100;:::o;34206:204::-;34274:7;34299:16;34307:7;34299;:16::i;:::-;34294:64;;34324:34;;-1:-1:-1;;;34324:34:0;;;;;;;;;;;34294:64;-1:-1:-1;34378:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;34378:24:0;;34206:204::o;33769:371::-;33842:13;33858:24;33874:7;33858:15;:24::i;:::-;33842:40;;33903:5;-1:-1:-1;;;;;33897:11:0;:2;-1:-1:-1;;;;;33897:11:0;;33893:48;;;33917:24;;-1:-1:-1;;;33917:24:0;;;;;;;;;;;33893:48;25186:10;-1:-1:-1;;;;;33958:21:0;;;;;;:63;;-1:-1:-1;33984:37:0;34001:5;25186:10;34840:164;:::i;33984:37::-;33983:38;33958:63;33954:138;;;34045:35;;-1:-1:-1;;;34045:35:0;;;;;;;;;;;33954:138;34104:28;34113:2;34117:7;34126:5;34104:8;:28::i;:::-;33831:309;33769:371;;:::o;55285:96::-;48456:7;48483:6;-1:-1:-1;;;;;48483:6:0;25186:10;48630:23;48622:68;;;;-1:-1:-1;;;48622:68:0;;;;;;;:::i;:::-;;;;;;;;;55345:19;:28;;-1:-1:-1;;55345:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55285:96::o;35071:170::-;35205:28;35215:4;35221:2;35225:7;35205:9;:28::i;55389:101::-;48456:7;48483:6;-1:-1:-1;;;;;48483:6:0;25186:10;48630:23;48622:68;;;;-1:-1:-1;;;48622:68:0;;;;;;;:::i;:::-;55453:12:::1;:29:::0;55389:101::o;55737:429::-;48456:7;48483:6;-1:-1:-1;;;;;48483:6:0;25186:10;48630:23;48622:68;;;;-1:-1:-1;;;48622:68:0;;;;;;;:::i;:::-;55802:41:::1;::::0;;::::1;::::0;::::1;::::0;;55831:12:::1;55802:41:::0;;;;;::::1;::::0;;::::1;;;;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;;::::0;;;;;;;;;;::::1;;;;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55936:8;55920:13:::1;29093:12:::0;;29077:13;;:28;;28839:303;55920:13:::1;:24;;;;:::i;:::-;:37;;55912:100;;;;-1:-1:-1::0;;;55912:100:0::1;;;;;;;:::i;:::-;56025:17;56045:12;56056:1;56045:8:::0;:12:::1;:::i;:::-;56025:32;;56073:9;56068:91;56092:9;56088:1;:13;56068:91;;;56123:24;56133:10;56145:1;56123:9;:24::i;:::-;56103:3:::0;::::1;::::0;::::1;:::i;:::-;;;;56068:91;;;;55791:375;;;55737:429:::0;:::o;56447:186::-;48456:7;48483:6;-1:-1:-1;;;;;48483:6:0;25186:10;48630:23;48622:68;;;;-1:-1:-1;;;48622:68:0;;;;;;;:::i;:::-;23480:1:::1;24078:7;;:19;;24070:63;;;::::0;-1:-1:-1;;;24070:63:0;;11518:2:1;24070:63:0::1;::::0;::::1;11500:21:1::0;11557:2;11537:18;;;11530:30;11596:33;11576:18;;;11569:61;11647:18;;24070:63:0::1;11316:355:1::0;24070:63:0::1;23480:1;24211:7;:18:::0;56529:49:::2;::::0;56511:12:::2;::::0;56529:10:::2;::::0;56552:21:::2;::::0;56511:12;56529:49;56511:12;56529:49;56552:21;56529:10;:49:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56510:68;;;56597:7;56589:36;;;::::0;-1:-1:-1;;;56589:36:0;;11173:2:1;56589:36:0::2;::::0;::::2;11155:21:1::0;11212:2;11192:18;;;11185:30;-1:-1:-1;;;11231:18:1;;;11224:46;11287:18;;56589:36:0::2;10971:340:1::0;56589:36:0::2;-1:-1:-1::0;23436:1:0::1;24390:7;:22:::0;56447:186::o;35312:185::-;35450:39;35467:4;35473:2;35477:7;35450:39;;;;;;;;;;;;:16;:39::i;52293:1168::-;52409:41;;;;;;;;52438:12;52409:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52799:45;;;;-1:-1:-1;;;52799:45:0;;12641:2:1;52799:45:0;;;12623:21:1;12680:2;12660:18;;;12653:30;-1:-1:-1;;;12699:18:1;;;12692:55;12764:18;;52799:45:0;12439:349:1;52799:45:0;52863:9;52855:47;;;;-1:-1:-1;;;52855:47:0;;8990:2:1;52855:47:0;;;8972:21:1;9029:2;9009:18;;;9002:30;9068:27;9048:18;;;9041:55;9113:18;;52855:47:0;8788:349:1;52855:47:0;52940:28;;-1:-1:-1;;52957:10:0;5562:2:1;5558:15;5554:53;52940:28:0;;;5542:66:1;52915:12:0;;5624::1;;52940:28:0;;;;;;;;;;;;52930:39;;;;;;52915:54;;52988:41;53007:5;;52988:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53014:8:0;;-1:-1:-1;53024:4:0;;-1:-1:-1;52988:18:0;;-1:-1:-1;52988:41:0:i;:::-;52980:68;;;;-1:-1:-1;;;52980:68:0;;9344:2:1;52980:68:0;;;9326:21:1;9383:2;9363:18;;;9356:30;-1:-1:-1;;;9402:18:1;;;9395:44;9456:18;;52980:68:0;9142:338:1;52980:68:0;53100:10;53081:30;;;;:18;:30;;;;;;53126:14;;53081:41;;53114:8;;53081:41;:::i;:::-;:59;;53059:158;;;;-1:-1:-1;;;53059:158:0;;10398:2:1;53059:158:0;;;10380:21:1;10437:2;10417:18;;;10410:30;10476:34;10456:18;;;10449:62;-1:-1:-1;;;10527:18:1;;;10520:47;10584:19;;53059:158:0;10196:413:1;53059:158:0;53294:9;53277:13;53266:8;53250:13;29093:12;;29077:13;;:28;;28839:303;53250:13;:24;;;;:::i;:::-;:40;;;;:::i;:::-;:53;;53228:130;;;;-1:-1:-1;;;53228:130:0;;;;;;;:::i;:::-;53388:10;53369:30;;;;:18;:30;;;;;:42;;53403:8;;53369:30;:42;;53403:8;;53369:42;:::i;:::-;;;;-1:-1:-1;53422:31:0;;-1:-1:-1;53432:10:0;53444:8;53422:9;:31::i;:::-;52398:1063;;;;;;;;52293:1168;;;:::o;56333:106::-;48456:7;48483:6;-1:-1:-1;;;;;48483:6:0;25186:10;48630:23;48622:68;;;;-1:-1:-1;;;48622:68:0;;;;;;;:::i;:::-;56408:23:::1;:13;56424:7:::0;;56408:23:::1;:::i;32511:125::-:0;32575:7;32602:21;32615:7;32602:12;:21::i;:::-;:26;;32511:125;-1:-1:-1;;32511:125:0:o;29959:206::-;30023:7;-1:-1:-1;;;;;30047:19:0;;30043:60;;30075:28;;-1:-1:-1;;;30075:28:0;;;;;;;;;;;30043:60;-1:-1:-1;;;;;;30129:19:0;;;;;:12;:19;;;;;:27;;;;29959:206::o;49061:103::-;48456:7;48483:6;-1:-1:-1;;;;;48483:6:0;25186:10;48630:23;48622:68;;;;-1:-1:-1;;;48622:68:0;;;;;;;:::i;:::-;49126:30:::1;49153:1;49126:18;:30::i;:::-;49061:103::o:0;55498:105::-;48456:7;48483:6;-1:-1:-1;;;;;48483:6:0;25186:10;48630:23;48622:68;;;;-1:-1:-1;;;48622:68:0;;;;;;;:::i;:::-;55564:22;:31;55498:105::o;32872:104::-;32928:13;32961:7;32954:14;;;;;:::i;34482:287::-;-1:-1:-1;;;;;34581:24:0;;25186:10;34581:24;34577:54;;;34614:17;;-1:-1:-1;;;34614:17:0;;;;;;;;;;;34577:54;25186:10;34644:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;34644:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;34644:53:0;;;;;;;;;;34713:48;;7173:41:1;;;34644:42:0;;25186:10;34713:48;;7146:18:1;34713:48:0;;;;;;;34482:287;;:::o;53469:1625::-;53541:41;;;;;;;;53570:12;53541:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54079:45;;;;-1:-1:-1;;;54079:45:0;;12641:2:1;54079:45:0;;;12623:21:1;12680:2;12660:18;;;12653:30;-1:-1:-1;;;12699:18:1;;;12692:55;12764:18;;54079:45:0;12439:349:1;54079:45:0;54143:12;54135:53;;;;-1:-1:-1;;;54135:53:0;;10816:2:1;54135:53:0;;;10798:21:1;10855:2;10835:18;;;10828:30;10894;10874:18;;;10867:58;10942:18;;54135:53:0;10614:352:1;54135:53:0;54265:9;54248:13;54237:8;54221:13;29093:12;;29077:13;;:28;;28839:303;54221:13;:24;;;;:::i;:::-;:40;;;;:::i;:::-;:53;;54199:130;;;;-1:-1:-1;;;54199:130:0;;;;;;;:::i;:::-;54365:10;54346:30;;;;:18;:30;;;;;;:48;;54342:429;;;54473:34;54493:14;54473:17;:34;:::i;:::-;54461:8;54433:25;54447:10;54433:13;:25::i;:::-;:36;;;;:::i;:::-;:74;;54409:168;;;;-1:-1:-1;;;54409:168:0;;;;;;;:::i;:::-;54342:429;;;54672:17;54660:8;54632:25;54646:10;54632:13;:25::i;:::-;:36;;;;:::i;:::-;:57;;54608:151;;;;-1:-1:-1;;;54608:151:0;;;;;;;:::i;:::-;54815:9;54803:8;54787:13;29093:12;;29077:13;;:28;;28839:303;54787:13;:24;;;;:::i;:::-;:37;54783:302;;54841:31;54851:10;54863:8;54841:9;:31::i;:::-;54783:302;;;54961:9;54931:26;54942:15;54931:8;:26;:::i;:::-;:39;;54905:122;;;;-1:-1:-1;;;54905:122:0;;9687:2:1;54905:122:0;;;9669:21:1;9726:2;9706:18;;;9699:30;-1:-1:-1;;;9745:18:1;;;9738:51;9806:18;;54905:122:0;9485:345:1;54905:122:0;55042:31;55052:10;55064:8;55042:9;:31::i;:::-;53528:1566;;;;;;;;;53469:1625;:::o;35568:369::-;35735:28;35745:4;35751:2;35755:7;35735:9;:28::i;:::-;-1:-1:-1;;;;;35778:13:0;;1528:19;:23;;35778:76;;;;;35798:56;35829:4;35835:2;35839:7;35848:5;35798:30;:56::i;:::-;35797:57;35778:76;35774:156;;;35878:40;;-1:-1:-1;;;35878:40:0;;;;;;;;;;;35774:156;35568:369;;;;:::o;33047:318::-;33120:13;33151:16;33159:7;33151;:16::i;:::-;33146:59;;33176:29;;-1:-1:-1;;;33176:29:0;;;;;;;;;;;33146:59;33218:21;33242:10;:8;:10::i;:::-;33218:34;;33276:7;33270:21;33295:1;33270:26;;:87;;;;;;;;;;;;;;;;;33323:7;33332:18;:7;:16;:18::i;:::-;33306:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33270:87;33263:94;33047:318;-1:-1:-1;;;33047:318:0:o;55102:175::-;48456:7;48483:6;-1:-1:-1;;;;;48483:6:0;25186:10;48630:23;48622:68;;;;-1:-1:-1;;;48622:68:0;;;;;;;:::i;:::-;55182:22;;;::::1;;::::0;;;::::1;::::0;::::1;55181:23;55156:48;-1:-1:-1::0;;55156:48:0;::::1;::::0;::::1;55244:25:::0;;::::1;::::0;;::::1;55243:26;55215:54:::0;;::::1;-1:-1:-1::0;;55215:54:0;;;-1:-1:-1;;55215:54:0;;;;;;;::::1;::::0;;55102:175::o;49319:201::-;48456:7;48483:6;-1:-1:-1;;;;;48483:6:0;25186:10;48630:23;48622:68;;;;-1:-1:-1;;;48622:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49408:22:0;::::1;49400:73;;;::::0;-1:-1:-1;;;49400:73:0;;8583:2:1;49400:73:0::1;::::0;::::1;8565:21:1::0;8622:2;8602:18;;;8595:30;8661:34;8641:18;;;8634:62;-1:-1:-1;;;8712:18:1;;;8705:36;8758:19;;49400:73:0::1;8381:402:1::0;49400:73:0::1;49484:28;49503:8;49484:18;:28::i;:::-;49319:201:::0;:::o;55615:114::-;-1:-1:-1;;;;;30343:19:0;;55674:7;30343:19;;;:12;:19;;;;;:32;-1:-1:-1;;;30343:32:0;;;;55701:20;30247:137;36192:187;36249:4;36313:13;;36303:7;:23;36273:98;;;;-1:-1:-1;;36344:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;36344:27:0;;;;36343:28;;36192:187::o;44362:196::-;44477:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;44477:29:0;-1:-1:-1;;;;;44477:29:0;;;;;;;;;44522:28;;44477:24;;44522:28;;;;;;;44362:196;;;:::o;39305:2130::-;39420:35;39458:21;39471:7;39458:12;:21::i;:::-;39420:59;;39518:4;-1:-1:-1;;;;;39496:26:0;:13;:18;;;-1:-1:-1;;;;;39496:26:0;;39492:67;;39531:28;;-1:-1:-1;;;39531:28:0;;;;;;;;;;;39492:67;39572:22;25186:10;-1:-1:-1;;;;;39598:20:0;;;;:73;;-1:-1:-1;39635:36:0;39652:4;25186:10;34840:164;:::i;39635:36::-;39598:126;;;-1:-1:-1;25186:10:0;39688:20;39700:7;39688:11;:20::i;:::-;-1:-1:-1;;;;;39688:36:0;;39598:126;39572:153;;39743:17;39738:66;;39769:35;;-1:-1:-1;;;39769:35:0;;;;;;;;;;;39738:66;-1:-1:-1;;;;;39819:16:0;;39815:52;;39844:23;;-1:-1:-1;;;39844:23:0;;;;;;;;;;;39815:52;39988:35;40005:1;40009:7;40018:4;39988:8;:35::i;:::-;-1:-1:-1;;;;;40319:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;40319:31:0;;;;;;;-1:-1:-1;;40319:31:0;;;;;;;40365:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;40365:29:0;;;;;;;;;;;40445:20;;;:11;:20;;;;;;40480:18;;-1:-1:-1;;;;;;40513:49:0;;;;-1:-1:-1;;;40546:15:0;40513:49;;;;;;;;;;40836:11;;40896:24;;;;;40939:13;;40445:20;;40896:24;;40939:13;40935:384;;41149:13;;41134:11;:28;41130:174;;41187:20;;41256:28;;;;41230:54;;-1:-1:-1;;;41230:54:0;-1:-1:-1;;;;;;41230:54:0;;;-1:-1:-1;;;;;41187:20:0;;41230:54;;;;41130:174;40294:1036;;;41366:7;41362:2;-1:-1:-1;;;;;41347:27:0;41356:4;-1:-1:-1;;;;;41347:27:0;;;;;;;;;;;41385:42;35568:369;36387:104;36456:27;36466:2;36470:8;36456:27;;;;;;;;;;;;:9;:27::i;:::-;36387:104;;:::o;18078:190::-;18203:4;18256;18227:25;18240:5;18247:4;18227:12;:25::i;:::-;:33;;18078:190;-1:-1:-1;;;;18078:190:0:o;31340:1109::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;31451:7:0;31534:13;;31527:4;:20;31496:886;;;31568:31;31602:17;;;:11;:17;;;;;;;;;31568:51;;;;;;;;;-1:-1:-1;;;;;31568:51:0;;;;-1:-1:-1;;;31568:51:0;;;;;;;;;;;-1:-1:-1;;;31568:51:0;;;;;;;;;;;;;;31638:729;;31688:14;;-1:-1:-1;;;;;31688:28:0;;31684:101;;31752:9;31340:1109;-1:-1:-1;;;31340:1109:0:o;31684:101::-;-1:-1:-1;;;32127:6:0;32172:17;;;;:11;:17;;;;;;;;;32160:29;;;;;;;;;-1:-1:-1;;;;;32160:29:0;;;;;-1:-1:-1;;;32160:29:0;;;;;;;;;;;-1:-1:-1;;;32160:29:0;;;;;;;;;;;;;32220:28;32216:109;;32288:9;31340:1109;-1:-1:-1;;;31340:1109:0:o;32216:109::-;32087:261;;;31549:833;31496:886;32410:31;;-1:-1:-1;;;32410:31:0;;;;;;;;;;;49680:191;49754:16;49773:6;;-1:-1:-1;;;;;49790:17:0;;;-1:-1:-1;;;;;;49790:17:0;;;;;;49823:40;;49773:6;;;;;;;49823:40;;49754:16;49823:40;49743:128;49680:191;:::o;45050:667::-;45234:72;;-1:-1:-1;;;45234:72:0;;45213:4;;-1:-1:-1;;;;;45234:36:0;;;;;:72;;25186:10;;45285:4;;45291:7;;45300:5;;45234:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45234:72:0;;;;;;;;-1:-1:-1;;45234:72:0;;;;;;;;;;;;:::i;:::-;;;45230:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45468:13:0;;45464:235;;45514:40;;-1:-1:-1;;;45514:40:0;;;;;;;;;;;45464:235;45657:6;45651:13;45642:6;45638:2;45634:15;45627:38;45230:480;-1:-1:-1;;;;;;45353:55:0;-1:-1:-1;;;45353:55:0;;-1:-1:-1;45230:480:0;45050:667;;;;;;:::o;56211:114::-;56271:13;56304;56297:20;;;;;:::i;19909:723::-;19965:13;20186:10;20182:53;;-1:-1:-1;;20213:10:0;;;;;;;;;;;;-1:-1:-1;;;20213:10:0;;;;;19909:723::o;20182:53::-;20260:5;20245:12;20301:78;20308:9;;20301:78;;20334:8;;;;:::i;:::-;;-1:-1:-1;20357:10:0;;-1:-1:-1;20365:2:0;20357:10;;:::i;:::-;;;20301:78;;;20389:19;20421:6;20411:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20411:17:0;;20389:39;;20439:154;20446:10;;20439:154;;20473:11;20483:1;20473:11;;:::i;:::-;;-1:-1:-1;20542:10:0;20550:2;20542:5;:10;:::i;:::-;20529:24;;:2;:24;:::i;:::-;20516:39;;20499:6;20506;20499:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;20499:56:0;;;;;;;;-1:-1:-1;20570:11:0;20579:2;20570:11;;:::i;:::-;;;20439:154;;36854:163;36977:32;36983:2;36987:8;36997:5;37004:4;36977:5;:32::i;18630:675::-;18713:7;18756:4;18713:7;18771:497;18795:5;:12;18791:1;:16;18771:497;;;18829:20;18852:5;18858:1;18852:8;;;;;;;;:::i;:::-;;;;;;;18829:31;;18895:12;18879;:28;18875:382;;19381:13;19431:15;;;19467:4;19460:15;;;19514:4;19498:21;;19007:57;;18875:382;;;19381:13;19431:15;;;19467:4;19460:15;;;19514:4;19498:21;;19184:57;;18875:382;-1:-1:-1;18809:3:0;;;;:::i;:::-;;;;18771:497;;;-1:-1:-1;19285:12:0;18630:675;-1:-1:-1;;;18630:675:0:o;37276:1775::-;37438:13;;-1:-1:-1;;;;;37466:16:0;;37462:48;;37491:19;;-1:-1:-1;;;37491:19:0;;;;;;;;;;;37462:48;37525:13;37521:44;;37547:18;;-1:-1:-1;;;37547:18:0;;;;;;;;;;;37521:44;-1:-1:-1;;;;;37916:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;37975:49:0;;37916:44;;;;;;;;37975:49;;;-1:-1:-1;;;;;37916:44:0;;;;;;37975:49;;;;;;;;;;;;;;;;38041:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;38091:66:0;;;;-1:-1:-1;;;38141:15:0;38091:66;;;;;;;;;;38041:25;38238:23;;;38282:4;:23;;;;-1:-1:-1;;;;;;38290:13:0;;1528:19;:23;;38290:15;38278:641;;;38326:314;38357:38;;38382:12;;-1:-1:-1;;;;;38357:38:0;;;38374:1;;38357:38;;38374:1;;38357:38;38423:69;38462:1;38466:2;38470:14;;;;;;38486:5;38423:30;:69::i;:::-;38418:174;;38528:40;;-1:-1:-1;;;38528:40:0;;;;;;;;;;;38418:174;38635:3;38619:12;:19;;38326:314;;38721:12;38704:13;;:29;38700:43;;38735:8;;;38700:43;38278:641;;;38784:120;38815:40;;38840:14;;;;;-1:-1:-1;;;;;38815:40:0;;;38832:1;;38815:40;;38832:1;;38815:40;38899:3;38883:12;:19;;38784:120;;38278:641;-1:-1:-1;38933:13:0;:28;38983:60;35568:369;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:160::-;257:20;;313:13;;306:21;296:32;;286:60;;342:1;339;332:12;357:186;416:6;469:2;457:9;448:7;444:23;440:32;437:52;;;485:1;482;475:12;437:52;508:29;527:9;508:29;:::i;548:260::-;616:6;624;677:2;665:9;656:7;652:23;648:32;645:52;;;693:1;690;683:12;645:52;716:29;735:9;716:29;:::i;:::-;706:39;;764:38;798:2;787:9;783:18;764:38;:::i;:::-;754:48;;548:260;;;;;:::o;813:328::-;890:6;898;906;959:2;947:9;938:7;934:23;930:32;927:52;;;975:1;972;965:12;927:52;998:29;1017:9;998:29;:::i;:::-;988:39;;1046:38;1080:2;1069:9;1065:18;1046:38;:::i;:::-;1036:48;;1131:2;1120:9;1116:18;1103:32;1093:42;;813:328;;;;;:::o;1146:1138::-;1241:6;1249;1257;1265;1318:3;1306:9;1297:7;1293:23;1289:33;1286:53;;;1335:1;1332;1325:12;1286:53;1358:29;1377:9;1358:29;:::i;:::-;1348:39;;1406:38;1440:2;1429:9;1425:18;1406:38;:::i;:::-;1396:48;;1491:2;1480:9;1476:18;1463:32;1453:42;;1546:2;1535:9;1531:18;1518:32;1569:18;1610:2;1602:6;1599:14;1596:34;;;1626:1;1623;1616:12;1596:34;1664:6;1653:9;1649:22;1639:32;;1709:7;1702:4;1698:2;1694:13;1690:27;1680:55;;1731:1;1728;1721:12;1680:55;1767:2;1754:16;1789:2;1785;1782:10;1779:36;;;1795:18;;:::i;:::-;1870:2;1864:9;1838:2;1924:13;;-1:-1:-1;;1920:22:1;;;1944:2;1916:31;1912:40;1900:53;;;1968:18;;;1988:22;;;1965:46;1962:72;;;2014:18;;:::i;:::-;2054:10;2050:2;2043:22;2089:2;2081:6;2074:18;2129:7;2124:2;2119;2115;2111:11;2107:20;2104:33;2101:53;;;2150:1;2147;2140:12;2101:53;2206:2;2201;2197;2193:11;2188:2;2180:6;2176:15;2163:46;2251:1;2246:2;2241;2233:6;2229:15;2225:24;2218:35;2272:6;2262:16;;;;;;;1146:1138;;;;;;;:::o;2289:254::-;2354:6;2362;2415:2;2403:9;2394:7;2390:23;2386:32;2383:52;;;2431:1;2428;2421:12;2383:52;2454:29;2473:9;2454:29;:::i;:::-;2444:39;;2502:35;2533:2;2522:9;2518:18;2502:35;:::i;2548:254::-;2616:6;2624;2677:2;2665:9;2656:7;2652:23;2648:32;2645:52;;;2693:1;2690;2683:12;2645:52;2716:29;2735:9;2716:29;:::i;:::-;2706:39;2792:2;2777:18;;;;2764:32;;-1:-1:-1;;;2548:254:1:o;2807:180::-;2863:6;2916:2;2904:9;2895:7;2891:23;2887:32;2884:52;;;2932:1;2929;2922:12;2884:52;2955:26;2971:9;2955:26;:::i;2992:180::-;3051:6;3104:2;3092:9;3083:7;3079:23;3075:32;3072:52;;;3120:1;3117;3110:12;3072:52;-1:-1:-1;3143:23:1;;2992:180;-1:-1:-1;2992:180:1:o;3177:245::-;3235:6;3288:2;3276:9;3267:7;3263:23;3259:32;3256:52;;;3304:1;3301;3294:12;3256:52;3343:9;3330:23;3362:30;3386:5;3362:30;:::i;3427:249::-;3496:6;3549:2;3537:9;3528:7;3524:23;3520:32;3517:52;;;3565:1;3562;3555:12;3517:52;3597:9;3591:16;3616:30;3640:5;3616:30;:::i;3681:592::-;3752:6;3760;3813:2;3801:9;3792:7;3788:23;3784:32;3781:52;;;3829:1;3826;3819:12;3781:52;3869:9;3856:23;3898:18;3939:2;3931:6;3928:14;3925:34;;;3955:1;3952;3945:12;3925:34;3993:6;3982:9;3978:22;3968:32;;4038:7;4031:4;4027:2;4023:13;4019:27;4009:55;;4060:1;4057;4050:12;4009:55;4100:2;4087:16;4126:2;4118:6;4115:14;4112:34;;;4142:1;4139;4132:12;4112:34;4187:7;4182:2;4173:6;4169:2;4165:15;4161:24;4158:37;4155:57;;;4208:1;4205;4198:12;4155:57;4239:2;4231:11;;;;;4261:6;;-1:-1:-1;3681:592:1;;-1:-1:-1;;;;3681:592:1:o;4463:683::-;4558:6;4566;4574;4627:2;4615:9;4606:7;4602:23;4598:32;4595:52;;;4643:1;4640;4633:12;4595:52;4679:9;4666:23;4656:33;;4740:2;4729:9;4725:18;4712:32;4763:18;4804:2;4796:6;4793:14;4790:34;;;4820:1;4817;4810:12;4790:34;4858:6;4847:9;4843:22;4833:32;;4903:7;4896:4;4892:2;4888:13;4884:27;4874:55;;4925:1;4922;4915:12;4874:55;4965:2;4952:16;4991:2;4983:6;4980:14;4977:34;;;5007:1;5004;4997:12;4977:34;5060:7;5055:2;5045:6;5042:1;5038:14;5034:2;5030:23;5026:32;5023:45;5020:65;;;5081:1;5078;5071:12;5020:65;5112:2;5108;5104:11;5094:21;;5134:6;5124:16;;;;;4463:683;;;;;:::o;5151:257::-;5192:3;5230:5;5224:12;5257:6;5252:3;5245:19;5273:63;5329:6;5322:4;5317:3;5313:14;5306:4;5299:5;5295:16;5273:63;:::i;:::-;5390:2;5369:15;-1:-1:-1;;5365:29:1;5356:39;;;;5397:4;5352:50;;5151:257;-1:-1:-1;;5151:257:1:o;5647:470::-;5826:3;5864:6;5858:13;5880:53;5926:6;5921:3;5914:4;5906:6;5902:17;5880:53;:::i;:::-;5996:13;;5955:16;;;;6018:57;5996:13;5955:16;6052:4;6040:17;;6018:57;:::i;:::-;6091:20;;5647:470;-1:-1:-1;;;;5647:470:1:o;6540:488::-;-1:-1:-1;;;;;6809:15:1;;;6791:34;;6861:15;;6856:2;6841:18;;6834:43;6908:2;6893:18;;6886:34;;;6956:3;6951:2;6936:18;;6929:31;;;6734:4;;6977:45;;7002:19;;6994:6;6977:45;:::i;:::-;6969:53;6540:488;-1:-1:-1;;;;;;6540:488:1:o;8157:219::-;8306:2;8295:9;8288:21;8269:4;8326:44;8366:2;8355:9;8351:18;8343:6;8326:44;:::i;9835:356::-;10037:2;10019:21;;;10056:18;;;10049:30;10115:34;10110:2;10095:18;;10088:62;10182:2;10167:18;;9835:356::o;11676:351::-;11878:2;11860:21;;;11917:2;11897:18;;;11890:30;11956:29;11951:2;11936:18;;11929:57;12018:2;12003:18;;11676:351::o;12032:402::-;12234:2;12216:21;;;12273:2;12253:18;;;12246:30;12312:34;12307:2;12292:18;;12285:62;-1:-1:-1;;;12378:2:1;12363:18;;12356:36;12424:3;12409:19;;12032:402::o;12975:128::-;13015:3;13046:1;13042:6;13039:1;13036:13;13033:39;;;13052:18;;:::i;:::-;-1:-1:-1;13088:9:1;;12975:128::o;13108:120::-;13148:1;13174;13164:35;;13179:18;;:::i;:::-;-1:-1:-1;13213:9:1;;13108:120::o;13233:168::-;13273:7;13339:1;13335;13331:6;13327:14;13324:1;13321:21;13316:1;13309:9;13302:17;13298:45;13295:71;;;13346:18;;:::i;:::-;-1:-1:-1;13386:9:1;;13233:168::o;13406:125::-;13446:4;13474:1;13471;13468:8;13465:34;;;13479:18;;:::i;:::-;-1:-1:-1;13516:9:1;;13406:125::o;13536:258::-;13608:1;13618:113;13632:6;13629:1;13626:13;13618:113;;;13708:11;;;13702:18;13689:11;;;13682:39;13654:2;13647:10;13618:113;;;13749:6;13746:1;13743:13;13740:48;;;-1:-1:-1;;13784:1:1;13766:16;;13759:27;13536:258::o;13799:380::-;13878:1;13874:12;;;;13921;;;13942:61;;13996:4;13988:6;13984:17;13974:27;;13942:61;14049:2;14041:6;14038:14;14018:18;14015:38;14012:161;;;14095:10;14090:3;14086:20;14083:1;14076:31;14130:4;14127:1;14120:15;14158:4;14155:1;14148:15;14012:161;;13799:380;;;:::o;14184:135::-;14223:3;-1:-1:-1;;14244:17:1;;14241:43;;;14264:18;;:::i;:::-;-1:-1:-1;14311:1:1;14300:13;;14184:135::o;14324:112::-;14356:1;14382;14372:35;;14387:18;;:::i;:::-;-1:-1:-1;14421:9:1;;14324:112::o;14441:127::-;14502:10;14497:3;14493:20;14490:1;14483:31;14533:4;14530:1;14523:15;14557:4;14554:1;14547:15;14573:127;14634:10;14629:3;14625:20;14622:1;14615:31;14665:4;14662:1;14655:15;14689:4;14686:1;14679:15;14705:127;14766:10;14761:3;14757:20;14754:1;14747:31;14797:4;14794:1;14787:15;14821:4;14818:1;14811:15;14837:127;14898:10;14893:3;14889:20;14886:1;14879:31;14929:4;14926:1;14919:15;14953:4;14950:1;14943:15;14969:131;-1:-1:-1;;;;;;15043:32:1;;15033:43;;15023:71;;15090:1;15087;15080:12

Swarm Source

ipfs://057aa10e56b96bfb70136bd6eceddd77b4c0847b72e49a1d7a79c2da802b5b9d
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.