ETH Price: $2,540.53 (+3.15%)

Token

Baby Zuki (BZUKI)
 

Overview

Max Total Supply

72 BZUKI

Holders

55

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
bruhleavemetfalone.eth
Balance
1 BZUKI
0x2b228d08e4c609aA610a489f9133263b2A7F8669
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
BabyZuki

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-02-07
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Counters.sol


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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/IERC721Enumerable.sol


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

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @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/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: contracts/ERC721A.sol



pragma solidity ^0.8.0;

//Developed By https://twitter.com/denialcd048










/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is
    Context,
    ERC165,
    IERC721,
    IERC721Metadata,
    IERC721Enumerable
{
    using Address for address;
    using Strings for uint256;
    using Counters for Counters.Counter;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    Counters.Counter private supply;

    uint256 internal immutable collectionSize;
    uint256 internal immutable maxBatchSize;

    // 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) private _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;

    /**
     * @dev
     * `maxBatchSize` refers to how much a minter can mint at a time.
     * `collectionSize_` refers to how many tokens are in the collection.
     */
    constructor(
        string memory name_,
        string memory symbol_,
        uint256 maxBatchSize_,
        uint256 collectionSize_
    ) {
        require(
            collectionSize_ > 0,
            "ERC721A: collection must have a nonzero supply"
        );
        require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
        _name = name_;
        _symbol = symbol_;
        maxBatchSize = maxBatchSize_;
        collectionSize = collectionSize_;
        supply.increment();
    }

    /**
        @dev See {IERC721Enumerable-totalSupply}, Returns the total tokens minted so far.
        1 is always subtracted from the Counter since it tracks the next available tokenId.
     */
    function totalSupply() public view override returns (uint256) {
        return supply.current() - 1;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index)
        public
        view
        override
        returns (uint256)
    {
        require(index < totalSupply(), "ERC721A: global index out of bounds");
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        override
        returns (uint256)
    {
        require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        revert("ERC721A: unable to get token of owner by index");
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        require(
            owner != address(0),
            "ERC721A: balance query for the zero address"
        );
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        require(
            owner != address(0),
            "ERC721A: number minted query for the zero address"
        );
        return uint256(_addressData[owner].numberMinted);
    }

    function ownershipOf(uint256 tokenId)
        internal
        view
        returns (TokenOwnership memory)
    {
        require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

        uint256 lowestTokenToCheck;
        if (tokenId >= maxBatchSize) {
            lowestTokenToCheck = tokenId - maxBatchSize + 1;
        }

        for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (ownership.addr != address(0)) {
                return ownership;
            }
        }

        revert("ERC721A: unable to determine the owner of token");
    }

    /**
     * @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)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        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);
        require(to != owner, "ERC721A: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721A: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId)
        public
        view
        override
        returns (address)
    {
        require(
            _exists(tokenId),
            "ERC721A: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        override
    {
        require(operator != _msgSender(), "ERC721A: approve to caller");

        _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 override {
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721A: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @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 tokenId < supply.current();
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, "");
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - there must be `quantity` tokens remaining unminted in the total collection.
     * - `to` cannot be the zero address.
     * - `quantity` cannot be larger than the max batch size.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = supply.current();
        require(to != address(0), "ERC721A: mint to the zero address");
        // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
        require(!_exists(startTokenId), "ERC721A: token already minted");
        require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        AddressData memory addressData = _addressData[to];
        _addressData[to] = AddressData(
            addressData.balance + uint128(quantity),
            addressData.numberMinted + uint128(quantity)
        );
        _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

        uint256 updatedIndex = startTokenId;

        for (uint256 i = 0; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            require(
                _checkOnERC721Received(address(0), to, updatedIndex, _data),
                "ERC721A: transfer to non ERC721Receiver implementer"
            );
            updatedIndex++;
            supply.increment();
        }

        _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);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(
            isApprovedOrOwner,
            "ERC721A: transfer caller is not owner nor approved"
        );

        require(
            prevOwnership.addr == from,
            "ERC721A: transfer from incorrect owner"
        );
        require(to != address(0), "ERC721A: transfer to the zero address");

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        _addressData[from].balance -= 1;
        _addressData[to].balance += 1;
        _ownerships[tokenId] = TokenOwnership(to, 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;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId] = TokenOwnership(
                    prevOwnership.addr,
                    prevOwnership.startTimestamp
                );
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

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

    uint256 public nextOwnerToExplicitlySet = 0;

    /**
     * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
     */
    function _setOwnersExplicit(uint256 quantity) internal {
        uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
        require(quantity > 0, "quantity must be nonzero");
        uint256 endIndex = oldNextOwnerToSet + quantity - 1;
        if (endIndex > collectionSize - 1) {
            endIndex = collectionSize - 1;
        }
        // We know if the last one in the group exists, all in the group exist, due to serial ordering.
        require(_exists(endIndex), "not enough minted yet for this cleanup");
        for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
            if (_ownerships[i].addr == address(0)) {
                TokenOwnership memory ownership = ownershipOf(i);
                _ownerships[i] = TokenOwnership(
                    ownership.addr,
                    ownership.startTimestamp
                );
            }
        }
        nextOwnerToExplicitlySet = endIndex + 1;
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a 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 _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            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(
                        "ERC721A: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * 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`.
     */
    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.
     *
     * 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` 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/BabyZuki.sol


pragma solidity ^0.8.0;

//Developed By https://twitter.com/denialcd048




contract BabyZuki is Ownable, ERC721A, ReentrancyGuard {
    using Strings for uint256;

    uint256 public maxPerAddressDuringMint;
    uint256 public amountForDevs;
    uint256 public freeAmountForPublic;
    uint256 public whitelistSaleEndTime;
    uint256 public remainingFreeMintForPublic = 0;
    bool public paused = true;
    bool public publicMintEnabled = false;

    struct SaleConfig {
        uint256 whitelistPrice;
        uint256 publicPrice;
    }

    SaleConfig public saleConfig;

    mapping(address => uint256) public whitelist;
    mapping(address => bool) public freeMintDone;

    constructor(
        uint256 maxPerAddressDuringMint_,
        uint256 maxBatchSize_,
        uint256 collectionSize_,
        uint256 amountForDevs_,
        uint256 freeAmountForPublic_
    ) ERC721A("Baby Zuki", "BZUKI", maxBatchSize_, collectionSize_) {
        maxPerAddressDuringMint = maxPerAddressDuringMint_;
        amountForDevs = amountForDevs_;
        freeAmountForPublic = freeAmountForPublic_;
        require(
            amountForDevs_ <= collectionSize_,
            "larger collection size needed"
        );
        require(
            freeAmountForPublic_ <= collectionSize_,
            "larger collection size needed"
        );
        remainingFreeMintForPublic = freeAmountForPublic_;
        whitelistSaleEndTime = block.timestamp;
    }

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }

    function setAmountForDevs(uint256 newAmount) external onlyOwner {
        amountForDevs = newAmount;
    }

    function setMaxPerAddressDuringMint(uint256 newAmount) external onlyOwner {
        maxPerAddressDuringMint = newAmount;
    }

    function setupSaleInfo(uint256 whitelistPrice, uint256 publicPrice)
        external
        onlyOwner
    {
        saleConfig = SaleConfig(whitelistPrice, publicPrice);
    }

    function startWhitelistSale(uint256 _whitelistSaleEndTime)
        external
        onlyOwner
    {
        require(
            _whitelistSaleEndTime > block.timestamp,
            "whitelist Sale End Time Must Be Greater Than Block Time Stamp !"
        );
        whitelistSaleEndTime = _whitelistSaleEndTime;
        publicMintEnabled = false;
    }

    function setPaused(bool _state) external onlyOwner {
        paused = _state;
    }

    function setPublicMintEnabled(bool _state) external onlyOwner {
        publicMintEnabled = _state;
    }

    function whitelistMint(uint256 quantity) public payable callerIsUser {
        require(msg.sender != owner(), "Owner Should Call devMint!");
        require(!paused, "Sale has not begun yet");
        uint256 price = uint256(saleConfig.whitelistPrice);
        require(price != 0, "whitelist sale has not begun yet");
        require(
            whitelistSaleEndTime != 0 &&
                block.timestamp <= whitelistSaleEndTime,
            "whitelist sale has not begun yet"
        );
        require(whitelist[msg.sender] > 0, "not eligible for whitelist mint");
        require(quantity <= maxBatchSize, "can not mint this many at a time");
        require(
            numberMinted(msg.sender) + quantity <= maxPerAddressDuringMint,
            "can not mint this many"
        );

        require(
            totalSupply() +
                quantity +
                (amountForDevs - numberMinted(owner())) <=
                collectionSize,
            "reached max supply"
        );
        refundIfOver(price * quantity);
        whitelist[msg.sender] -= quantity;
        _safeMint(msg.sender, quantity);
    }

    function publicMint(uint256 quantity) public payable callerIsUser {
        require(!paused, "Sale has not begun yet");
        require(msg.sender != owner(), "Owner Should Call devMint!");
        SaleConfig memory config = saleConfig;
        uint256 publicPrice = uint256(config.publicPrice);
        uint256 whitelistSaleEndTime_ = whitelistSaleEndTime;
        require(
            isPublicMintOn(publicPrice, whitelistSaleEndTime_),
            "public mint has not begun yet"
        );
        require(quantity <= maxBatchSize, "can not mint this many at a time");
        require(
            totalSupply() +
                quantity +
                (amountForDevs - numberMinted(owner())) <=
                collectionSize,
            "reached max supply"
        );
        require(
            numberMinted(msg.sender) + quantity <= maxPerAddressDuringMint,
            "can not mint this many"
        );
        uint256 paidMintAmount = quantity;

        if (remainingFreeMintForPublic > 0 && !freeMintDone[msg.sender]) {
            paidMintAmount -= 1;
            require(
                msg.value >= publicPrice * paidMintAmount,
                "Need to send more ETH."
            );
            freeMintDone[msg.sender] = true;
            remainingFreeMintForPublic -= 1;
        }
        _safeMint(msg.sender, quantity);
        refundIfOver(publicPrice * paidMintAmount);
    }

    function refundIfOver(uint256 price) private {
        require(msg.value >= price, "Need to send more ETH.");
        if (msg.value > price) {
            payable(msg.sender).transfer(msg.value - price);
        }
    }

    function isPublicMintOn(
        uint256 publicPriceWei,
        uint256 whitelistSaleEndTime_
    ) public view returns (bool) {
        return
            !paused &&
            publicPriceWei != 0 &&
            publicMintEnabled &&
            block.timestamp > whitelistSaleEndTime_;
    }

    function setWhiteList(address[] memory addresses, uint256[] memory numSlots)
        external
        onlyOwner
    {
        require(
            addresses.length == numSlots.length,
            "addresses does not match numSlots length"
        );
        for (uint256 i = 0; i < addresses.length; i++) {
            whitelist[addresses[i]] = numSlots[i];
        }
    }

    function setFreeMintDone(address[] memory addresses, bool[] memory states)
        external
        onlyOwner
    {
        require(
            addresses.length == states.length,
            "addresses does not match states length"
        );
        for (uint256 i = 0; i < addresses.length; i++) {
            freeMintDone[addresses[i]] = states[i];
        }
    }

    // For marketing etc.
    function devMint(uint256 quantity) public onlyOwner {
        refundIfOver(0);
        require(!paused, "Sale has not begun yet");
        require(
            totalSupply() + quantity <= collectionSize,
            "reached max supply"
        );

        require(
            numberMinted(msg.sender) + quantity <= amountForDevs,
            "can not mint this many"
        );
        uint256 numChunks = 0;
        uint256 remainder = 0;
        if (quantity <= maxBatchSize) {
            _safeMint(msg.sender, quantity);
        } else {
            remainder = quantity % maxBatchSize;
            numChunks = (quantity - remainder) / maxBatchSize;
        }

        for (uint256 i = 0; i < numChunks; i++) {
            _safeMint(msg.sender, maxBatchSize);
        }
        if (remainder > 0) {
            _safeMint(msg.sender, remainder);
        }
    }

    function doMint(uint256 quantity) public payable callerIsUser {
        require(!paused, "Sale has not begun yet");
        if (msg.sender == owner()) {
            devMint(quantity);
            return;
        }
        if (
            whitelistSaleEndTime != 0 && block.timestamp <= whitelistSaleEndTime
        ) {
            whitelistMint(quantity);
            return;
        } else {
            SaleConfig memory config = saleConfig;
            uint256 publicPrice = uint256(config.publicPrice);
            uint256 whitelistSaleEndTime_ = whitelistSaleEndTime;
            if (isPublicMintOn(publicPrice, whitelistSaleEndTime_)) {
                publicMint(quantity);
                return;
            }
        }
    }

    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
        uint256 currentTokenId = 1;
        uint256 ownedTokenIndex = 0;

        while (
            ownedTokenIndex < ownerTokenCount &&
            currentTokenId <= collectionSize
        ) {
            address currentTokenOwner = ownerOf(currentTokenId);

            if (currentTokenOwner == _owner) {
                ownedTokenIds[ownedTokenIndex] = currentTokenId;

                ownedTokenIndex++;
            }

            currentTokenId++;
        }
        return ownedTokenIds;
    }

    function getCollectionSize() public view returns (uint256) {
        return collectionSize;
    }

    function getRemainingFreeMintForPublic() public view returns (uint256) {
        return remainingFreeMintForPublic;
    }

    // // metadata URI
    string private _baseTokenURI;
    string private _hiddenMetadataUri;
    bool private _revealed = false;

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

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

    function setHiddenMetadataUri(string calldata hiddenMetadataUri)
        external
        onlyOwner
    {
        _hiddenMetadataUri = hiddenMetadataUri;
    }

    function setRevealed(bool _state) public onlyOwner {
        _revealed = _state;
    }

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

        if (_revealed == false) {
            return _hiddenMetadataUri;
        }

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

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

    function setOwnersExplicit(uint256 quantity)
        external
        onlyOwner
        nonReentrant
    {
        _setOwnersExplicit(quantity);
    }

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

    function getOwnershipData(uint256 tokenId)
        external
        view
        returns (TokenOwnership memory)
    {
        return ownershipOf(tokenId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"maxPerAddressDuringMint_","type":"uint256"},{"internalType":"uint256","name":"maxBatchSize_","type":"uint256"},{"internalType":"uint256","name":"collectionSize_","type":"uint256"},{"internalType":"uint256","name":"amountForDevs_","type":"uint256"},{"internalType":"uint256","name":"freeAmountForPublic_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"amountForDevs","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":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"doMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"freeAmountForPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMintDone","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCollectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRemainingFreeMintForPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"publicPriceWei","type":"uint256"},{"internalType":"uint256","name":"whitelistSaleEndTime_","type":"uint256"}],"name":"isPublicMintOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAddressDuringMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"remainingFreeMintForPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"saleConfig","outputs":[{"internalType":"uint256","name":"whitelistPrice","type":"uint256"},{"internalType":"uint256","name":"publicPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"setAmountForDevs","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":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool[]","name":"states","type":"bool[]"}],"name":"setFreeMintDone","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"setMaxPerAddressDuringMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setOwnersExplicit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPublicMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"numSlots","type":"uint256[]"}],"name":"setWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"whitelistPrice","type":"uint256"},{"internalType":"uint256","name":"publicPrice","type":"uint256"}],"name":"setupSaleInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelistSaleEndTime","type":"uint256"}],"name":"startWhitelistSale","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistSaleEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c060405260006008819055600e55600f805461ffff191660011790556016805460ff191690553480156200003357600080fd5b5060405162003f7338038062003f738339810160408190526200005691620003a0565b6040518060400160405280600981526020016842616279205a756b6960b81b81525060405180604001604052806005815260200164425a554b4960d81b8152508585620000b2620000ac6200029d60201b60201c565b620002a1565b600081116200011f5760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b60008211620001815760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b606482015260840162000116565b835162000196906002906020870190620002fa565b508251620001ac906003906020860190620002fa565b5060a08290526080819052620001cf6001620002f1602090811b620022da17901c565b505060016009555050600a859055600b829055600c81905582821115620002395760405162461bcd60e51b815260206004820152601d60248201527f6c617267657220636f6c6c656374696f6e2073697a65206e6565646564000000604482015260640162000116565b828111156200028b5760405162461bcd60e51b815260206004820152601d60248201527f6c617267657220636f6c6c656374696f6e2073697a65206e6565646564000000604482015260640162000116565b600e55505042600d55506200041e9050565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80546001019055565b8280546200030890620003e1565b90600052602060002090601f0160209004810192826200032c576000855562000377565b82601f106200034757805160ff191683800117855562000377565b8280016001018555821562000377579182015b82811115620003775782518255916020019190600101906200035a565b506200038592915062000389565b5090565b5b808211156200038557600081556001016200038a565b600080600080600060a08688031215620003b957600080fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b600181811c90821680620003f657607f821691505b602082108114156200041857634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a051613acd620004a660003960008181610ea7015281816113020152818161133b01528181611364015281816113ab015281816119b0015281816129de01528181612a080152612ed201526000818161066701528181610f17015281816112780152818161147301528181611a550152818161274701526127790152613acd6000f3fe60806040526004361061031a5760003560e01c8063818668d7116101ab578063b88d4fde116100f7578063de26e49811610095578063e92c0f371161006f578063e92c0f371461095b578063e985e9c51461097b578063f2fde38b146109c4578063fbe1aa51146109e457600080fd5b8063de26e49814610905578063e0a808531461091b578063e39465561461093b57600080fd5b8063d3d0fbda116100d1578063d3d0fbda1461088f578063d7224ba0146108af578063da234d6e146108c5578063dc33e681146108e557600080fd5b8063b88d4fde1461082f578063bd4cea2e1461084f578063c87b56dd1461086f57600080fd5b80639231ab2a11610164578063a22cb4651161013e578063a22cb465146107c7578063a3412dce146107e7578063a4a339ee14610807578063ac4460021461081a57600080fd5b80639231ab2a1461073857806395d89b41146107855780639b19251a1461079a57600080fd5b8063818668d71461068b578063866e0124146106ab578063868ff4a2146106c15780638bc35c2f146106d45780638da5cb5b146106ea57806390aa0b0f1461070857600080fd5b806342842e0e1161026a5780635aafa542116102235780636352211e116101fd5780636352211e1461060357806370a0823114610623578063715018a6146106435780637155c1ea1461065857600080fd5b80635aafa542146105a35780635ba7b9cc146105b95780635c975abb146105e957600080fd5b806342842e0e146104d6578063438b6300146104f65780634f6ccce7146105235780634fdd43cb1461054357806355f804b3146105635780635940a30f1461058357600080fd5b806316c38b3c116102d75780632d20fb60116102b15780632d20fb60146104635780632db11544146104835780632f745c5914610496578063375a069a146104b657600080fd5b806316c38b3c1461040e57806318160ddd1461042e57806323b872dd1461044357600080fd5b806301ffc9a71461031f57806306fdde0314610354578063081812fc14610376578063095ea7b3146103ae5780630c4a0367146103d05780630f4161aa146103ef575b600080fd5b34801561032b57600080fd5b5061033f61033a36600461355d565b6109fa565b60405190151581526020015b60405180910390f35b34801561036057600080fd5b50610369610a67565b60405161034b919061371f565b34801561038257600080fd5b50610396610391366004613608565b610af9565b6040516001600160a01b03909116815260200161034b565b3480156103ba57600080fd5b506103ce6103c936600461339f565b610b87565b005b3480156103dc57600080fd5b50600e545b60405190815260200161034b565b3480156103fb57600080fd5b50600f5461033f90610100900460ff1681565b34801561041a57600080fd5b506103ce610429366004613542565b610c9f565b34801561043a57600080fd5b506103e1610cdc565b34801561044f57600080fd5b506103ce61045e36600461327a565b610cf8565b34801561046f57600080fd5b506103ce61047e366004613608565b610d03565b6103ce610491366004613608565b610d96565b3480156104a257600080fd5b506103e16104b136600461339f565b6110a8565b3480156104c257600080fd5b506103ce6104d1366004613608565b61121f565b3480156104e257600080fd5b506103ce6104f136600461327a565b6113f2565b34801561050257600080fd5b5061051661051136600461322c565b61140d565b60405161034b91906136db565b34801561052f57600080fd5b506103e161053e366004613608565b61150b565b34801561054f57600080fd5b506103ce61055e366004613597565b611573565b34801561056f57600080fd5b506103ce61057e366004613597565b6115a9565b34801561058f57600080fd5b506103ce61059e3660046133c9565b6115df565b3480156105af57600080fd5b506103e1600e5481565b3480156105c557600080fd5b5061033f6105d436600461322c565b60136020526000908152604090205460ff1681565b3480156105f557600080fd5b50600f5461033f9060ff1681565b34801561060f57600080fd5b5061039661061e366004613608565b6116e9565b34801561062f57600080fd5b506103e161063e36600461322c565b6116fb565b34801561064f57600080fd5b506103ce61178c565b34801561066457600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103e1565b34801561069757600080fd5b506103ce6106a6366004613542565b6117c2565b3480156106b757600080fd5b506103e1600d5481565b6103ce6106cf366004613608565b611806565b3480156106e057600080fd5b506103e1600a5481565b3480156106f657600080fd5b506000546001600160a01b0316610396565b34801561071457600080fd5b50601054601154610723919082565b6040805192835260208301919091520161034b565b34801561074457600080fd5b50610758610753366004613608565b611b11565b6040805182516001600160a01b031681526020928301516001600160401b0316928101929092520161034b565b34801561079157600080fd5b50610369611b2e565b3480156107a657600080fd5b506103e16107b536600461322c565b60126020526000908152604090205481565b3480156107d357600080fd5b506103ce6107e2366004613375565b611b3d565b3480156107f357600080fd5b5061033f610802366004613621565b611c02565b6103ce610815366004613608565b611c3c565b34801561082657600080fd5b506103ce611cf8565b34801561083b57600080fd5b506103ce61084a3660046132b6565b611e05565b34801561085b57600080fd5b506103ce61086a366004613608565b611e38565b34801561087b57600080fd5b5061036961088a366004613608565b611ee7565b34801561089b57600080fd5b506103ce6108aa366004613608565b61204d565b3480156108bb57600080fd5b506103e160085481565b3480156108d157600080fd5b506103ce6108e0366004613621565b61207c565b3480156108f157600080fd5b506103e161090036600461322c565b6120c4565b34801561091157600080fd5b506103e1600c5481565b34801561092757600080fd5b506103ce610936366004613542565b6120cf565b34801561094757600080fd5b506103ce610956366004613491565b61210c565b34801561096757600080fd5b506103ce610976366004613608565b612213565b34801561098757600080fd5b5061033f610996366004613247565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156109d057600080fd5b506103ce6109df36600461322c565b612242565b3480156109f057600080fd5b506103e1600b5481565b60006001600160e01b031982166380ac58cd60e01b1480610a2b57506001600160e01b03198216635b5e139f60e01b145b80610a4657506001600160e01b0319821663780e9d6360e01b145b80610a6157506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060028054610a76906139bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa2906139bf565b8015610aef5780601f10610ac457610100808354040283529160200191610aef565b820191906000526020600020905b815481529060010190602001808311610ad257829003601f168201915b5050505050905090565b6000610b04826122e3565b610b6b5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610b92826116e9565b9050806001600160a01b0316836001600160a01b03161415610c015760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610b62565b336001600160a01b0382161480610c1d5750610c1d8133610996565b610c8f5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610b62565b610c9a8383836122f6565b505050565b6000546001600160a01b03163314610cc95760405162461bcd60e51b8152600401610b6290613795565b600f805460ff1916911515919091179055565b60006001610ce960015490565b610cf39190613965565b905090565b610c9a838383612352565b6000546001600160a01b03163314610d2d5760405162461bcd60e51b8152600401610b6290613795565b60026009541415610d805760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b62565b6002600955610d8e816126d6565b506001600955565b323314610db55760405162461bcd60e51b8152600401610b6290613732565b600f5460ff1615610dd85760405162461bcd60e51b8152600401610b62906137ca565b6000546001600160a01b0316331415610e335760405162461bcd60e51b815260206004820152601a60248201527f4f776e65722053686f756c642043616c6c206465764d696e74210000000000006044820152606401610b62565b60408051808201909152601054815260115460208201819052600d54610e598282611c02565b610ea55760405162461bcd60e51b815260206004820152601d60248201527f7075626c6963206d696e7420686173206e6f7420626567756e207965740000006044820152606401610b62565b7f0000000000000000000000000000000000000000000000000000000000000000841115610f155760405162461bcd60e51b815260206004820181905260248201527f63616e206e6f74206d696e742074686973206d616e7920617420612074696d656044820152606401610b62565b7f0000000000000000000000000000000000000000000000000000000000000000610f4b6109006000546001600160a01b031690565b600b54610f589190613965565b85610f61610cdc565b610f6b91906138f2565b610f7591906138f2565b1115610f935760405162461bcd60e51b8152600401610b6290613769565b600a5484610fa0336120c4565b610faa91906138f2565b1115610fc85760405162461bcd60e51b8152600401610b629061384d565b600e54849015801590610feb57503360009081526013602052604090205460ff16155b1561108557610ffb600182613965565b9050611007818461391e565b34101561104f5760405162461bcd60e51b81526020600482015260166024820152752732b2b2103a379039b2b7321036b7b9329022aa241760511b6044820152606401610b62565b336000908152601360205260408120805460ff19166001908117909155600e80549192909161107f908490613965565b90915550505b61108f33866128bd565b6110a161109c828561391e565b6128d7565b5050505050565b60006110b3836116fb565b821061110c5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610b62565b6000611116610cdc565b905060008060005b838110156111bf576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561117057805192505b876001600160a01b0316836001600160a01b031614156111ac578684141561119e57509350610a6192505050565b836111a8816139fa565b9450505b50806111b7816139fa565b91505061111e565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610b62565b6000546001600160a01b031633146112495760405162461bcd60e51b8152600401610b6290613795565b61125360006128d7565b600f5460ff16156112765760405162461bcd60e51b8152600401610b62906137ca565b7f0000000000000000000000000000000000000000000000000000000000000000816112a0610cdc565b6112aa91906138f2565b11156112c85760405162461bcd60e51b8152600401610b6290613769565b600b54816112d5336120c4565b6112df91906138f2565b11156112fd5760405162461bcd60e51b8152600401610b629061384d565b6000807f000000000000000000000000000000000000000000000000000000000000000083116113365761133133846128bd565b61139a565b6113607f000000000000000000000000000000000000000000000000000000000000000084613a15565b90507f000000000000000000000000000000000000000000000000000000000000000061138d8285613965565b611397919061390a565b91505b60005b828110156113e1576113cf337f00000000000000000000000000000000000000000000000000000000000000006128bd565b806113d9816139fa565b91505061139d565b508015610c9a57610c9a33826128bd565b610c9a83838360405180602001604052806000815250611e05565b6060600061141a836116fb565b90506000816001600160401b0381111561143657611436613a6b565b60405190808252806020026020018201604052801561145f578160200160208202803683370190505b509050600160005b838110801561149657507f00000000000000000000000000000000000000000000000000000000000000008211155b156115015760006114a6836116e9565b9050866001600160a01b0316816001600160a01b031614156114ee57828483815181106114d5576114d5613a55565b6020908102919091010152816114ea816139fa565b9250505b826114f8816139fa565b93505050611467565b5090949350505050565b6000611515610cdc565b821061156f5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610b62565b5090565b6000546001600160a01b0316331461159d5760405162461bcd60e51b8152600401610b6290613795565b610c9a601583836130f7565b6000546001600160a01b031633146115d35760405162461bcd60e51b8152600401610b6290613795565b610c9a601483836130f7565b6000546001600160a01b031633146116095760405162461bcd60e51b8152600401610b6290613795565b80518251146116695760405162461bcd60e51b815260206004820152602660248201527f61646472657373657320646f6573206e6f74206d6174636820737461746573206044820152650d8cadccee8d60d31b6064820152608401610b62565b60005b8251811015610c9a5781818151811061168757611687613a55565b6020026020010151601360008584815181106116a5576116a5613a55565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806116e1816139fa565b91505061166c565b60006116f48261295e565b5192915050565b60006001600160a01b0382166117675760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610b62565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b6000546001600160a01b031633146117b65760405162461bcd60e51b8152600401610b6290613795565b6117c06000612b05565b565b6000546001600160a01b031633146117ec5760405162461bcd60e51b8152600401610b6290613795565b600f80549115156101000261ff0019909216919091179055565b3233146118255760405162461bcd60e51b8152600401610b6290613732565b6000546001600160a01b03163314156118805760405162461bcd60e51b815260206004820152601a60248201527f4f776e65722053686f756c642043616c6c206465764d696e74210000000000006044820152606401610b62565b600f5460ff16156118a35760405162461bcd60e51b8152600401610b62906137ca565b601054806118f35760405162461bcd60e51b815260206004820181905260248201527f77686974656c6973742073616c6520686173206e6f7420626567756e207965746044820152606401610b62565b600d54158015906119065750600d544211155b6119525760405162461bcd60e51b815260206004820181905260248201527f77686974656c6973742073616c6520686173206e6f7420626567756e207965746044820152606401610b62565b336000908152601260205260409020546119ae5760405162461bcd60e51b815260206004820152601f60248201527f6e6f7420656c696769626c6520666f722077686974656c697374206d696e74006044820152606401610b62565b7f0000000000000000000000000000000000000000000000000000000000000000821115611a1e5760405162461bcd60e51b815260206004820181905260248201527f63616e206e6f74206d696e742074686973206d616e7920617420612074696d656044820152606401610b62565b600a5482611a2b336120c4565b611a3591906138f2565b1115611a535760405162461bcd60e51b8152600401610b629061384d565b7f0000000000000000000000000000000000000000000000000000000000000000611a896109006000546001600160a01b031690565b600b54611a969190613965565b83611a9f610cdc565b611aa991906138f2565b611ab391906138f2565b1115611ad15760405162461bcd60e51b8152600401610b6290613769565b611ade61109c838361391e565b3360009081526012602052604081208054849290611afd908490613965565b90915550611b0d905033836128bd565b5050565b6040805180820190915260008082526020820152610a618261295e565b606060038054610a76906139bf565b6001600160a01b038216331415611b965760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610b62565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600f5460009060ff16158015611c1757508215155b8015611c2a5750600f54610100900460ff165b8015611c3557508142115b9392505050565b323314611c5b5760405162461bcd60e51b8152600401610b6290613732565b600f5460ff1615611c7e5760405162461bcd60e51b8152600401610b62906137ca565b6000546001600160a01b0316331415611c9d57611c9a8161121f565b50565b600d5415801590611cb05750600d544211155b15611cbe57611c9a81611806565b60408051808201909152601054815260115460208201819052600d54611ce48282611c02565b15611cf257611cf284610d96565b50505050565b6000546001600160a01b03163314611d225760405162461bcd60e51b8152600401610b6290613795565b60026009541415611d755760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b62565b6002600955604051600090339047908381818185875af1925050503d8060008114611dbc576040519150601f19603f3d011682016040523d82523d6000602084013e611dc1565b606091505b5050905080610d8e5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610b62565b611e10848484612352565b611e1c84848484612b55565b611cf25760405162461bcd60e51b8152600401610b62906137fa565b6000546001600160a01b03163314611e625760405162461bcd60e51b8152600401610b6290613795565b428111611ed75760405162461bcd60e51b815260206004820152603f60248201527f77686974656c6973742053616c6520456e642054696d65204d7573742042652060448201527f47726561746572205468616e20426c6f636b2054696d65205374616d702021006064820152608401610b62565b600d55600f805461ff0019169055565b6060611ef2826122e3565b611f565760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b62565b60165460ff16611ff25760158054611f6d906139bf565b80601f0160208091040260200160405190810160405280929190818152602001828054611f99906139bf565b8015611fe65780601f10611fbb57610100808354040283529160200191611fe6565b820191906000526020600020905b815481529060010190602001808311611fc957829003601f168201915b50505050509050919050565b6000611ffc612c63565b9050600081511161201c5760405180602001604052806000815250611c35565b8061202684612c72565b60405160200161203792919061366f565b6040516020818303038152906040529392505050565b6000546001600160a01b031633146120775760405162461bcd60e51b8152600401610b6290613795565b600b55565b6000546001600160a01b031633146120a65760405162461bcd60e51b8152600401610b6290613795565b60408051808201909152828152602001819052601091909155601155565b6000610a6182612d6f565b6000546001600160a01b031633146120f95760405162461bcd60e51b8152600401610b6290613795565b6016805460ff1916911515919091179055565b6000546001600160a01b031633146121365760405162461bcd60e51b8152600401610b6290613795565b80518251146121985760405162461bcd60e51b815260206004820152602860248201527f61646472657373657320646f6573206e6f74206d61746368206e756d536c6f746044820152670e640d8cadccee8d60c31b6064820152608401610b62565b60005b8251811015610c9a578181815181106121b6576121b6613a55565b6020026020010151601260008584815181106121d4576121d4613a55565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550808061220b906139fa565b91505061219b565b6000546001600160a01b0316331461223d5760405162461bcd60e51b8152600401610b6290613795565b600a55565b6000546001600160a01b0316331461226c5760405162461bcd60e51b8152600401610b6290613795565b6001600160a01b0381166122d15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b62565b611c9a81612b05565b80546001019055565b60006122ee60015490565b909110919050565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061235d8261295e565b80519091506000906001600160a01b0316336001600160a01b0316148061239457503361238984610af9565b6001600160a01b0316145b806123a6575081516123a69033610996565b9050806124105760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610b62565b846001600160a01b031682600001516001600160a01b0316146124845760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610b62565b6001600160a01b0384166124e85760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610b62565b6124f860008484600001516122f6565b6001600160a01b038516600090815260056020526040812080546001929061252a9084906001600160801b031661393d565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526005602052604081208054600194509092612576918591166138d0565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526004909152948520935184549151909216600160a01b026001600160e01b031990911691909216171790556125fd8460016138f2565b6000818152600460205260409020549091506001600160a01b031661268c57612625816122e3565b1561268c5760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b600854816127265760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f00000000000000006044820152606401610b62565b6000600161273484846138f2565b61273e9190613965565b905061276b60017f0000000000000000000000000000000000000000000000000000000000000000613965565b8111156127a05761279d60017f0000000000000000000000000000000000000000000000000000000000000000613965565b90505b6127a9816122e3565b6128045760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201526506c65616e75760d41b6064820152608401610b62565b815b8181116128a9576000818152600460205260409020546001600160a01b03166128975760006128348261295e565b60408051808201825282516001600160a01b0390811682526020938401516001600160401b039081168584019081526000888152600490965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b806128a1816139fa565b915050612806565b506128b58160016138f2565b600855505050565b611b0d828260405180602001604052806000815250612e0d565b803410156129205760405162461bcd60e51b81526020600482015260166024820152752732b2b2103a379039b2b7321036b7b9329022aa241760511b6044820152606401610b62565b80341115611c9a57336108fc6129368334613965565b6040518115909202916000818181858888f19350505050158015611b0d573d6000803e3d6000fd5b604080518082019091526000808252602082015261297b826122e3565b6129da5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610b62565b60007f00000000000000000000000000000000000000000000000000000000000000008310612a3b57612a2d7f000000000000000000000000000000000000000000000000000000000000000084613965565b612a389060016138f2565b90505b825b818110612aa4576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215612a9157949350505050565b5080612a9c816139a8565b915050612a3d565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610b62565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b15612c5757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612b9990339089908890889060040161369e565b602060405180830381600087803b158015612bb357600080fd5b505af1925050508015612be3575060408051601f3d908101601f19168201909252612be09181019061357a565b60015b612c3d573d808015612c11576040519150601f19603f3d011682016040523d82523d6000602084013e612c16565b606091505b508051612c355760405162461bcd60e51b8152600401610b62906137fa565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612c5b565b5060015b949350505050565b606060148054610a76906139bf565b606081612c965750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612cc05780612caa816139fa565b9150612cb99050600a8361390a565b9150612c9a565b6000816001600160401b03811115612cda57612cda613a6b565b6040519080825280601f01601f191660200182016040528015612d04576020820181803683370190505b5090505b8415612c5b57612d19600183613965565b9150612d26600a86613a15565b612d319060306138f2565b60f81b818381518110612d4657612d46613a55565b60200101906001600160f81b031916908160001a905350612d68600a8661390a565b9450612d08565b60006001600160a01b038216612de15760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b6064820152608401610b62565b506001600160a01b0316600090815260056020526040902054600160801b90046001600160801b031690565b6000612e1860015490565b90506001600160a01b038416612e7a5760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610b62565b612e83816122e3565b15612ed05760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610b62565b7f0000000000000000000000000000000000000000000000000000000000000000831115612f4b5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610b62565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612fa79087906138d0565b6001600160801b03168152602001858360200151612fc591906138d0565b6001600160801b039081169091526001600160a01b0380881660008181526005602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526004909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b858110156130f15760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46130a86000888488612b55565b6130c45760405162461bcd60e51b8152600401610b62906137fa565b816130ce816139fa565b9250506130df600180546001019055565b806130e9816139fa565b91505061305b565b506126ce565b828054613103906139bf565b90600052602060002090601f016020900481019282613125576000855561316b565b82601f1061313e5782800160ff1982351617855561316b565b8280016001018555821561316b579182015b8281111561316b578235825591602001919060010190613150565b5061156f9291505b8082111561156f5760008155600101613173565b80356001600160a01b038116811461319e57600080fd5b919050565b600082601f8301126131b457600080fd5b813560206131c96131c4836138ad565b61387d565b80838252828201915082860187848660051b89010111156131e957600080fd5b60005b8581101561320f576131fd82613187565b845292840192908401906001016131ec565b5090979650505050505050565b8035801515811461319e57600080fd5b60006020828403121561323e57600080fd5b611c3582613187565b6000806040838503121561325a57600080fd5b61326383613187565b915061327160208401613187565b90509250929050565b60008060006060848603121561328f57600080fd5b61329884613187565b92506132a660208501613187565b9150604084013590509250925092565b600080600080608085870312156132cc57600080fd5b6132d585613187565b935060206132e4818701613187565b93506040860135925060608601356001600160401b038082111561330757600080fd5b818801915088601f83011261331b57600080fd5b81358181111561332d5761332d613a6b565b61333f601f8201601f1916850161387d565b9150808252898482850101111561335557600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000806040838503121561338857600080fd5b61339183613187565b91506132716020840161321c565b600080604083850312156133b257600080fd5b6133bb83613187565b946020939093013593505050565b600080604083850312156133dc57600080fd5b82356001600160401b03808211156133f357600080fd5b6133ff868387016131a3565b935060209150818501358181111561341657600080fd5b85019050601f8101861361342957600080fd5b80356134376131c4826138ad565b80828252848201915084840189868560051b870101111561345757600080fd5b600094505b838510156134815761346d8161321c565b83526001949094019391850191850161345c565b5080955050505050509250929050565b600080604083850312156134a457600080fd5b82356001600160401b03808211156134bb57600080fd5b6134c7868387016131a3565b93506020915081850135818111156134de57600080fd5b85019050601f810186136134f157600080fd5b80356134ff6131c4826138ad565b80828252848201915084840189868560051b870101111561351f57600080fd5b600094505b83851015613481578035835260019490940193918501918501613524565b60006020828403121561355457600080fd5b611c358261321c565b60006020828403121561356f57600080fd5b8135611c3581613a81565b60006020828403121561358c57600080fd5b8151611c3581613a81565b600080602083850312156135aa57600080fd5b82356001600160401b03808211156135c157600080fd5b818501915085601f8301126135d557600080fd5b8135818111156135e457600080fd5b8660208285010111156135f657600080fd5b60209290920196919550909350505050565b60006020828403121561361a57600080fd5b5035919050565b6000806040838503121561363457600080fd5b50508035926020909101359150565b6000815180845261365b81602086016020860161397c565b601f01601f19169290920160200192915050565b6000835161368181846020880161397c565b83519083019061369581836020880161397c565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906136d190830184613643565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613713578351835292840192918401916001016136f7565b50909695505050505050565b602081526000611c356020830184613643565b6020808252601e908201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604082015260600190565b60208082526012908201527172656163686564206d617820737570706c7960701b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526016908201527514d85b19481a185cc81b9bdd08189959dd5b881e595d60521b604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60208082526016908201527563616e206e6f74206d696e742074686973206d616e7960501b604082015260600190565b604051601f8201601f191681016001600160401b03811182821017156138a5576138a5613a6b565b604052919050565b60006001600160401b038211156138c6576138c6613a6b565b5060051b60200190565b60006001600160801b0380831681851680830382111561369557613695613a29565b6000821982111561390557613905613a29565b500190565b60008261391957613919613a3f565b500490565b600081600019048311821515161561393857613938613a29565b500290565b60006001600160801b038381169083168181101561395d5761395d613a29565b039392505050565b60008282101561397757613977613a29565b500390565b60005b8381101561399757818101518382015260200161397f565b83811115611cf25750506000910152565b6000816139b7576139b7613a29565b506000190190565b600181811c908216806139d357607f821691505b602082108114156139f457634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613a0e57613a0e613a29565b5060010190565b600082613a2457613a24613a3f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611c9a57600080fdfea2646970667358221220029e058d284a2014d0935bf0b9bb214049b228e29f40594bd9fcc9b2c129c9e164736f6c634300080700330000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000d05000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000051

Deployed Bytecode

0x60806040526004361061031a5760003560e01c8063818668d7116101ab578063b88d4fde116100f7578063de26e49811610095578063e92c0f371161006f578063e92c0f371461095b578063e985e9c51461097b578063f2fde38b146109c4578063fbe1aa51146109e457600080fd5b8063de26e49814610905578063e0a808531461091b578063e39465561461093b57600080fd5b8063d3d0fbda116100d1578063d3d0fbda1461088f578063d7224ba0146108af578063da234d6e146108c5578063dc33e681146108e557600080fd5b8063b88d4fde1461082f578063bd4cea2e1461084f578063c87b56dd1461086f57600080fd5b80639231ab2a11610164578063a22cb4651161013e578063a22cb465146107c7578063a3412dce146107e7578063a4a339ee14610807578063ac4460021461081a57600080fd5b80639231ab2a1461073857806395d89b41146107855780639b19251a1461079a57600080fd5b8063818668d71461068b578063866e0124146106ab578063868ff4a2146106c15780638bc35c2f146106d45780638da5cb5b146106ea57806390aa0b0f1461070857600080fd5b806342842e0e1161026a5780635aafa542116102235780636352211e116101fd5780636352211e1461060357806370a0823114610623578063715018a6146106435780637155c1ea1461065857600080fd5b80635aafa542146105a35780635ba7b9cc146105b95780635c975abb146105e957600080fd5b806342842e0e146104d6578063438b6300146104f65780634f6ccce7146105235780634fdd43cb1461054357806355f804b3146105635780635940a30f1461058357600080fd5b806316c38b3c116102d75780632d20fb60116102b15780632d20fb60146104635780632db11544146104835780632f745c5914610496578063375a069a146104b657600080fd5b806316c38b3c1461040e57806318160ddd1461042e57806323b872dd1461044357600080fd5b806301ffc9a71461031f57806306fdde0314610354578063081812fc14610376578063095ea7b3146103ae5780630c4a0367146103d05780630f4161aa146103ef575b600080fd5b34801561032b57600080fd5b5061033f61033a36600461355d565b6109fa565b60405190151581526020015b60405180910390f35b34801561036057600080fd5b50610369610a67565b60405161034b919061371f565b34801561038257600080fd5b50610396610391366004613608565b610af9565b6040516001600160a01b03909116815260200161034b565b3480156103ba57600080fd5b506103ce6103c936600461339f565b610b87565b005b3480156103dc57600080fd5b50600e545b60405190815260200161034b565b3480156103fb57600080fd5b50600f5461033f90610100900460ff1681565b34801561041a57600080fd5b506103ce610429366004613542565b610c9f565b34801561043a57600080fd5b506103e1610cdc565b34801561044f57600080fd5b506103ce61045e36600461327a565b610cf8565b34801561046f57600080fd5b506103ce61047e366004613608565b610d03565b6103ce610491366004613608565b610d96565b3480156104a257600080fd5b506103e16104b136600461339f565b6110a8565b3480156104c257600080fd5b506103ce6104d1366004613608565b61121f565b3480156104e257600080fd5b506103ce6104f136600461327a565b6113f2565b34801561050257600080fd5b5061051661051136600461322c565b61140d565b60405161034b91906136db565b34801561052f57600080fd5b506103e161053e366004613608565b61150b565b34801561054f57600080fd5b506103ce61055e366004613597565b611573565b34801561056f57600080fd5b506103ce61057e366004613597565b6115a9565b34801561058f57600080fd5b506103ce61059e3660046133c9565b6115df565b3480156105af57600080fd5b506103e1600e5481565b3480156105c557600080fd5b5061033f6105d436600461322c565b60136020526000908152604090205460ff1681565b3480156105f557600080fd5b50600f5461033f9060ff1681565b34801561060f57600080fd5b5061039661061e366004613608565b6116e9565b34801561062f57600080fd5b506103e161063e36600461322c565b6116fb565b34801561064f57600080fd5b506103ce61178c565b34801561066457600080fd5b507f0000000000000000000000000000000000000000000000000000000000000d056103e1565b34801561069757600080fd5b506103ce6106a6366004613542565b6117c2565b3480156106b757600080fd5b506103e1600d5481565b6103ce6106cf366004613608565b611806565b3480156106e057600080fd5b506103e1600a5481565b3480156106f657600080fd5b506000546001600160a01b0316610396565b34801561071457600080fd5b50601054601154610723919082565b6040805192835260208301919091520161034b565b34801561074457600080fd5b50610758610753366004613608565b611b11565b6040805182516001600160a01b031681526020928301516001600160401b0316928101929092520161034b565b34801561079157600080fd5b50610369611b2e565b3480156107a657600080fd5b506103e16107b536600461322c565b60126020526000908152604090205481565b3480156107d357600080fd5b506103ce6107e2366004613375565b611b3d565b3480156107f357600080fd5b5061033f610802366004613621565b611c02565b6103ce610815366004613608565b611c3c565b34801561082657600080fd5b506103ce611cf8565b34801561083b57600080fd5b506103ce61084a3660046132b6565b611e05565b34801561085b57600080fd5b506103ce61086a366004613608565b611e38565b34801561087b57600080fd5b5061036961088a366004613608565b611ee7565b34801561089b57600080fd5b506103ce6108aa366004613608565b61204d565b3480156108bb57600080fd5b506103e160085481565b3480156108d157600080fd5b506103ce6108e0366004613621565b61207c565b3480156108f157600080fd5b506103e161090036600461322c565b6120c4565b34801561091157600080fd5b506103e1600c5481565b34801561092757600080fd5b506103ce610936366004613542565b6120cf565b34801561094757600080fd5b506103ce610956366004613491565b61210c565b34801561096757600080fd5b506103ce610976366004613608565b612213565b34801561098757600080fd5b5061033f610996366004613247565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156109d057600080fd5b506103ce6109df36600461322c565b612242565b3480156109f057600080fd5b506103e1600b5481565b60006001600160e01b031982166380ac58cd60e01b1480610a2b57506001600160e01b03198216635b5e139f60e01b145b80610a4657506001600160e01b0319821663780e9d6360e01b145b80610a6157506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060028054610a76906139bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa2906139bf565b8015610aef5780601f10610ac457610100808354040283529160200191610aef565b820191906000526020600020905b815481529060010190602001808311610ad257829003601f168201915b5050505050905090565b6000610b04826122e3565b610b6b5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610b92826116e9565b9050806001600160a01b0316836001600160a01b03161415610c015760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610b62565b336001600160a01b0382161480610c1d5750610c1d8133610996565b610c8f5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610b62565b610c9a8383836122f6565b505050565b6000546001600160a01b03163314610cc95760405162461bcd60e51b8152600401610b6290613795565b600f805460ff1916911515919091179055565b60006001610ce960015490565b610cf39190613965565b905090565b610c9a838383612352565b6000546001600160a01b03163314610d2d5760405162461bcd60e51b8152600401610b6290613795565b60026009541415610d805760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b62565b6002600955610d8e816126d6565b506001600955565b323314610db55760405162461bcd60e51b8152600401610b6290613732565b600f5460ff1615610dd85760405162461bcd60e51b8152600401610b62906137ca565b6000546001600160a01b0316331415610e335760405162461bcd60e51b815260206004820152601a60248201527f4f776e65722053686f756c642043616c6c206465764d696e74210000000000006044820152606401610b62565b60408051808201909152601054815260115460208201819052600d54610e598282611c02565b610ea55760405162461bcd60e51b815260206004820152601d60248201527f7075626c6963206d696e7420686173206e6f7420626567756e207965740000006044820152606401610b62565b7f000000000000000000000000000000000000000000000000000000000000000a841115610f155760405162461bcd60e51b815260206004820181905260248201527f63616e206e6f74206d696e742074686973206d616e7920617420612074696d656044820152606401610b62565b7f0000000000000000000000000000000000000000000000000000000000000d05610f4b6109006000546001600160a01b031690565b600b54610f589190613965565b85610f61610cdc565b610f6b91906138f2565b610f7591906138f2565b1115610f935760405162461bcd60e51b8152600401610b6290613769565b600a5484610fa0336120c4565b610faa91906138f2565b1115610fc85760405162461bcd60e51b8152600401610b629061384d565b600e54849015801590610feb57503360009081526013602052604090205460ff16155b1561108557610ffb600182613965565b9050611007818461391e565b34101561104f5760405162461bcd60e51b81526020600482015260166024820152752732b2b2103a379039b2b7321036b7b9329022aa241760511b6044820152606401610b62565b336000908152601360205260408120805460ff19166001908117909155600e80549192909161107f908490613965565b90915550505b61108f33866128bd565b6110a161109c828561391e565b6128d7565b5050505050565b60006110b3836116fb565b821061110c5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610b62565b6000611116610cdc565b905060008060005b838110156111bf576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561117057805192505b876001600160a01b0316836001600160a01b031614156111ac578684141561119e57509350610a6192505050565b836111a8816139fa565b9450505b50806111b7816139fa565b91505061111e565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610b62565b6000546001600160a01b031633146112495760405162461bcd60e51b8152600401610b6290613795565b61125360006128d7565b600f5460ff16156112765760405162461bcd60e51b8152600401610b62906137ca565b7f0000000000000000000000000000000000000000000000000000000000000d05816112a0610cdc565b6112aa91906138f2565b11156112c85760405162461bcd60e51b8152600401610b6290613769565b600b54816112d5336120c4565b6112df91906138f2565b11156112fd5760405162461bcd60e51b8152600401610b629061384d565b6000807f000000000000000000000000000000000000000000000000000000000000000a83116113365761133133846128bd565b61139a565b6113607f000000000000000000000000000000000000000000000000000000000000000a84613a15565b90507f000000000000000000000000000000000000000000000000000000000000000a61138d8285613965565b611397919061390a565b91505b60005b828110156113e1576113cf337f000000000000000000000000000000000000000000000000000000000000000a6128bd565b806113d9816139fa565b91505061139d565b508015610c9a57610c9a33826128bd565b610c9a83838360405180602001604052806000815250611e05565b6060600061141a836116fb565b90506000816001600160401b0381111561143657611436613a6b565b60405190808252806020026020018201604052801561145f578160200160208202803683370190505b509050600160005b838110801561149657507f0000000000000000000000000000000000000000000000000000000000000d058211155b156115015760006114a6836116e9565b9050866001600160a01b0316816001600160a01b031614156114ee57828483815181106114d5576114d5613a55565b6020908102919091010152816114ea816139fa565b9250505b826114f8816139fa565b93505050611467565b5090949350505050565b6000611515610cdc565b821061156f5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610b62565b5090565b6000546001600160a01b0316331461159d5760405162461bcd60e51b8152600401610b6290613795565b610c9a601583836130f7565b6000546001600160a01b031633146115d35760405162461bcd60e51b8152600401610b6290613795565b610c9a601483836130f7565b6000546001600160a01b031633146116095760405162461bcd60e51b8152600401610b6290613795565b80518251146116695760405162461bcd60e51b815260206004820152602660248201527f61646472657373657320646f6573206e6f74206d6174636820737461746573206044820152650d8cadccee8d60d31b6064820152608401610b62565b60005b8251811015610c9a5781818151811061168757611687613a55565b6020026020010151601360008584815181106116a5576116a5613a55565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806116e1816139fa565b91505061166c565b60006116f48261295e565b5192915050565b60006001600160a01b0382166117675760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610b62565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b6000546001600160a01b031633146117b65760405162461bcd60e51b8152600401610b6290613795565b6117c06000612b05565b565b6000546001600160a01b031633146117ec5760405162461bcd60e51b8152600401610b6290613795565b600f80549115156101000261ff0019909216919091179055565b3233146118255760405162461bcd60e51b8152600401610b6290613732565b6000546001600160a01b03163314156118805760405162461bcd60e51b815260206004820152601a60248201527f4f776e65722053686f756c642043616c6c206465764d696e74210000000000006044820152606401610b62565b600f5460ff16156118a35760405162461bcd60e51b8152600401610b62906137ca565b601054806118f35760405162461bcd60e51b815260206004820181905260248201527f77686974656c6973742073616c6520686173206e6f7420626567756e207965746044820152606401610b62565b600d54158015906119065750600d544211155b6119525760405162461bcd60e51b815260206004820181905260248201527f77686974656c6973742073616c6520686173206e6f7420626567756e207965746044820152606401610b62565b336000908152601260205260409020546119ae5760405162461bcd60e51b815260206004820152601f60248201527f6e6f7420656c696769626c6520666f722077686974656c697374206d696e74006044820152606401610b62565b7f000000000000000000000000000000000000000000000000000000000000000a821115611a1e5760405162461bcd60e51b815260206004820181905260248201527f63616e206e6f74206d696e742074686973206d616e7920617420612074696d656044820152606401610b62565b600a5482611a2b336120c4565b611a3591906138f2565b1115611a535760405162461bcd60e51b8152600401610b629061384d565b7f0000000000000000000000000000000000000000000000000000000000000d05611a896109006000546001600160a01b031690565b600b54611a969190613965565b83611a9f610cdc565b611aa991906138f2565b611ab391906138f2565b1115611ad15760405162461bcd60e51b8152600401610b6290613769565b611ade61109c838361391e565b3360009081526012602052604081208054849290611afd908490613965565b90915550611b0d905033836128bd565b5050565b6040805180820190915260008082526020820152610a618261295e565b606060038054610a76906139bf565b6001600160a01b038216331415611b965760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610b62565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600f5460009060ff16158015611c1757508215155b8015611c2a5750600f54610100900460ff165b8015611c3557508142115b9392505050565b323314611c5b5760405162461bcd60e51b8152600401610b6290613732565b600f5460ff1615611c7e5760405162461bcd60e51b8152600401610b62906137ca565b6000546001600160a01b0316331415611c9d57611c9a8161121f565b50565b600d5415801590611cb05750600d544211155b15611cbe57611c9a81611806565b60408051808201909152601054815260115460208201819052600d54611ce48282611c02565b15611cf257611cf284610d96565b50505050565b6000546001600160a01b03163314611d225760405162461bcd60e51b8152600401610b6290613795565b60026009541415611d755760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b62565b6002600955604051600090339047908381818185875af1925050503d8060008114611dbc576040519150601f19603f3d011682016040523d82523d6000602084013e611dc1565b606091505b5050905080610d8e5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610b62565b611e10848484612352565b611e1c84848484612b55565b611cf25760405162461bcd60e51b8152600401610b62906137fa565b6000546001600160a01b03163314611e625760405162461bcd60e51b8152600401610b6290613795565b428111611ed75760405162461bcd60e51b815260206004820152603f60248201527f77686974656c6973742053616c6520456e642054696d65204d7573742042652060448201527f47726561746572205468616e20426c6f636b2054696d65205374616d702021006064820152608401610b62565b600d55600f805461ff0019169055565b6060611ef2826122e3565b611f565760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b62565b60165460ff16611ff25760158054611f6d906139bf565b80601f0160208091040260200160405190810160405280929190818152602001828054611f99906139bf565b8015611fe65780601f10611fbb57610100808354040283529160200191611fe6565b820191906000526020600020905b815481529060010190602001808311611fc957829003601f168201915b50505050509050919050565b6000611ffc612c63565b9050600081511161201c5760405180602001604052806000815250611c35565b8061202684612c72565b60405160200161203792919061366f565b6040516020818303038152906040529392505050565b6000546001600160a01b031633146120775760405162461bcd60e51b8152600401610b6290613795565b600b55565b6000546001600160a01b031633146120a65760405162461bcd60e51b8152600401610b6290613795565b60408051808201909152828152602001819052601091909155601155565b6000610a6182612d6f565b6000546001600160a01b031633146120f95760405162461bcd60e51b8152600401610b6290613795565b6016805460ff1916911515919091179055565b6000546001600160a01b031633146121365760405162461bcd60e51b8152600401610b6290613795565b80518251146121985760405162461bcd60e51b815260206004820152602860248201527f61646472657373657320646f6573206e6f74206d61746368206e756d536c6f746044820152670e640d8cadccee8d60c31b6064820152608401610b62565b60005b8251811015610c9a578181815181106121b6576121b6613a55565b6020026020010151601260008584815181106121d4576121d4613a55565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550808061220b906139fa565b91505061219b565b6000546001600160a01b0316331461223d5760405162461bcd60e51b8152600401610b6290613795565b600a55565b6000546001600160a01b0316331461226c5760405162461bcd60e51b8152600401610b6290613795565b6001600160a01b0381166122d15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b62565b611c9a81612b05565b80546001019055565b60006122ee60015490565b909110919050565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061235d8261295e565b80519091506000906001600160a01b0316336001600160a01b0316148061239457503361238984610af9565b6001600160a01b0316145b806123a6575081516123a69033610996565b9050806124105760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610b62565b846001600160a01b031682600001516001600160a01b0316146124845760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610b62565b6001600160a01b0384166124e85760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610b62565b6124f860008484600001516122f6565b6001600160a01b038516600090815260056020526040812080546001929061252a9084906001600160801b031661393d565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526005602052604081208054600194509092612576918591166138d0565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526004909152948520935184549151909216600160a01b026001600160e01b031990911691909216171790556125fd8460016138f2565b6000818152600460205260409020549091506001600160a01b031661268c57612625816122e3565b1561268c5760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b600854816127265760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f00000000000000006044820152606401610b62565b6000600161273484846138f2565b61273e9190613965565b905061276b60017f0000000000000000000000000000000000000000000000000000000000000d05613965565b8111156127a05761279d60017f0000000000000000000000000000000000000000000000000000000000000d05613965565b90505b6127a9816122e3565b6128045760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201526506c65616e75760d41b6064820152608401610b62565b815b8181116128a9576000818152600460205260409020546001600160a01b03166128975760006128348261295e565b60408051808201825282516001600160a01b0390811682526020938401516001600160401b039081168584019081526000888152600490965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b806128a1816139fa565b915050612806565b506128b58160016138f2565b600855505050565b611b0d828260405180602001604052806000815250612e0d565b803410156129205760405162461bcd60e51b81526020600482015260166024820152752732b2b2103a379039b2b7321036b7b9329022aa241760511b6044820152606401610b62565b80341115611c9a57336108fc6129368334613965565b6040518115909202916000818181858888f19350505050158015611b0d573d6000803e3d6000fd5b604080518082019091526000808252602082015261297b826122e3565b6129da5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610b62565b60007f000000000000000000000000000000000000000000000000000000000000000a8310612a3b57612a2d7f000000000000000000000000000000000000000000000000000000000000000a84613965565b612a389060016138f2565b90505b825b818110612aa4576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215612a9157949350505050565b5080612a9c816139a8565b915050612a3d565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610b62565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b15612c5757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612b9990339089908890889060040161369e565b602060405180830381600087803b158015612bb357600080fd5b505af1925050508015612be3575060408051601f3d908101601f19168201909252612be09181019061357a565b60015b612c3d573d808015612c11576040519150601f19603f3d011682016040523d82523d6000602084013e612c16565b606091505b508051612c355760405162461bcd60e51b8152600401610b62906137fa565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612c5b565b5060015b949350505050565b606060148054610a76906139bf565b606081612c965750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612cc05780612caa816139fa565b9150612cb99050600a8361390a565b9150612c9a565b6000816001600160401b03811115612cda57612cda613a6b565b6040519080825280601f01601f191660200182016040528015612d04576020820181803683370190505b5090505b8415612c5b57612d19600183613965565b9150612d26600a86613a15565b612d319060306138f2565b60f81b818381518110612d4657612d46613a55565b60200101906001600160f81b031916908160001a905350612d68600a8661390a565b9450612d08565b60006001600160a01b038216612de15760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b6064820152608401610b62565b506001600160a01b0316600090815260056020526040902054600160801b90046001600160801b031690565b6000612e1860015490565b90506001600160a01b038416612e7a5760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610b62565b612e83816122e3565b15612ed05760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610b62565b7f000000000000000000000000000000000000000000000000000000000000000a831115612f4b5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610b62565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612fa79087906138d0565b6001600160801b03168152602001858360200151612fc591906138d0565b6001600160801b039081169091526001600160a01b0380881660008181526005602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526004909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b858110156130f15760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46130a86000888488612b55565b6130c45760405162461bcd60e51b8152600401610b62906137fa565b816130ce816139fa565b9250506130df600180546001019055565b806130e9816139fa565b91505061305b565b506126ce565b828054613103906139bf565b90600052602060002090601f016020900481019282613125576000855561316b565b82601f1061313e5782800160ff1982351617855561316b565b8280016001018555821561316b579182015b8281111561316b578235825591602001919060010190613150565b5061156f9291505b8082111561156f5760008155600101613173565b80356001600160a01b038116811461319e57600080fd5b919050565b600082601f8301126131b457600080fd5b813560206131c96131c4836138ad565b61387d565b80838252828201915082860187848660051b89010111156131e957600080fd5b60005b8581101561320f576131fd82613187565b845292840192908401906001016131ec565b5090979650505050505050565b8035801515811461319e57600080fd5b60006020828403121561323e57600080fd5b611c3582613187565b6000806040838503121561325a57600080fd5b61326383613187565b915061327160208401613187565b90509250929050565b60008060006060848603121561328f57600080fd5b61329884613187565b92506132a660208501613187565b9150604084013590509250925092565b600080600080608085870312156132cc57600080fd5b6132d585613187565b935060206132e4818701613187565b93506040860135925060608601356001600160401b038082111561330757600080fd5b818801915088601f83011261331b57600080fd5b81358181111561332d5761332d613a6b565b61333f601f8201601f1916850161387d565b9150808252898482850101111561335557600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000806040838503121561338857600080fd5b61339183613187565b91506132716020840161321c565b600080604083850312156133b257600080fd5b6133bb83613187565b946020939093013593505050565b600080604083850312156133dc57600080fd5b82356001600160401b03808211156133f357600080fd5b6133ff868387016131a3565b935060209150818501358181111561341657600080fd5b85019050601f8101861361342957600080fd5b80356134376131c4826138ad565b80828252848201915084840189868560051b870101111561345757600080fd5b600094505b838510156134815761346d8161321c565b83526001949094019391850191850161345c565b5080955050505050509250929050565b600080604083850312156134a457600080fd5b82356001600160401b03808211156134bb57600080fd5b6134c7868387016131a3565b93506020915081850135818111156134de57600080fd5b85019050601f810186136134f157600080fd5b80356134ff6131c4826138ad565b80828252848201915084840189868560051b870101111561351f57600080fd5b600094505b83851015613481578035835260019490940193918501918501613524565b60006020828403121561355457600080fd5b611c358261321c565b60006020828403121561356f57600080fd5b8135611c3581613a81565b60006020828403121561358c57600080fd5b8151611c3581613a81565b600080602083850312156135aa57600080fd5b82356001600160401b03808211156135c157600080fd5b818501915085601f8301126135d557600080fd5b8135818111156135e457600080fd5b8660208285010111156135f657600080fd5b60209290920196919550909350505050565b60006020828403121561361a57600080fd5b5035919050565b6000806040838503121561363457600080fd5b50508035926020909101359150565b6000815180845261365b81602086016020860161397c565b601f01601f19169290920160200192915050565b6000835161368181846020880161397c565b83519083019061369581836020880161397c565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906136d190830184613643565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613713578351835292840192918401916001016136f7565b50909695505050505050565b602081526000611c356020830184613643565b6020808252601e908201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604082015260600190565b60208082526012908201527172656163686564206d617820737570706c7960701b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526016908201527514d85b19481a185cc81b9bdd08189959dd5b881e595d60521b604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60208082526016908201527563616e206e6f74206d696e742074686973206d616e7960501b604082015260600190565b604051601f8201601f191681016001600160401b03811182821017156138a5576138a5613a6b565b604052919050565b60006001600160401b038211156138c6576138c6613a6b565b5060051b60200190565b60006001600160801b0380831681851680830382111561369557613695613a29565b6000821982111561390557613905613a29565b500190565b60008261391957613919613a3f565b500490565b600081600019048311821515161561393857613938613a29565b500290565b60006001600160801b038381169083168181101561395d5761395d613a29565b039392505050565b60008282101561397757613977613a29565b500390565b60005b8381101561399757818101518382015260200161397f565b83811115611cf25750506000910152565b6000816139b7576139b7613a29565b506000190190565b600181811c908216806139d357607f821691505b602082108114156139f457634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613a0e57613a0e613a29565b5060010190565b600082613a2457613a24613a3f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611c9a57600080fdfea2646970667358221220029e058d284a2014d0935bf0b9bb214049b228e29f40594bd9fcc9b2c129c9e164736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000d05000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000051

-----Decoded View---------------
Arg [0] : maxPerAddressDuringMint_ (uint256): 3
Arg [1] : maxBatchSize_ (uint256): 10
Arg [2] : collectionSize_ (uint256): 3333
Arg [3] : amountForDevs_ (uint256): 30
Arg [4] : freeAmountForPublic_ (uint256): 81

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [1] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000d05
Arg [3] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000051


Deployed Bytecode Sourcemap

46102:11081:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29524:422;;;;;;;;;;-1:-1:-1;29524:422:0;;;;;:::i;:::-;;:::i;:::-;;;9815:14:1;;9808:22;9790:41;;9778:2;9763:18;29524:422:0;;;;;;;;31485:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33180:292::-;;;;;;;;;;-1:-1:-1;33180:292:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8476:32:1;;;8458:51;;8446:2;8431:18;33180:292:0;8312:203:1;32701:413:0;;;;;;;;;;-1:-1:-1;32701:413:0;;;;;:::i;:::-;;:::i;:::-;;55171:123;;;;;;;;;;-1:-1:-1;55260:26:0;;55171:123;;;25320:25:1;;;25308:2;25293:18;55171:123:0;25174:177:1;46445:37:0;;;;;;;;;;-1:-1:-1;46445:37:0;;;;;;;;;;;48464:85;;;;;;;;;;-1:-1:-1;48464:85:0;;;;;:::i;:::-;;:::i;27872:108::-;;;;;;;;;;;;;:::i;34207:162::-;;;;;;;;;;-1:-1:-1;34207:162:0;;;;;:::i;:::-;;:::i;56728:156::-;;;;;;;;;;-1:-1:-1;56728:156:0;;;;;:::i;:::-;;:::i;49834:1442::-;;;;;;:::i;:::-;;:::i;28588:864::-;;;;;;;;;;-1:-1:-1;28588:864:0;;;;;:::i;:::-;;:::i;52633:893::-;;;;;;;;;;-1:-1:-1;52633:893:0;;;;;:::i;:::-;;:::i;34440:177::-;;;;;;;;;;-1:-1:-1;34440:177:0;;;;;:::i;:::-;;:::i;54297:759::-;;;;;;;;;;-1:-1:-1;54297:759:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;28057:228::-;;;;;;;;;;-1:-1:-1;28057:228:0;;;;;:::i;:::-;;:::i;55676:164::-;;;;;;;;;;-1:-1:-1;55676:164:0;;;;;:::i;:::-;;:::i;55562:106::-;;;;;;;;;;-1:-1:-1;55562:106:0;;;;;:::i;:::-;;:::i;52219:379::-;;;;;;;;;;-1:-1:-1;52219:379:0;;;;;:::i;:::-;;:::i;46361:45::-;;;;;;;;;;;;;;;;46676:44;;;;;;;;;;-1:-1:-1;46676:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;46413:25;;;;;;;;;;-1:-1:-1;46413:25:0;;;;;;;;31294:124;;;;;;;;;;-1:-1:-1;31294:124:0;;;;;:::i;:::-;;:::i;30010:258::-;;;;;;;;;;-1:-1:-1;30010:258:0;;;;;:::i;:::-;;:::i;45165:103::-;;;;;;;;;;;;;:::i;55064:99::-;;;;;;;;;;-1:-1:-1;55141:14:0;55064:99;;48557:107;;;;;;;;;;-1:-1:-1;48557:107:0;;;;;:::i;:::-;;:::i;46319:35::-;;;;;;;;;;;;;;;;48672:1154;;;;;;:::i;:::-;;:::i;46198:38::-;;;;;;;;;;;;;;;;44514:87;;;;;;;;;;-1:-1:-1;44560:7:0;44587:6;-1:-1:-1;;;;;44587:6:0;44514:87;;46588:28;;;;;;;;;;-1:-1:-1;46588:28:0;;;;;;;;;;;;;25530:25:1;;;25586:2;25571:18;;25564:34;;;;25503:18;46588:28:0;25356:248:1;57013:167:0;;;;;;;;;;-1:-1:-1;57013:167:0;;;;;:::i;:::-;;:::i;:::-;;;;25039:13:1;;-1:-1:-1;;;;;25035:39:1;25017:58;;25135:4;25123:17;;;25117:24;-1:-1:-1;;;;;25113:49:1;25091:20;;;25084:79;;;;24990:18;57013:167:0;24809:360:1;31654:104:0;;;;;;;;;;;;;:::i;46625:44::-;;;;;;;;;;-1:-1:-1;46625:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;33544:311;;;;;;;;;;-1:-1:-1;33544:311:0;;;;;:::i;:::-;;:::i;51516:303::-;;;;;;;;;;-1:-1:-1;51516:303:0;;;;;:::i;:::-;;:::i;53534:755::-;;;;;;:::i;:::-;;:::i;56529:191::-;;;;;;;;;;;;;:::i;34688:355::-;;;;;;;;;;-1:-1:-1;34688:355:0;;;;;:::i;:::-;;:::i;48093:363::-;;;;;;;;;;-1:-1:-1;48093:363:0;;;;;:::i;:::-;;:::i;55944:577::-;;;;;;;;;;-1:-1:-1;55944:577:0;;;;;:::i;:::-;;:::i;47652:108::-;;;;;;;;;;-1:-1:-1;47652:108:0;;;;;:::i;:::-;;:::i;39572:43::-;;;;;;;;;;;;;;;;47904:181;;;;;;;;;;-1:-1:-1;47904:181:0;;;;;:::i;:::-;;:::i;56892:113::-;;;;;;;;;;-1:-1:-1;56892:113:0;;;;;:::i;:::-;;:::i;46278:34::-;;;;;;;;;;;;;;;;55848:88;;;;;;;;;;-1:-1:-1;55848:88:0;;;;;:::i;:::-;;:::i;51827:384::-;;;;;;;;;;-1:-1:-1;51827:384:0;;;;;:::i;:::-;;:::i;47768:128::-;;;;;;;;;;-1:-1:-1;47768:128:0;;;;;:::i;:::-;;:::i;33926:214::-;;;;;;;;;;-1:-1:-1;33926:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;34097:25:0;;;34068:4;34097:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;33926:214;45423:201;;;;;;;;;;-1:-1:-1;45423:201:0;;;;;:::i;:::-;;:::i;46243:28::-;;;;;;;;;;;;;;;;29524:422;29671:4;-1:-1:-1;;;;;;29713:40:0;;-1:-1:-1;;;29713:40:0;;:105;;-1:-1:-1;;;;;;;29770:48:0;;-1:-1:-1;;;29770:48:0;29713:105;:172;;;-1:-1:-1;;;;;;;29835:50:0;;-1:-1:-1;;;29835:50:0;29713:172;:225;;;-1:-1:-1;;;;;;;;;;14695:40:0;;;29902:36;29693:245;29524:422;-1:-1:-1;;29524:422:0:o;31485:100::-;31539:13;31572:5;31565:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31485:100;:::o;33180:292::-;33284:7;33331:16;33339:7;33331;:16::i;:::-;33309:111;;;;-1:-1:-1;;;33309:111:0;;23785:2:1;33309:111:0;;;23767:21:1;23824:2;23804:18;;;23797:30;23863:34;23843:18;;;23836:62;-1:-1:-1;;;23914:18:1;;;23907:43;23967:19;;33309:111:0;;;;;;;;;-1:-1:-1;33440:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;33440:24:0;;33180:292::o;32701:413::-;32774:13;32790:24;32806:7;32790:15;:24::i;:::-;32774:40;;32839:5;-1:-1:-1;;;;;32833:11:0;:2;-1:-1:-1;;;;;32833:11:0;;;32825:58;;;;-1:-1:-1;;;32825:58:0;;19150:2:1;32825:58:0;;;19132:21:1;19189:2;19169:18;;;19162:30;19228:34;19208:18;;;19201:62;-1:-1:-1;;;19279:18:1;;;19272:32;19321:19;;32825:58:0;18948:398:1;32825:58:0;25016:10;-1:-1:-1;;;;;32918:21:0;;;;:62;;-1:-1:-1;32943:37:0;32960:5;25016:10;33926:214;:::i;32943:37::-;32896:169;;;;-1:-1:-1;;;32896:169:0;;13798:2:1;32896:169:0;;;13780:21:1;13837:2;13817:18;;;13810:30;13876:34;13856:18;;;13849:62;13947:27;13927:18;;;13920:55;13992:19;;32896:169:0;13596:421:1;32896:169:0;33078:28;33087:2;33091:7;33100:5;33078:8;:28::i;:::-;32763:351;32701:413;;:::o;48464:85::-;44560:7;44587:6;-1:-1:-1;;;;;44587:6:0;25016:10;44734:23;44726:68;;;;-1:-1:-1;;;44726:68:0;;;;;;;:::i;:::-;48526:6:::1;:15:::0;;-1:-1:-1;;48526:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48464:85::o;27872:108::-;27925:7;27971:1;27952:16;:6;997:14;;905:114;27952:16;:20;;;;:::i;:::-;27945:27;;27872:108;:::o;34207:162::-;34333:28;34343:4;34349:2;34353:7;34333:9;:28::i;56728:156::-;44560:7;44587:6;-1:-1:-1;;;;;44587:6:0;25016:10;44734:23;44726:68;;;;-1:-1:-1;;;44726:68:0;;;;;;;:::i;:::-;23310:1:::1;23908:7;;:19;;23900:63;;;::::0;-1:-1:-1;;;23900:63:0;;23009:2:1;23900:63:0::1;::::0;::::1;22991:21:1::0;23048:2;23028:18;;;23021:30;23087:33;23067:18;;;23060:61;23138:18;;23900:63:0::1;22807:355:1::0;23900:63:0::1;23310:1;24041:7;:18:::0;56848:28:::2;56867:8:::0;56848:18:::2;:28::i;:::-;-1:-1:-1::0;23266:1:0::1;24220:7;:22:::0;56728:156::o;49834:1442::-;47566:9;47579:10;47566:23;47558:66;;;;-1:-1:-1;;;47558:66:0;;;;;;;:::i;:::-;49920:6:::1;::::0;::::1;;49919:7;49911:42;;;;-1:-1:-1::0;;;49911:42:0::1;;;;;;;:::i;:::-;44560:7:::0;44587:6;-1:-1:-1;;;;;44587:6:0;49972:10:::1;:21;;49964:60;;;::::0;-1:-1:-1;;;49964:60:0;;18444:2:1;49964:60:0::1;::::0;::::1;18426:21:1::0;18483:2;18463:18;;;18456:30;18522:28;18502:18;;;18495:56;18568:18;;49964:60:0::1;18242:350:1::0;49964:60:0::1;50035:37;::::0;;;;::::1;::::0;;;50062:10:::1;50035:37:::0;;;;;::::1;::::0;::::1;::::0;;;50175:20:::1;::::0;50228:50:::1;50035:37:::0;50175:20;50228:14:::1;:50::i;:::-;50206:129;;;::::0;-1:-1:-1;;;50206:129:0;;14577:2:1;50206:129:0::1;::::0;::::1;14559:21:1::0;14616:2;14596:18;;;14589:30;14655:31;14635:18;;;14628:59;14704:18;;50206:129:0::1;14375:353:1::0;50206:129:0::1;50366:12;50354:8;:24;;50346:69;;;::::0;-1:-1:-1;;;50346:69:0;;13437:2:1;50346:69:0::1;::::0;::::1;13419:21:1::0;;;13456:18;;;13449:30;13515:34;13495:18;;;13488:62;13567:18;;50346:69:0::1;13235:356:1::0;50346:69:0::1;50569:14;50526:21;50539:7;44560::::0;44587:6;-1:-1:-1;;;;;44587:6:0;;44514:87;50526:21:::1;50510:13;;:37;;;;:::i;:::-;50481:8;50448:13;:11;:13::i;:::-;:41;;;;:::i;:::-;:100;;;;:::i;:::-;:135;;50426:203;;;;-1:-1:-1::0;;;50426:203:0::1;;;;;;;:::i;:::-;50701:23;;50689:8;50662:24;50675:10;50662:12;:24::i;:::-;:35;;;;:::i;:::-;:62;;50640:134;;;;-1:-1:-1::0;;;50640:134:0::1;;;;;;;:::i;:::-;50835:26;::::0;50810:8;;50835:30;;;;:59:::1;;-1:-1:-1::0;50883:10:0::1;50870:24;::::0;;;:12:::1;:24;::::0;;;;;::::1;;50869:25;50835:59;50831:343;;;50911:19;50929:1;50911:19:::0;::::1;:::i;:::-;::::0;-1:-1:-1;50984:28:0::1;50911:19:::0;50984:11;:28:::1;:::i;:::-;50971:9;:41;;50945:125;;;::::0;-1:-1:-1;;;50945:125:0;;20318:2:1;50945:125:0::1;::::0;::::1;20300:21:1::0;20357:2;20337:18;;;20330:30;-1:-1:-1;;;20376:18:1;;;20369:52;20438:18;;50945:125:0::1;20116:346:1::0;50945:125:0::1;51098:10;51085:24;::::0;;;:12:::1;:24;::::0;;;;:31;;-1:-1:-1;;51085:31:0::1;51112:4;51085:31:::0;;::::1;::::0;;;51131:26:::1;:31:::0;;51112:4;;51131:26;;:31:::1;::::0;51112:4;;51131:31:::1;:::i;:::-;::::0;;;-1:-1:-1;;50831:343:0::1;51184:31;51194:10;51206:8;51184:9;:31::i;:::-;51226:42;51239:28;51253:14:::0;51239:11;:28:::1;:::i;:::-;51226:12;:42::i;:::-;49900:1376;;;;49834:1442:::0;:::o;28588:864::-;28713:7;28754:16;28764:5;28754:9;:16::i;:::-;28746:5;:24;28738:71;;;;-1:-1:-1;;;28738:71:0;;10268:2:1;28738:71:0;;;10250:21:1;10307:2;10287:18;;;10280:30;10346:34;10326:18;;;10319:62;-1:-1:-1;;;10397:18:1;;;10390:32;10439:19;;28738:71:0;10066:398:1;28738:71:0;28820:22;28845:13;:11;:13::i;:::-;28820:38;;28869:19;28903:25;28957:9;28952:426;28976:14;28972:1;:18;28952:426;;;29012:31;29046:14;;;:11;:14;;;;;;;;;29012:48;;;;;;;;;-1:-1:-1;;;;;29012:48:0;;;;;-1:-1:-1;;;29012:48:0;;;-1:-1:-1;;;;;29012:48:0;;;;;;;;29079:28;29075:103;;29148:14;;;-1:-1:-1;29075:103:0;29217:5;-1:-1:-1;;;;;29196:26:0;:17;-1:-1:-1;;;;;29196:26:0;;29192:175;;;29262:5;29247:11;:20;29243:77;;;-1:-1:-1;29299:1:0;-1:-1:-1;29292:8:0;;-1:-1:-1;;;29292:8:0;29243:77;29338:13;;;;:::i;:::-;;;;29192:175;-1:-1:-1;28992:3:0;;;;:::i;:::-;;;;28952:426;;;-1:-1:-1;29388:56:0;;-1:-1:-1;;;29388:56:0;;22187:2:1;29388:56:0;;;22169:21:1;22226:2;22206:18;;;22199:30;22265:34;22245:18;;;22238:62;-1:-1:-1;;;22316:18:1;;;22309:44;22370:19;;29388:56:0;21985:410:1;52633:893:0;44560:7;44587:6;-1:-1:-1;;;;;44587:6:0;25016:10;44734:23;44726:68;;;;-1:-1:-1;;;44726:68:0;;;;;;;:::i;:::-;52696:15:::1;52709:1;52696:12;:15::i;:::-;52731:6;::::0;::::1;;52730:7;52722:42;;;;-1:-1:-1::0;;;52722:42:0::1;;;;;;;:::i;:::-;52825:14;52813:8;52797:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;52775:110;;;;-1:-1:-1::0;;;52775:110:0::1;;;;;;;:::i;:::-;52959:13;;52947:8;52920:24;52933:10;52920:12;:24::i;:::-;:35;;;;:::i;:::-;:52;;52898:124;;;;-1:-1:-1::0;;;52898:124:0::1;;;;;;;:::i;:::-;53033:17;53065::::0;53113:12:::1;53101:8;:24;53097:220;;53142:31;53152:10;53164:8;53142:9;:31::i;:::-;53097:220;;;53218:23;53229:12;53218:8:::0;:23:::1;:::i;:::-;53206:35:::0;-1:-1:-1;53293:12:0::1;53269:20;53206:35:::0;53269:8;:20:::1;:::i;:::-;53268:37;;;;:::i;:::-;53256:49;;53097:220;53334:9;53329:102;53353:9;53349:1;:13;53329:102;;;53384:35;53394:10;53406:12;53384:9;:35::i;:::-;53364:3:::0;::::1;::::0;::::1;:::i;:::-;;;;53329:102;;;-1:-1:-1::0;53445:13:0;;53441:78:::1;;53475:32;53485:10;53497:9;53475;:32::i;34440:177::-:0;34570:39;34587:4;34593:2;34597:7;34570:39;;;;;;;;;;;;:16;:39::i;54297:759::-;54384:16;54418:23;54444:17;54454:6;54444:9;:17::i;:::-;54418:43;;54472:30;54519:15;-1:-1:-1;;;;;54505:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54505:30:0;-1:-1:-1;54472:63:0;-1:-1:-1;54571:1:0;54546:22;54623:395;54662:15;54644;:33;:82;;;;;54712:14;54694;:32;;54644:82;54623:395;;;54753:25;54781:23;54789:14;54781:7;:23::i;:::-;54753:51;;54846:6;-1:-1:-1;;;;;54825:27:0;:17;-1:-1:-1;;;;;54825:27:0;;54821:153;;;54906:14;54873:13;54887:15;54873:30;;;;;;;;:::i;:::-;;;;;;;;;;:47;54941:17;;;;:::i;:::-;;;;54821:153;54990:16;;;;:::i;:::-;;;;54738:280;54623:395;;;-1:-1:-1;55035:13:0;;54297:759;-1:-1:-1;;;;54297:759:0:o;28057:228::-;28160:7;28201:13;:11;:13::i;:::-;28193:5;:21;28185:69;;;;-1:-1:-1;;;28185:69:0;;11850:2:1;28185:69:0;;;11832:21:1;11889:2;11869:18;;;11862:30;11928:34;11908:18;;;11901:62;-1:-1:-1;;;11979:18:1;;;11972:33;12022:19;;28185:69:0;11648:399:1;28185:69:0;-1:-1:-1;28272:5:0;28057:228::o;55676:164::-;44560:7;44587:6;-1:-1:-1;;;;;44587:6:0;25016:10;44734:23;44726:68;;;;-1:-1:-1;;;44726:68:0;;;;;;;:::i;:::-;55794:38:::1;:18;55815:17:::0;;55794:38:::1;:::i;55562:106::-:0;44560:7;44587:6;-1:-1:-1;;;;;44587:6:0;25016:10;44734:23;44726:68;;;;-1:-1:-1;;;44726:68:0;;;;;;;:::i;:::-;55637:23:::1;:13;55653:7:::0;;55637:23:::1;:::i;52219:379::-:0;44560:7;44587:6;-1:-1:-1;;;;;44587:6:0;25016:10;44734:23;44726:68;;;;-1:-1:-1;;;44726:68:0;;;;;;;:::i;:::-;52389:6:::1;:13;52369:9;:16;:33;52347:121;;;::::0;-1:-1:-1;;;52347:121:0;;20669:2:1;52347:121:0::1;::::0;::::1;20651:21:1::0;20708:2;20688:18;;;20681:30;20747:34;20727:18;;;20720:62;-1:-1:-1;;;20798:18:1;;;20791:36;20844:19;;52347:121:0::1;20467:402:1::0;52347:121:0::1;52484:9;52479:112;52503:9;:16;52499:1;:20;52479:112;;;52570:6;52577:1;52570:9;;;;;;;;:::i;:::-;;;;;;;52541:12;:26;52554:9;52564:1;52554:12;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;52541:26:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;52541:26:0;:38;;-1:-1:-1;;52541:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;52521:3;::::1;::::0;::::1;:::i;:::-;;;;52479:112;;31294:124:::0;31358:7;31385:20;31397:7;31385:11;:20::i;:::-;:25;;31294:124;-1:-1:-1;;31294:124:0:o;30010:258::-;30074:7;-1:-1:-1;;;;;30116:19:0;;30094:112;;;;-1:-1:-1;;;30094:112:0;;14935:2:1;30094:112:0;;;14917:21:1;14974:2;14954:18;;;14947:30;15013:34;14993:18;;;14986:62;-1:-1:-1;;;15064:18:1;;;15057:41;15115:19;;30094:112:0;14733:407:1;30094:112:0;-1:-1:-1;;;;;;30232:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;30232:27:0;;30010:258::o;45165:103::-;44560:7;44587:6;-1:-1:-1;;;;;44587:6:0;25016:10;44734:23;44726:68;;;;-1:-1:-1;;;44726:68:0;;;;;;;:::i;:::-;45230:30:::1;45257:1;45230:18;:30::i;:::-;45165:103::o:0;48557:107::-;44560:7;44587:6;-1:-1:-1;;;;;44587:6:0;25016:10;44734:23;44726:68;;;;-1:-1:-1;;;44726:68:0;;;;;;;:::i;:::-;48630:17:::1;:26:::0;;;::::1;;;;-1:-1:-1::0;;48630:26:0;;::::1;::::0;;;::::1;::::0;;48557:107::o;48672:1154::-;47566:9;47579:10;47566:23;47558:66;;;;-1:-1:-1;;;47558:66:0;;;;;;;:::i;:::-;44560:7;44587:6;-1:-1:-1;;;;;44587:6:0;48760:10:::1;:21;;48752:60;;;::::0;-1:-1:-1;;;48752:60:0;;18444:2:1;48752:60:0::1;::::0;::::1;18426:21:1::0;18483:2;18463:18;;;18456:30;18522:28;18502:18;;;18495:56;18568:18;;48752:60:0::1;18242:350:1::0;48752:60:0::1;48832:6;::::0;::::1;;48831:7;48823:42;;;;-1:-1:-1::0;;;48823:42:0::1;;;;;;;:::i;:::-;48900:10;:25:::0;48945:10;48937:55:::1;;;::::0;-1:-1:-1;;;48937:55:0;;10671:2:1;48937:55:0::1;::::0;::::1;10653:21:1::0;;;10690:18;;;10683:30;10749:34;10729:18;;;10722:62;10801:18;;48937:55:0::1;10469:356:1::0;48937:55:0::1;49025:20;::::0;:25;;::::1;::::0;:85:::1;;;49090:20;;49071:15;:39;;49025:85;49003:167;;;::::0;-1:-1:-1;;;49003:167:0;;10671:2:1;49003:167:0::1;::::0;::::1;10653:21:1::0;;;10690:18;;;10683:30;10749:34;10729:18;;;10722:62;10801:18;;49003:167:0::1;10469:356:1::0;49003:167:0::1;49199:10;49213:1;49189:21:::0;;;:9:::1;:21;::::0;;;;;49181:69:::1;;;::::0;-1:-1:-1;;;49181:69:0;;17310:2:1;49181:69:0::1;::::0;::::1;17292:21:1::0;17349:2;17329:18;;;17322:30;17388:33;17368:18;;;17361:61;17439:18;;49181:69:0::1;17108:355:1::0;49181:69:0::1;49281:12;49269:8;:24;;49261:69;;;::::0;-1:-1:-1;;;49261:69:0;;13437:2:1;49261:69:0::1;::::0;::::1;13419:21:1::0;;;13456:18;;;13449:30;13515:34;13495:18;;;13488:62;13567:18;;49261:69:0::1;13235:356:1::0;49261:69:0::1;49402:23;;49390:8;49363:24;49376:10;49363:12;:24::i;:::-;:35;;;;:::i;:::-;:62;;49341:134;;;;-1:-1:-1::0;;;49341:134:0::1;;;;;;;:::i;:::-;49631:14;49588:21;49601:7;44560::::0;44587:6;-1:-1:-1;;;;;44587:6:0;;44514:87;49588:21:::1;49572:13;;:37;;;;:::i;:::-;49543:8;49510:13;:11;:13::i;:::-;:41;;;;:::i;:::-;:100;;;;:::i;:::-;:135;;49488:203;;;;-1:-1:-1::0;;;49488:203:0::1;;;;;;;:::i;:::-;49702:30;49715:16;49723:8:::0;49715:5;:16:::1;:::i;49702:30::-;49753:10;49743:21;::::0;;;:9:::1;:21;::::0;;;;:33;;49768:8;;49743:21;:33:::1;::::0;49768:8;;49743:33:::1;:::i;:::-;::::0;;;-1:-1:-1;49787:31:0::1;::::0;-1:-1:-1;49797:10:0::1;49809:8:::0;49787:9:::1;:31::i;:::-;48741:1085;48672:1154:::0;:::o;57013:167::-;-1:-1:-1;;;;;;;;;;;;;;;;;57152:20:0;57164:7;57152:11;:20::i;31654:104::-;31710:13;31743:7;31736:14;;;;;:::i;33544:311::-;-1:-1:-1;;;;;33662:24:0;;25016:10;33662:24;;33654:63;;;;-1:-1:-1;;;33654:63:0;;17670:2:1;33654:63:0;;;17652:21:1;17709:2;17689:18;;;17682:30;17748:28;17728:18;;;17721:56;17794:18;;33654:63:0;17468:350:1;33654:63:0;25016:10;33730:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;33730:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;33730:53:0;;;;;;;;;;33799:48;;9790:41:1;;;33730:42:0;;25016:10;33799:48;;9763:18:1;33799:48:0;;;;;;;33544:311;;:::o;51516:303::-;51679:6;;51641:4;;51679:6;;51678:7;:43;;;;-1:-1:-1;51702:19:0;;;51678:43;:77;;;;-1:-1:-1;51738:17:0;;;;;;;51678:77;:133;;;;;51790:21;51772:15;:39;51678:133;51658:153;51516:303;-1:-1:-1;;;51516:303:0:o;53534:755::-;47566:9;47579:10;47566:23;47558:66;;;;-1:-1:-1;;;47558:66:0;;;;;;;:::i;:::-;53616:6:::1;::::0;::::1;;53615:7;53607:42;;;;-1:-1:-1::0;;;53607:42:0::1;;;;;;;:::i;:::-;44560:7:::0;44587:6;-1:-1:-1;;;;;44587:6:0;53664:10:::1;:21;53660:92;;;53702:17;53710:8;53702:7;:17::i;:::-;53534:755:::0;:::o;53660:92::-:1;53780:20;::::0;:25;;::::1;::::0;:68:::1;;;53828:20;;53809:15;:39;;53780:68;53762:520;;;53875:23;53889:8;53875:13;:23::i;53762:520::-;53952:37;::::0;;;;::::1;::::0;;;53979:10:::1;53952:37:::0;;;;;::::1;::::0;::::1;::::0;;;54100:20:::1;::::0;54139:50:::1;53952:37:::0;54100:20;54139:14:::1;:50::i;:::-;54135:136;;;54210:20;54221:8;54210:10;:20::i;:::-;54249:7;;;53534:755:::0;:::o;56529:191::-;44560:7;44587:6;-1:-1:-1;;;;;44587:6:0;25016:10;44734:23;44726:68;;;;-1:-1:-1;;;44726:68:0;;;;;;;:::i;:::-;23310:1:::1;23908:7;;:19;;23900:63;;;::::0;-1:-1:-1;;;23900:63:0;;23009:2:1;23900:63:0::1;::::0;::::1;22991:21:1::0;23048:2;23028:18;;;23021:30;23087:33;23067:18;;;23060:61;23138:18;;23900:63:0::1;22807:355:1::0;23900:63:0::1;23310:1;24041:7;:18:::0;56616:49:::2;::::0;56598:12:::2;::::0;56616:10:::2;::::0;56639:21:::2;::::0;56598:12;56616:49;56598:12;56616:49;56639:21;56616:10;:49:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56597:68;;;56684:7;56676:36;;;::::0;-1:-1:-1;;;56676:36:0;;19553:2:1;56676:36:0::2;::::0;::::2;19535:21:1::0;19592:2;19572:18;;;19565:30;-1:-1:-1;;;19611:18:1;;;19604:46;19667:18;;56676:36:0::2;19351:340:1::0;34688:355:0;34847:28;34857:4;34863:2;34867:7;34847:9;:28::i;:::-;34908:48;34931:4;34937:2;34941:7;34950:5;34908:22;:48::i;:::-;34886:149;;;;-1:-1:-1;;;34886:149:0;;;;;;;:::i;48093:363::-;44560:7;44587:6;-1:-1:-1;;;;;44587:6:0;25016:10;44734:23;44726:68;;;;-1:-1:-1;;;44726:68:0;;;;;;;:::i;:::-;48251:15:::1;48227:21;:39;48205:152;;;::::0;-1:-1:-1;;;48205:152:0;;15694:2:1;48205:152:0::1;::::0;::::1;15676:21:1::0;15733:2;15713:18;;;15706:30;15772:34;15752:18;;;15745:62;15843:33;15823:18;;;15816:61;15894:19;;48205:152:0::1;15492:427:1::0;48205:152:0::1;48368:20;:44:::0;48423:17:::1;:25:::0;;-1:-1:-1;;48423:25:0::1;::::0;;48093:363::o;55944:577::-;56062:13;56115:16;56123:7;56115;:16::i;:::-;56093:113;;;;-1:-1:-1;;;56093:113:0;;16894:2:1;56093:113:0;;;16876:21:1;16933:2;16913:18;;;16906:30;16972:34;16952:18;;;16945:62;-1:-1:-1;;;17023:18:1;;;17016:45;17078:19;;56093:113:0;16692:411:1;56093:113:0;56223:9;;;;56219:76;;56265:18;56258:25;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55944:577;;;:::o;56219:76::-;56307:28;56338:10;:8;:10::i;:::-;56307:41;;56410:1;56385:14;56379:28;:32;:134;;;;;;;;;;;;;;;;;56455:14;56471:18;:7;:16;:18::i;:::-;56438:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56359:154;55944:577;-1:-1:-1;;;55944:577:0:o;47652:108::-;44560:7;44587:6;-1:-1:-1;;;;;44587:6:0;25016:10;44734:23;44726:68;;;;-1:-1:-1;;;44726:68:0;;;;;;;:::i;:::-;47727:13:::1;:25:::0;47652:108::o;47904:181::-;44560:7;44587:6;-1:-1:-1;;;;;44587:6:0;25016:10;44734:23;44726:68;;;;-1:-1:-1;;;44726:68:0;;;;;;;:::i;:::-;48038:39:::1;::::0;;;;::::1;::::0;;;;;;::::1;;::::0;;;48025:10:::1;:52:::0;;;;;;47904:181::o;56892:113::-;56950:7;56977:20;56991:5;56977:13;:20::i;55848:88::-;44560:7;44587:6;-1:-1:-1;;;;;44587:6:0;25016:10;44734:23;44726:68;;;;-1:-1:-1;;;44726:68:0;;;;;;;:::i;:::-;55910:9:::1;:18:::0;;-1:-1:-1;;55910:18:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55848:88::o;51827:384::-;44560:7;44587:6;-1:-1:-1;;;;;44587:6:0;25016:10;44734:23;44726:68;;;;-1:-1:-1;;;44726:68:0;;;;;;;:::i;:::-;51999:8:::1;:15;51979:9;:16;:35;51957:125;;;::::0;-1:-1:-1;;;51957:125:0;;24602:2:1;51957:125:0::1;::::0;::::1;24584:21:1::0;24641:2;24621:18;;;24614:30;24680:34;24660:18;;;24653:62;-1:-1:-1;;;24731:18:1;;;24724:38;24779:19;;51957:125:0::1;24400:404:1::0;51957:125:0::1;52098:9;52093:111;52117:9;:16;52113:1;:20;52093:111;;;52181:8;52190:1;52181:11;;;;;;;;:::i;:::-;;;;;;;52155:9;:23;52165:9;52175:1;52165:12;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;52155:23:0::1;-1:-1:-1::0;;;;;52155:23:0::1;;;;;;;;;;;;:37;;;;52135:3;;;;;:::i;:::-;;;;52093:111;;47768:128:::0;44560:7;44587:6;-1:-1:-1;;;;;44587:6:0;25016:10;44734:23;44726:68;;;;-1:-1:-1;;;44726:68:0;;;;;;;:::i;:::-;47853:23:::1;:35:::0;47768:128::o;45423:201::-;44560:7;44587:6;-1:-1:-1;;;;;44587:6:0;25016:10;44734:23;44726:68;;;;-1:-1:-1;;;44726:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45512:22:0;::::1;45504:73;;;::::0;-1:-1:-1;;;45504:73:0;;11032:2:1;45504:73:0::1;::::0;::::1;11014:21:1::0;11071:2;11051:18;;;11044:30;11110:34;11090:18;;;11083:62;-1:-1:-1;;;11161:18:1;;;11154:36;11207:19;;45504:73:0::1;10830:402:1::0;45504:73:0::1;45588:28;45607:8;45588:18;:28::i;1027:127::-:0;1116:19;;1134:1;1116:19;;;1027:127::o;35298:115::-;35355:4;35389:16;:6;997:14;;905:114;35389:16;35379:26;;;;35298:115;-1:-1:-1;35298:115:0:o;39368:196::-;39483:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;39483:29:0;-1:-1:-1;;;;;39483:29:0;;;;;;;;;39528:28;;39483:24;;39528:28;;;;;;;39368:196;;;:::o;37541:1709::-;37656:35;37694:20;37706:7;37694:11;:20::i;:::-;37769:18;;37656:58;;-1:-1:-1;37727:22:0;;-1:-1:-1;;;;;37753:34:0;25016:10;-1:-1:-1;;;;;37753:34:0;;:87;;;-1:-1:-1;25016:10:0;37804:20;37816:7;37804:11;:20::i;:::-;-1:-1:-1;;;;;37804:36:0;;37753:87;:154;;;-1:-1:-1;37874:18:0;;37857:50;;25016:10;33926:214;:::i;37857:50::-;37727:181;;37943:17;37921:117;;;;-1:-1:-1;;;37921:117:0;;18025:2:1;37921:117:0;;;18007:21:1;18064:2;18044:18;;;18037:30;18103:34;18083:18;;;18076:62;-1:-1:-1;;;18154:18:1;;;18147:48;18212:19;;37921:117:0;17823:414:1;37921:117:0;38095:4;-1:-1:-1;;;;;38073:26:0;:13;:18;;;-1:-1:-1;;;;;38073:26:0;;38051:114;;;;-1:-1:-1;;;38051:114:0;;16126:2:1;38051:114:0;;;16108:21:1;16165:2;16145:18;;;16138:30;16204:34;16184:18;;;16177:62;-1:-1:-1;;;16255:18:1;;;16248:36;16301:19;;38051:114:0;15924:402:1;38051:114:0;-1:-1:-1;;;;;38184:16:0;;38176:66;;;;-1:-1:-1;;;38176:66:0;;12254:2:1;38176:66:0;;;12236:21:1;12293:2;12273:18;;;12266:30;12332:34;12312:18;;;12305:62;-1:-1:-1;;;12383:18:1;;;12376:35;12428:19;;38176:66:0;12052:401:1;38176:66:0;38363:49;38380:1;38384:7;38393:13;:18;;;38363:8;:49::i;:::-;-1:-1:-1;;;;;38425:18:0;;;;;;:12;:18;;;;;:31;;38455:1;;38425:18;:31;;38455:1;;-1:-1:-1;;;;;38425:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;38425:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;38467:16:0;;-1:-1:-1;38467:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;38467:16:0;;:29;;-1:-1:-1;;38467:29:0;;:::i;:::-;;;-1:-1:-1;;;;;38467:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38530:43:0;;;;;;;;-1:-1:-1;;;;;38530:43:0;;;;;-1:-1:-1;;;;;38556:15:0;38530:43;;;;;;;;;-1:-1:-1;38507:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;38507:66:0;-1:-1:-1;;;;;;38507:66:0;;;;;;;;;;;38835:11;38519:7;-1:-1:-1;38835:11:0;:::i;:::-;38902:1;38861:24;;;:11;:24;;;;;:29;38813:33;;-1:-1:-1;;;;;;38861:29:0;38857:288;;38925:20;38933:11;38925:7;:20::i;:::-;38921:213;;;38993:125;;;;;;;;39030:18;;-1:-1:-1;;;;;38993:125:0;;;;;;39071:28;;;;-1:-1:-1;;;;;38993:125:0;;;;;;;;;-1:-1:-1;38966:24:0;;;:11;:24;;;;;;;:152;;;;;;;;;-1:-1:-1;;;38966:152:0;-1:-1:-1;;;;;;38966:152:0;;;;;;;;;;;;38921:213;39181:7;39177:2;-1:-1:-1;;;;;39162:27:0;39171:4;-1:-1:-1;;;;;39162:27:0;;;;;;;;;;;39200:42;37645:1605;;;37541:1709;;;:::o;39728:950::-;39822:24;;39865:12;39857:49;;;;-1:-1:-1;;;39857:49:0;;14224:2:1;39857:49:0;;;14206:21:1;14263:2;14243:18;;;14236:30;14302:26;14282:18;;;14275:54;14346:18;;39857:49:0;14022:348:1;39857:49:0;39917:16;39967:1;39936:28;39956:8;39936:17;:28;:::i;:::-;:32;;;;:::i;:::-;39917:51;-1:-1:-1;39994:18:0;40011:1;39994:14;:18;:::i;:::-;39983:8;:29;39979:91;;;40040:18;40057:1;40040:14;:18;:::i;:::-;40029:29;;39979:91;40193:17;40201:8;40193:7;:17::i;:::-;40185:68;;;;-1:-1:-1;;;40185:68:0;;22602:2:1;40185:68:0;;;22584:21:1;22641:2;22621:18;;;22614:30;22680:34;22660:18;;;22653:62;-1:-1:-1;;;22731:18:1;;;22724:36;22777:19;;40185:68:0;22400:402:1;40185:68:0;40281:17;40264:357;40305:8;40300:1;:13;40264:357;;40370:1;40339:14;;;:11;:14;;;;;:19;-1:-1:-1;;;;;40339:19:0;40335:275;;40393:31;40427:14;40439:1;40427:11;:14::i;:::-;40477:117;;;;;;;;40514:14;;-1:-1:-1;;;;;40477:117:0;;;;;;40551:24;;;;-1:-1:-1;;;;;40477:117:0;;;;;;;;;-1:-1:-1;40460:14:0;;;:11;:14;;;;;;;:134;;;;;;;;;-1:-1:-1;;;40460:134:0;-1:-1:-1;;;;;;40460:134:0;;;;;;;;;;;;-1:-1:-1;40335:275:0;40315:3;;;;:::i;:::-;;;;40264:357;;;-1:-1:-1;40658:12:0;:8;40669:1;40658:12;:::i;:::-;40631:24;:39;-1:-1:-1;;;39728:950:0:o;35421:104::-;35490:27;35500:2;35504:8;35490:27;;;;;;;;;;;;:9;:27::i;51284:224::-;51361:5;51348:9;:18;;51340:53;;;;-1:-1:-1;;;51340:53:0;;20318:2:1;51340:53:0;;;20300:21:1;20357:2;20337:18;;;20330:30;-1:-1:-1;;;20376:18:1;;;20369:52;20438:18;;51340:53:0;20116:346:1;51340:53:0;51420:5;51408:9;:17;51404:97;;;51450:10;51442:47;51471:17;51483:5;51471:9;:17;:::i;:::-;51442:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30550:682;-1:-1:-1;;;;;;;;;;;;;;;;;30685:16:0;30693:7;30685;:16::i;:::-;30677:71;;;;-1:-1:-1;;;30677:71:0;;11439:2:1;30677:71:0;;;11421:21:1;11478:2;11458:18;;;11451:30;11517:34;11497:18;;;11490:62;-1:-1:-1;;;11568:18:1;;;11561:40;11618:19;;30677:71:0;11237:406:1;30677:71:0;30761:26;30813:12;30802:7;:23;30798:103;;30863:22;30873:12;30863:7;:22;:::i;:::-;:26;;30888:1;30863:26;:::i;:::-;30842:47;;30798:103;30933:7;30913:242;30950:18;30942:4;:26;30913:242;;30993:31;31027:17;;;:11;:17;;;;;;;;;30993:51;;;;;;;;;-1:-1:-1;;;;;30993:51:0;;;;;-1:-1:-1;;;30993:51:0;;;-1:-1:-1;;;;;30993:51:0;;;;;;;;31063:28;31059:85;;31119:9;30550:682;-1:-1:-1;;;;30550:682:0:o;31059:85::-;-1:-1:-1;30970:6:0;;;;:::i;:::-;;;;30913:242;;;-1:-1:-1;31167:57:0;;-1:-1:-1;;;31167:57:0;;23369:2:1;31167:57:0;;;23351:21:1;23408:2;23388:18;;;23381:30;23447:34;23427:18;;;23420:62;-1:-1:-1;;;23498:18:1;;;23491:45;23553:19;;31167:57:0;23167:411:1;45784:191:0;45858:16;45877:6;;-1:-1:-1;;;;;45894:17:0;;;-1:-1:-1;;;;;;45894:17:0;;;;;;45927:40;;45877:6;;;;;;;45927:40;;45858:16;45927:40;45847:128;45784:191;:::o;41243:985::-;41398:4;-1:-1:-1;;;;;41419:13:0;;4765:20;4813:8;41415:806;;41472:175;;-1:-1:-1;;;41472:175:0;;-1:-1:-1;;;;;41472:36:0;;;;;:175;;25016:10;;41566:4;;41593:7;;41623:5;;41472:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41472:175:0;;;;;;;;-1:-1:-1;;41472:175:0;;;;;;;;;;;;:::i;:::-;;;41451:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41834:13:0;;41830:321;;41877:109;;-1:-1:-1;;;41877:109:0;;;;;;;:::i;41830:321::-;42101:6;42095:13;42086:6;42082:2;42078:15;42071:38;41451:715;-1:-1:-1;;;;;;41711:55:0;-1:-1:-1;;;41711:55:0;;-1:-1:-1;41704:62:0;;41415:806;-1:-1:-1;42205:4:0;41415:806;41243:985;;;;;;:::o;55440:114::-;55500:13;55533;55526:20;;;;;:::i;1863:723::-;1919:13;2140:10;2136:53;;-1:-1:-1;;2167:10:0;;;;;;;;;;;;-1:-1:-1;;;2167:10:0;;;;;1863:723::o;2136:53::-;2214:5;2199:12;2255:78;2262:9;;2255:78;;2288:8;;;;:::i;:::-;;-1:-1:-1;2311:10:0;;-1:-1:-1;2319:2:0;2311:10;;:::i;:::-;;;2255:78;;;2343:19;2375:6;-1:-1:-1;;;;;2365:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2365:17:0;;2343:39;;2393:154;2400:10;;2393:154;;2427:11;2437:1;2427:11;;:::i;:::-;;-1:-1:-1;2496:10:0;2504:2;2496:5;:10;:::i;:::-;2483:24;;:2;:24;:::i;:::-;2470:39;;2453:6;2460;2453:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;2453:56:0;;;;;;;;-1:-1:-1;2524:11:0;2533:2;2524:11;;:::i;:::-;;;2393:154;;30276:266;30337:7;-1:-1:-1;;;;;30379:19:0;;30357:118;;;;-1:-1:-1;;;30357:118:0;;12660:2:1;30357:118:0;;;12642:21:1;12699:2;12679:18;;;12672:30;12738:34;12718:18;;;12711:62;-1:-1:-1;;;12789:18:1;;;12782:47;12846:19;;30357:118:0;12458:413:1;30357:118:0;-1:-1:-1;;;;;;30501:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;30501:32:0;;-1:-1:-1;;;;;30501:32:0;;30276:266::o;35888:1399::-;36011:20;36034:16;:6;997:14;;905:114;36034:16;36011:39;-1:-1:-1;;;;;;36069:16:0;;36061:62;;;;-1:-1:-1;;;36061:62:0;;21434:2:1;36061:62:0;;;21416:21:1;21473:2;21453:18;;;21446:30;21512:34;21492:18;;;21485:62;-1:-1:-1;;;21563:18:1;;;21556:31;21604:19;;36061:62:0;21232:397:1;36061:62:0;36268:21;36276:12;36268:7;:21::i;:::-;36267:22;36259:64;;;;-1:-1:-1;;;36259:64:0;;21076:2:1;36259:64:0;;;21058:21:1;21115:2;21095:18;;;21088:30;21154:31;21134:18;;;21127:59;21203:18;;36259:64:0;20874:353:1;36259:64:0;36354:12;36342:8;:24;;36334:71;;;;-1:-1:-1;;;36334:71:0;;24199:2:1;36334:71:0;;;24181:21:1;24238:2;24218:18;;;24211:30;24277:34;24257:18;;;24250:62;-1:-1:-1;;;24328:18:1;;;24321:32;24370:19;;36334:71:0;23997:398:1;36334:71:0;-1:-1:-1;;;;;36525:16:0;;36492:30;36525:16;;;:12;:16;;;;;;;;;36492:49;;;;;;;;;-1:-1:-1;;;;;36492:49:0;;;;;-1:-1:-1;;;36492:49:0;;;;;;;;;;;36571:135;;;;;;;;36597:19;;36492:49;;36571:135;;;36597:39;;36627:8;;36597:39;:::i;:::-;-1:-1:-1;;;;;36571:135:0;;;;;36686:8;36651:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;36571:135:0;;;;;;-1:-1:-1;;;;;36552:16:0;;;;;;;:12;:16;;;;;;;;:154;;;;;;;;-1:-1:-1;;;36552:154:0;;;;;;;;;;;;36745:43;;;;;;;;;;-1:-1:-1;;;;;36771:15:0;36745:43;;;;;;;;36717:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;36717:71:0;-1:-1:-1;;;;;;36717:71:0;;;;;;;;;;;;;;;;;;36729:12;;36849:358;36873:8;36869:1;:12;36849:358;;;36908:38;;36933:12;;-1:-1:-1;;;;;36908:38:0;;;36925:1;;36908:38;;36925:1;;36908:38;36987:59;37018:1;37022:2;37026:12;37040:5;36987:22;:59::i;:::-;36961:172;;;;-1:-1:-1;;;36961:172:0;;;;;;;:::i;:::-;37148:14;;;;:::i;:::-;;;;37177:18;:6;1116:19;;1134:1;1116:19;;;1027:127;37177:18;36883:3;;;;:::i;:::-;;;;36849:358;;;;37219:60;53534:755;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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:679::-;246:5;299:3;292:4;284:6;280:17;276:27;266:55;;317:1;314;307:12;266:55;353:6;340:20;379:4;403:60;419:43;459:2;419:43;:::i;:::-;403:60;:::i;:::-;485:3;509:2;504:3;497:15;537:2;532:3;528:12;521:19;;572:2;564:6;560:15;624:3;619:2;613;610:1;606:10;598:6;594:23;590:32;587:41;584:61;;;641:1;638;631:12;584:61;663:1;673:169;687:2;684:1;681:9;673:169;;;744:23;763:3;744:23;:::i;:::-;732:36;;788:12;;;;820;;;;705:1;698:9;673:169;;;-1:-1:-1;860:5:1;;192:679;-1:-1:-1;;;;;;;192:679:1:o;876:160::-;941:20;;997:13;;990:21;980:32;;970:60;;1026:1;1023;1016:12;1041:186;1100:6;1153:2;1141:9;1132:7;1128:23;1124:32;1121:52;;;1169:1;1166;1159:12;1121:52;1192:29;1211:9;1192:29;:::i;1232:260::-;1300:6;1308;1361:2;1349:9;1340:7;1336:23;1332:32;1329:52;;;1377:1;1374;1367:12;1329:52;1400:29;1419:9;1400:29;:::i;:::-;1390:39;;1448:38;1482:2;1471:9;1467:18;1448:38;:::i;:::-;1438:48;;1232:260;;;;;:::o;1497:328::-;1574:6;1582;1590;1643:2;1631:9;1622:7;1618:23;1614:32;1611:52;;;1659:1;1656;1649:12;1611:52;1682:29;1701:9;1682:29;:::i;:::-;1672:39;;1730:38;1764:2;1753:9;1749:18;1730:38;:::i;:::-;1720:48;;1815:2;1804:9;1800:18;1787:32;1777:42;;1497:328;;;;;:::o;1830:980::-;1925:6;1933;1941;1949;2002:3;1990:9;1981:7;1977:23;1973:33;1970:53;;;2019:1;2016;2009:12;1970:53;2042:29;2061:9;2042:29;:::i;:::-;2032:39;;2090:2;2111:38;2145:2;2134:9;2130:18;2111:38;:::i;:::-;2101:48;;2196:2;2185:9;2181:18;2168:32;2158:42;;2251:2;2240:9;2236:18;2223:32;-1:-1:-1;;;;;2315:2:1;2307:6;2304:14;2301:34;;;2331:1;2328;2321:12;2301:34;2369:6;2358:9;2354:22;2344:32;;2414:7;2407:4;2403:2;2399:13;2395:27;2385:55;;2436:1;2433;2426:12;2385:55;2472:2;2459:16;2494:2;2490;2487:10;2484:36;;;2500:18;;:::i;:::-;2542:53;2585:2;2566:13;;-1:-1:-1;;2562:27:1;2558:36;;2542:53;:::i;:::-;2529:66;;2618:2;2611:5;2604:17;2658:7;2653:2;2648;2644;2640:11;2636:20;2633:33;2630:53;;;2679:1;2676;2669:12;2630:53;2734:2;2729;2725;2721:11;2716:2;2709:5;2705:14;2692:45;2778:1;2773:2;2768;2761:5;2757:14;2753:23;2746:34;;2799:5;2789:15;;;;;1830:980;;;;;;;:::o;2815:254::-;2880:6;2888;2941:2;2929:9;2920:7;2916:23;2912:32;2909:52;;;2957:1;2954;2947:12;2909:52;2980:29;2999:9;2980:29;:::i;:::-;2970:39;;3028:35;3059:2;3048:9;3044:18;3028:35;:::i;3074:254::-;3142:6;3150;3203:2;3191:9;3182:7;3178:23;3174:32;3171:52;;;3219:1;3216;3209:12;3171:52;3242:29;3261:9;3242:29;:::i;:::-;3232:39;3318:2;3303:18;;;;3290:32;;-1:-1:-1;;;3074:254:1:o;3333:1149::-;3448:6;3456;3509:2;3497:9;3488:7;3484:23;3480:32;3477:52;;;3525:1;3522;3515:12;3477:52;3565:9;3552:23;-1:-1:-1;;;;;3635:2:1;3627:6;3624:14;3621:34;;;3651:1;3648;3641:12;3621:34;3674:61;3727:7;3718:6;3707:9;3703:22;3674:61;:::i;:::-;3664:71;;3754:2;3744:12;;3809:2;3798:9;3794:18;3781:32;3838:2;3828:8;3825:16;3822:36;;;3854:1;3851;3844:12;3822:36;3877:24;;;-1:-1:-1;3932:4:1;3924:13;;3920:27;-1:-1:-1;3910:55:1;;3961:1;3958;3951:12;3910:55;3997:2;3984:16;4020:60;4036:43;4076:2;4036:43;:::i;4020:60::-;4102:3;4126:2;4121:3;4114:15;4154:2;4149:3;4145:12;4138:19;;4185:2;4181;4177:11;4233:7;4228:2;4222;4219:1;4215:10;4211:2;4207:19;4203:28;4200:41;4197:61;;;4254:1;4251;4244:12;4197:61;4276:1;4267:10;;4286:166;4300:2;4297:1;4294:9;4286:166;;;4357:20;4373:3;4357:20;:::i;:::-;4345:33;;4318:1;4311:9;;;;;4398:12;;;;4430;;4286:166;;;4290:3;4471:5;4461:15;;;;;;;3333:1149;;;;;:::o;4487:::-;4605:6;4613;4666:2;4654:9;4645:7;4641:23;4637:32;4634:52;;;4682:1;4679;4672:12;4634:52;4722:9;4709:23;-1:-1:-1;;;;;4792:2:1;4784:6;4781:14;4778:34;;;4808:1;4805;4798:12;4778:34;4831:61;4884:7;4875:6;4864:9;4860:22;4831:61;:::i;:::-;4821:71;;4911:2;4901:12;;4966:2;4955:9;4951:18;4938:32;4995:2;4985:8;4982:16;4979:36;;;5011:1;5008;5001:12;4979:36;5034:24;;;-1:-1:-1;5089:4:1;5081:13;;5077:27;-1:-1:-1;5067:55:1;;5118:1;5115;5108:12;5067:55;5154:2;5141:16;5177:60;5193:43;5233:2;5193:43;:::i;5177:60::-;5259:3;5283:2;5278:3;5271:15;5311:2;5306:3;5302:12;5295:19;;5342:2;5338;5334:11;5390:7;5385:2;5379;5376:1;5372:10;5368:2;5364:19;5360:28;5357:41;5354:61;;;5411:1;5408;5401:12;5354:61;5433:1;5424:10;;5443:163;5457:2;5454:1;5451:9;5443:163;;;5514:17;;5502:30;;5475:1;5468:9;;;;;5552:12;;;;5584;;5443:163;;5641:180;5697:6;5750:2;5738:9;5729:7;5725:23;5721:32;5718:52;;;5766:1;5763;5756:12;5718:52;5789:26;5805:9;5789:26;:::i;5826:245::-;5884:6;5937:2;5925:9;5916:7;5912:23;5908:32;5905:52;;;5953:1;5950;5943:12;5905:52;5992:9;5979:23;6011:30;6035:5;6011:30;:::i;6076:249::-;6145:6;6198:2;6186:9;6177:7;6173:23;6169:32;6166:52;;;6214:1;6211;6204:12;6166:52;6246:9;6240:16;6265:30;6289:5;6265:30;:::i;6330:592::-;6401:6;6409;6462:2;6450:9;6441:7;6437:23;6433:32;6430:52;;;6478:1;6475;6468:12;6430:52;6518:9;6505:23;-1:-1:-1;;;;;6588:2:1;6580:6;6577:14;6574:34;;;6604:1;6601;6594:12;6574:34;6642:6;6631:9;6627:22;6617:32;;6687:7;6680:4;6676:2;6672:13;6668:27;6658:55;;6709:1;6706;6699:12;6658:55;6749:2;6736:16;6775:2;6767:6;6764:14;6761:34;;;6791:1;6788;6781:12;6761:34;6836:7;6831:2;6822:6;6818:2;6814:15;6810:24;6807:37;6804:57;;;6857:1;6854;6847:12;6804:57;6888:2;6880:11;;;;;6910:6;;-1:-1:-1;6330:592:1;;-1:-1:-1;;;;6330:592:1:o;6927:180::-;6986:6;7039:2;7027:9;7018:7;7014:23;7010:32;7007:52;;;7055:1;7052;7045:12;7007:52;-1:-1:-1;7078:23:1;;6927:180;-1:-1:-1;6927:180:1:o;7112:248::-;7180:6;7188;7241:2;7229:9;7220:7;7216:23;7212:32;7209:52;;;7257:1;7254;7247:12;7209:52;-1:-1:-1;;7280:23:1;;;7350:2;7335:18;;;7322:32;;-1:-1:-1;7112:248:1:o;7365:257::-;7406:3;7444:5;7438:12;7471:6;7466:3;7459:19;7487:63;7543:6;7536:4;7531:3;7527:14;7520:4;7513:5;7509:16;7487:63;:::i;:::-;7604:2;7583:15;-1:-1:-1;;7579:29:1;7570:39;;;;7611:4;7566:50;;7365:257;-1:-1:-1;;7365:257:1:o;7627:470::-;7806:3;7844:6;7838:13;7860:53;7906:6;7901:3;7894:4;7886:6;7882:17;7860:53;:::i;:::-;7976:13;;7935:16;;;;7998:57;7976:13;7935:16;8032:4;8020:17;;7998:57;:::i;:::-;8071:20;;7627:470;-1:-1:-1;;;;7627:470:1:o;8520:488::-;-1:-1:-1;;;;;8789:15:1;;;8771:34;;8841:15;;8836:2;8821:18;;8814:43;8888:2;8873:18;;8866:34;;;8936:3;8931:2;8916:18;;8909:31;;;8714:4;;8957:45;;8982:19;;8974:6;8957:45;:::i;:::-;8949:53;8520:488;-1:-1:-1;;;;;;8520:488:1:o;9013:632::-;9184:2;9236:21;;;9306:13;;9209:18;;;9328:22;;;9155:4;;9184:2;9407:15;;;;9381:2;9366:18;;;9155:4;9450:169;9464:6;9461:1;9458:13;9450:169;;;9525:13;;9513:26;;9594:15;;;;9559:12;;;;9486:1;9479:9;9450:169;;;-1:-1:-1;9636:3:1;;9013:632;-1:-1:-1;;;;;;9013:632:1:o;9842:219::-;9991:2;9980:9;9973:21;9954:4;10011:44;10051:2;10040:9;10036:18;10028:6;10011:44;:::i;12876:354::-;13078:2;13060:21;;;13117:2;13097:18;;;13090:30;13156:32;13151:2;13136:18;;13129:60;13221:2;13206:18;;12876:354::o;15145:342::-;15347:2;15329:21;;;15386:2;15366:18;;;15359:30;-1:-1:-1;;;15420:2:1;15405:18;;15398:48;15478:2;15463:18;;15145:342::o;16331:356::-;16533:2;16515:21;;;16552:18;;;16545:30;16611:34;16606:2;16591:18;;16584:62;16678:2;16663:18;;16331:356::o;18597:346::-;18799:2;18781:21;;;18838:2;18818:18;;;18811:30;-1:-1:-1;;;18872:2:1;18857:18;;18850:52;18934:2;18919:18;;18597:346::o;19696:415::-;19898:2;19880:21;;;19937:2;19917:18;;;19910:30;19976:34;19971:2;19956:18;;19949:62;-1:-1:-1;;;20042:2:1;20027:18;;20020:49;20101:3;20086:19;;19696:415::o;21634:346::-;21836:2;21818:21;;;21875:2;21855:18;;;21848:30;-1:-1:-1;;;21909:2:1;21894:18;;21887:52;21971:2;21956:18;;21634:346::o;25609:275::-;25680:2;25674:9;25745:2;25726:13;;-1:-1:-1;;25722:27:1;25710:40;;-1:-1:-1;;;;;25765:34:1;;25801:22;;;25762:62;25759:88;;;25827:18;;:::i;:::-;25863:2;25856:22;25609:275;;-1:-1:-1;25609:275:1:o;25889:183::-;25949:4;-1:-1:-1;;;;;25974:6:1;25971:30;25968:56;;;26004:18;;:::i;:::-;-1:-1:-1;26049:1:1;26045:14;26061:4;26041:25;;25889:183::o;26077:253::-;26117:3;-1:-1:-1;;;;;26206:2:1;26203:1;26199:10;26236:2;26233:1;26229:10;26267:3;26263:2;26259:12;26254:3;26251:21;26248:47;;;26275:18;;:::i;26335:128::-;26375:3;26406:1;26402:6;26399:1;26396:13;26393:39;;;26412:18;;:::i;:::-;-1:-1:-1;26448:9:1;;26335:128::o;26468:120::-;26508:1;26534;26524:35;;26539:18;;:::i;:::-;-1:-1:-1;26573:9:1;;26468:120::o;26593:168::-;26633:7;26699:1;26695;26691:6;26687:14;26684:1;26681:21;26676:1;26669:9;26662:17;26658:45;26655:71;;;26706:18;;:::i;:::-;-1:-1:-1;26746:9:1;;26593:168::o;26766:246::-;26806:4;-1:-1:-1;;;;;26919:10:1;;;;26889;;26941:12;;;26938:38;;;26956:18;;:::i;:::-;26993:13;;26766:246;-1:-1:-1;;;26766:246:1:o;27017:125::-;27057:4;27085:1;27082;27079:8;27076:34;;;27090:18;;:::i;:::-;-1:-1:-1;27127:9:1;;27017:125::o;27147:258::-;27219:1;27229:113;27243:6;27240:1;27237:13;27229:113;;;27319:11;;;27313:18;27300:11;;;27293:39;27265:2;27258:10;27229:113;;;27360:6;27357:1;27354:13;27351:48;;;-1:-1:-1;;27395:1:1;27377:16;;27370:27;27147:258::o;27410:136::-;27449:3;27477:5;27467:39;;27486:18;;:::i;:::-;-1:-1:-1;;;27522:18:1;;27410:136::o;27551:380::-;27630:1;27626:12;;;;27673;;;27694:61;;27748:4;27740:6;27736:17;27726:27;;27694:61;27801:2;27793:6;27790:14;27770:18;27767:38;27764:161;;;27847:10;27842:3;27838:20;27835:1;27828:31;27882:4;27879:1;27872:15;27910:4;27907:1;27900:15;27764:161;;27551:380;;;:::o;27936:135::-;27975:3;-1:-1:-1;;27996:17:1;;27993:43;;;28016:18;;:::i;:::-;-1:-1:-1;28063:1:1;28052:13;;27936:135::o;28076:112::-;28108:1;28134;28124:35;;28139:18;;:::i;:::-;-1:-1:-1;28173:9:1;;28076:112::o;28193:127::-;28254:10;28249:3;28245:20;28242:1;28235:31;28285:4;28282:1;28275:15;28309:4;28306:1;28299:15;28325:127;28386:10;28381:3;28377:20;28374:1;28367:31;28417:4;28414:1;28407:15;28441:4;28438:1;28431:15;28457:127;28518:10;28513:3;28509:20;28506:1;28499:31;28549:4;28546:1;28539:15;28573:4;28570:1;28563:15;28589:127;28650:10;28645:3;28641:20;28638:1;28631:31;28681:4;28678:1;28671:15;28705:4;28702:1;28695:15;28721:131;-1:-1:-1;;;;;;28795:32:1;;28785:43;;28775:71;;28842:1;28839;28832:12

Swarm Source

ipfs://029e058d284a2014d0935bf0b9bb214049b228e29f40594bd9fcc9b2c129c9e1
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.