ETH Price: $3,664.13 (+1.76%)

Token

ERC-20: DODOTopia (TOPIA)
 

Overview

Max Total Supply

161 TOPIA

Holders

160

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 TOPIA
0xe20e74f5af8042e1531662b455f1ef49b78edb6a
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:
DODOTopia

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Apache-2.0 license

Contract Source Code (Solidity)

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

/*

    Copyright 2020 DODO ZOO.
    SPDX-License-Identifier: Apache-2.0

*/


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

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

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

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

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

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

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

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


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


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

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

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


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



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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)


/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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


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



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




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

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


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




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

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

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

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

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

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

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

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

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

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

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

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

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


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



/**
 * @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: contracts/ERC721R.sol











/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension. This does random batch minting.
 */
contract ERC721r is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;
    
    mapping(uint => uint) private _availableTokens;
    uint256 private _numAvailableTokens;
    uint256 immutable _maxSupply;
    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

    event Mint(address indexed to, uint256 indexed tokenId);

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_, uint maxSupply_) {
        _name = name_;
        _symbol = symbol_;
        _maxSupply = maxSupply_;
        _numAvailableTokens = maxSupply_;
    }
    
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }
    
    function totalSupply() public view virtual returns (uint256) {
        return _maxSupply - _numAvailableTokens;
    }
    
    function maxSupply() public view virtual returns (uint256) {
        return _maxSupply;
    }

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @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 overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721r.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: 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`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721r.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    function _mintIdWithoutBalanceUpdate(address to, uint256 tokenId) private {
        _beforeTokenTransfer(address(0), to, tokenId);
        
        _owners[tokenId] = to;
        
        emit Transfer(address(0), to, tokenId);
        emit Mint(to, tokenId);
        _afterTokenTransfer(address(0), to, tokenId);
    }

    function _mintRandom(address to, uint _numToMint) internal virtual {
        require(_msgSender() == tx.origin, "Contracts cannot mint");
        require(to != address(0), "ERC721: mint to the zero address");
        require(_numToMint > 0, "ERC721r: need to mint at least one token");
        
        // TODO: Probably don't need this as it will underflow and revert automatically in this case
        require(_numAvailableTokens >= _numToMint, "ERC721r: minting more tokens than available");
        
        uint updatedNumAvailableTokens = _numAvailableTokens;
        for (uint256 i; i < _numToMint; ++i) { // Do this ++ unchecked?
            uint256 tokenId = getRandomAvailableTokenId(to, updatedNumAvailableTokens);
            
            _mintIdWithoutBalanceUpdate(to, tokenId);
            
            --updatedNumAvailableTokens;
        }
        
        _numAvailableTokens = updatedNumAvailableTokens;
        _balances[to] += _numToMint;
    }
        
    function getRandomAvailableTokenId(address to, uint updatedNumAvailableTokens)
        internal
        returns (uint256)
    {
        uint256 randomNum = uint256(
            keccak256(
                abi.encode(
                    to,
                    tx.gasprice,
                    block.number,
                    block.timestamp,
                    block.difficulty,
                    blockhash(block.number - 1),
                    address(this),
                    updatedNumAvailableTokens
                )
            )
        );
        uint256 randomIndex = randomNum % updatedNumAvailableTokens;
        return getAvailableTokenAtIndex(randomIndex, updatedNumAvailableTokens);
    }

    // Implements https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle. Code taken from CryptoPhunksV2
    function getAvailableTokenAtIndex(uint256 indexToUse, uint updatedNumAvailableTokens)
        internal
        returns (uint256)
    {
        uint256 valAtIndex = _availableTokens[indexToUse];
        uint256 result;
        if (valAtIndex == 0) {
            // This means the index itself is still an available token
            result = indexToUse;
        } else {
            // This means the index itself is not an available token, but the val at that index is.
            result = valAtIndex;
        }

        uint256 lastIndex = updatedNumAvailableTokens - 1;
        if (indexToUse != lastIndex) {
            // Replace the value at indexToUse, now that it's been used.
            // Replace it with the data from the last index in the array, since we are going to decrease the array size afterwards.
            uint256 lastValInArray = _availableTokens[lastIndex];
            if (lastValInArray == 0) {
                // This means the index itself is still an available token
                _availableTokens[indexToUse] = lastIndex;
            } else {
                // This means the index itself is not an available token, but the val at that index is.
                _availableTokens[indexToUse] = lastValInArray;
                // Gas refund courtsey of @dievardump
                delete _availableTokens[lastIndex];
            }
        }
        
        return result;
    }
    
    // Not as good as minting a specific tokenId, but will behave the same at the start
    // allowing you to explicitly mint some tokens at launch.
    function _mintAtIndex(address to, uint index) internal virtual {
        require(_msgSender() == tx.origin, "Contracts cannot mint");
        require(to != address(0), "ERC721: mint to the zero address");
        require(_numAvailableTokens >= 1, "ERC721r: minting more tokens than available");
        
        uint tokenId = getAvailableTokenAtIndex(index, _numAvailableTokens);
        --_numAvailableTokens;
        
        _mintIdWithoutBalanceUpdate(to, tokenId);
        
        _balances[to] += 1;
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * 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
    ) internal virtual {
        require(ERC721r.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}
// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


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


/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

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

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File: contracts/lib/InitializableOwnable.sol





/**
 * @title Ownable
 * @author DODO Breeder
 *
 * @notice Ownership related functions
 */
contract InitializableOwnable {
    address public _OWNER_;
    address public _NEW_OWNER_;
    bool internal _INITIALIZED_;

    // ============ Events ============

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

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

    // ============ Modifiers ============

    modifier notInitialized() {
        require(!_INITIALIZED_, "DODO_INITIALIZED");
        _;
    }

    modifier onlyOwner() {
        require(msg.sender == _OWNER_, "NOT_OWNER");
        _;
    }

    // ============ Functions ============

    function initOwner(address newOwner) public notInitialized {
        _INITIALIZED_ = true;
        _OWNER_ = newOwner;
    }

    function transferOwnership(address newOwner) public onlyOwner {
        emit OwnershipTransferPrepared(_OWNER_, newOwner);
        _NEW_OWNER_ = newOwner;
    }

    function claimOwnership() public {
        require(msg.sender == _NEW_OWNER_, "INVALID_CLAIM");
        emit OwnershipTransferred(_OWNER_, _NEW_OWNER_);
        _OWNER_ = _NEW_OWNER_;
        _NEW_OWNER_ = address(0);
    }
}







contract DODOTopia is ERC721r, InitializableOwnable {
    string private _baseTokenURI;
    bytes32 public whitelistRoot;
    bytes32 public teamRoot;
    mapping(address => bool) public whitelistMinted;
    mapping(address => bool) public teamMinted;
    mapping(address => bool) public adminList;
    uint256 public constant WHITELIST_AMOUNT = 1900;
    uint256 public constant TEAM_AMOUNT = 100;
    uint256 public teamMintedCount;
    uint256 public whitelistMintedCount;
    uint256 public startTime;
    uint256 public endTime;

    constructor() ERC721r("DODOTopia", "TOPIA", 2000) {
        initOwner(msg.sender);
    }

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

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

    function setWhitelistRoot(bytes32 root) external onlyOwner {
        whitelistRoot = root;
    }

    function setTeamRoot(bytes32 root) external onlyOwner {
        teamRoot = root;
    }

    function addAdmin(address addr) external onlyOwner {
        adminList[addr] = true;
    }

    function removeAdmin(address addr) external onlyOwner {
        adminList[addr] = false;
    }

    function setTime(uint256 start, uint256 end) external onlyOwner {
        require(start < end, "timestamp not valid");
        startTime = start;
        endTime = end;
    }

    function whitelistMint(bytes32[] memory proof) public {
        require(block.timestamp > startTime, "whitelist mint has not begun");
        require(block.timestamp < endTime, "whitelist mint has already ended");
        require(!whitelistMinted[msg.sender], "address has already minted");
        require(checkMerkleProof(proof, whitelistRoot, msg.sender), "address not in whitelist");
        require(whitelistMintedCount < WHITELIST_AMOUNT, "supply not enough");
        whitelistMinted[msg.sender] = true;
        whitelistMintedCount++;
        _mintRandom(msg.sender, 1);
    }

    function teamMint(bytes32[] memory proof) public {
        require(!teamMinted[msg.sender], "address has already minted");
        require(checkMerkleProof(proof, teamRoot, msg.sender), "address not in team");
        require(teamMintedCount < TEAM_AMOUNT, "supply not enough");
        teamMinted[msg.sender] = true;
        teamMintedCount++;
        _mintRandom(msg.sender, 1);
    }

    function adminMint(address to, uint256 numberToMint) public {
        require(msg.sender == _OWNER_ || adminList[msg.sender] == true, "not allowed");
        _mintRandom(to, numberToMint);
    }

    function checkMerkleProof(bytes32[] memory proof, bytes32 root, address addr) public pure returns (bool) {
        bytes32 leaf = keccak256(abi.encodePacked(addr));
        return MerkleProof.verify(proof, root, leaf);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferPrepared","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":"TEAM_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_NEW_OWNER_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_OWNER_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"adminList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"numberToMint","type":"uint256"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","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":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"root","type":"bytes32"},{"internalType":"address","name":"addr","type":"address"}],"name":"checkMerkleProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"initOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setTeamRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"setTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setWhitelistRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"teamMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamMintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"}]

60a06040523480156200001157600080fd5b5060405180604001604052806009815260200168444f444f546f70696160b81b81525060405180604001604052806005815260200164544f50494160d81b8152506107d08260009081620000669190620001bf565b506001620000758382620001bf565b506080819052600355506200008c90503362000092565b6200028b565b600954600160a01b900460ff1615620000e45760405162461bcd60e51b815260206004820152601060248201526f1113d113d7d25392551250531256915160821b604482015260640160405180910390fd5b6009805460ff60a01b1916600160a01b179055600880546001600160a01b039092166001600160a01b0319909216919091179055565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200014557607f821691505b6020821081036200016657634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001ba57600081815260208120601f850160051c81016020861015620001955750805b601f850160051c820191505b81811015620001b657828155600101620001a1565b5050505b505050565b81516001600160401b03811115620001db57620001db6200011a565b620001f381620001ec845462000130565b846200016c565b602080601f8311600181146200022b5760008415620002125750858301515b600019600386901b1c1916600185901b178555620001b6565b600085815260208120601f198616915b828110156200025c578886015182559484019460019091019084016200023b565b50858210156200027b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6080516123f1620002ae600039600081816104fa015261092b01526123f16000f3fe608060405234801561001057600080fd5b50600436106102535760003560e01c806359dbe84211610146578063a22cb465116100c3578063d5abeb0111610087578063d5abeb01146104f8578063e58306f91461051e578063e985e9c514610531578063f2fde38b14610544578063f5aa406d14610557578063feb4cffb1461056a57600080fd5b8063a22cb46514610489578063addeda791461049c578063b88d4fde146104bf578063c87b56dd146104d2578063cb30bc2e146104e557600080fd5b80638456db151161010a5780638456db15146104305780638b32f62a1461044357806395d89b411461044b57806398a8cffe14610453578063a0355eca1461047657600080fd5b806359dbe842146103db5780636352211e146103ee578063704802751461040157806370a082311461041457806378e979251461042757600080fd5b806327304dfd116101d457806342842e0e1161019857806342842e0e1461039b5780634c57390e146103ae5780634c9b5007146103b75780634e71e0c8146103c057806355f804b3146103c857600080fd5b806327304dfd1461034a57806331940cc01461036d5780633197cbb614610376578063372f657c1461037f578063386bfc981461039257600080fd5b80630d0092971161021b5780630d009297146102e857806316048bc4146102fb5780631785f53c1461030e57806318160ddd1461032157806323b872dd1461033757600080fd5b806301ffc9a714610258578063069093e91461028057806306fdde0314610293578063081812fc146102a8578063095ea7b3146102d3575b600080fd5b61026b610266366004611c17565b610573565b60405190151581526020015b60405180910390f35b61026b61028e366004611d17565b6105c5565b61029b610615565b6040516102779190611dbe565b6102bb6102b6366004611dd1565b6106a7565b6040516001600160a01b039091168152602001610277565b6102e66102e1366004611dea565b610741565b005b6102e66102f6366004611e14565b610856565b6008546102bb906001600160a01b031681565b6102e661031c366004611e14565b6108d9565b610329610924565b604051908152602001610277565b6102e6610345366004611e2f565b610959565b61026b610358366004611e14565b600f6020526000908152604090205460ff1681565b610329600c5481565b61032960135481565b6102e661038d366004611e6b565b61098a565b610329600b5481565b6102e66103a9366004611e2f565b610b67565b61032961076c81565b61032960105481565b6102e6610b82565b6102e66103d6366004611ea0565b610c32565b6102e66103e9366004611dd1565b610c69565b6102bb6103fc366004611dd1565b610c98565b6102e661040f366004611e14565b610d0f565b610329610422366004611e14565b610d5d565b61032960125481565b6009546102bb906001600160a01b031681565b610329606481565b61029b610de4565b61026b610461366004611e14565b600d6020526000908152604090205460ff1681565b6102e6610484366004611f12565b610df3565b6102e6610497366004611f34565b610e6d565b61026b6104aa366004611e14565b600e6020526000908152604090205460ff1681565b6102e66104cd366004611f70565b610e7c565b61029b6104e0366004611dd1565b610eb4565b6102e66104f3366004611e6b565b610f8f565b7f0000000000000000000000000000000000000000000000000000000000000000610329565b6102e661052c366004611dea565b6110ac565b61026b61053f366004612030565b61111d565b6102e6610552366004611e14565b61114b565b6102e6610565366004611dd1565b6111d1565b61032960115481565b60006001600160e01b031982166380ac58cd60e01b14806105a457506001600160e01b03198216635b5e139f60e01b145b806105bf57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6040516bffffffffffffffffffffffff19606083901b166020820152600090819060340160405160208183030381529060405280519060200120905061060c858583611200565b95945050505050565b60606000805461062490612063565b80601f016020809104026020016040519081016040528092919081815260200182805461065090612063565b801561069d5780601f106106725761010080835404028352916020019161069d565b820191906000526020600020905b81548152906001019060200180831161068057829003601f168201915b5050505050905090565b6000818152600460205260408120546001600160a01b03166107255760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061074c82610c98565b9050806001600160a01b0316836001600160a01b0316036107b95760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161071c565b336001600160a01b03821614806107d557506107d5813361111d565b6108475760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161071c565b6108518383611216565b505050565b600954600160a01b900460ff16156108a35760405162461bcd60e51b815260206004820152601060248201526f1113d113d7d25392551250531256915160821b604482015260640161071c565b6009805460ff60a01b1916600160a01b179055600880546001600160a01b039092166001600160a01b0319909216919091179055565b6008546001600160a01b031633146109035760405162461bcd60e51b815260040161071c9061209d565b6001600160a01b03166000908152600f60205260409020805460ff19169055565b60006003547f000000000000000000000000000000000000000000000000000000000000000061095491906120d6565b905090565b6109633382611284565b61097f5760405162461bcd60e51b815260040161071c906120e9565b61085183838361135b565b60125442116109db5760405162461bcd60e51b815260206004820152601c60248201527f77686974656c697374206d696e7420686173206e6f7420626567756e00000000604482015260640161071c565b6013544210610a2c5760405162461bcd60e51b815260206004820181905260248201527f77686974656c697374206d696e742068617320616c726561647920656e646564604482015260640161071c565b336000908152600d602052604090205460ff1615610a8c5760405162461bcd60e51b815260206004820152601a60248201527f616464726573732068617320616c7265616479206d696e746564000000000000604482015260640161071c565b610a9981600b54336105c5565b610ae55760405162461bcd60e51b815260206004820152601860248201527f61646472657373206e6f7420696e2077686974656c6973740000000000000000604482015260640161071c565b61076c60115410610b2c5760405162461bcd60e51b81526020600482015260116024820152700e6eae0e0d8f240dcdee840cadcdeeaced607b1b604482015260640161071c565b336000908152600d60205260408120805460ff191660011790556011805491610b548361213a565b9190505550610b643360016114f7565b50565b61085183838360405180602001604052806000815250610e7c565b6009546001600160a01b03163314610bcc5760405162461bcd60e51b815260206004820152600d60248201526c494e56414c49445f434c41494d60981b604482015260640161071c565b6009546008546040516001600160a01b0392831692909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a360098054600880546001600160a01b03199081166001600160a01b03841617909155169055565b6008546001600160a01b03163314610c5c5760405162461bcd60e51b815260040161071c9061209d565b600a6108518284836121a1565b6008546001600160a01b03163314610c935760405162461bcd60e51b815260040161071c9061209d565b600c55565b6000818152600460205260408120546001600160a01b0316806105bf5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161071c565b6008546001600160a01b03163314610d395760405162461bcd60e51b815260040161071c9061209d565b6001600160a01b03166000908152600f60205260409020805460ff19166001179055565b60006001600160a01b038216610dc85760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161071c565b506001600160a01b031660009081526005602052604090205490565b60606001805461062490612063565b6008546001600160a01b03163314610e1d5760405162461bcd60e51b815260040161071c9061209d565b808210610e625760405162461bcd60e51b81526020600482015260136024820152721d1a5b595cdd185b5c081b9bdd081d985b1a59606a1b604482015260640161071c565b601291909155601355565b610e783383836116d6565b5050565b610e863383611284565b610ea25760405162461bcd60e51b815260040161071c906120e9565b610eae848484846117a4565b50505050565b6000818152600460205260409020546060906001600160a01b0316610f335760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161071c565b6000610f3d6117d7565b90506000815111610f5d5760405180602001604052806000815250610f88565b80610f67846117e6565b604051602001610f78929190612262565b6040516020818303038152906040525b9392505050565b336000908152600e602052604090205460ff1615610fef5760405162461bcd60e51b815260206004820152601a60248201527f616464726573732068617320616c7265616479206d696e746564000000000000604482015260640161071c565b610ffc81600c54336105c5565b61103e5760405162461bcd60e51b815260206004820152601360248201527261646472657373206e6f7420696e207465616d60681b604482015260640161071c565b6064601054106110845760405162461bcd60e51b81526020600482015260116024820152700e6eae0e0d8f240dcdee840cadcdeeaced607b1b604482015260640161071c565b336000908152600e60205260408120805460ff191660011790556010805491610b548361213a565b6008546001600160a01b03163314806110d95750336000908152600f602052604090205460ff1615156001145b6111135760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b604482015260640161071c565b610e7882826114f7565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6008546001600160a01b031633146111755760405162461bcd60e51b815260040161071c9061209d565b6008546040516001600160a01b038084169216907fdcf55418cee3220104fef63f979ff3c4097ad240c0c43dcb33ce837748983e6290600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b031633146111fb5760405162461bcd60e51b815260040161071c9061209d565b600b55565b60008261120d85846118e7565b14949350505050565b600081815260066020526040902080546001600160a01b0319166001600160a01b038416908117909155819061124b82610c98565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600460205260408120546001600160a01b03166112fd5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161071c565b600061130883610c98565b9050806001600160a01b0316846001600160a01b031614806113435750836001600160a01b0316611338846106a7565b6001600160a01b0316145b806113535750611353818561111d565b949350505050565b826001600160a01b031661136e82610c98565b6001600160a01b0316146113d25760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b606482015260840161071c565b6001600160a01b0382166114345760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161071c565b61143f600082611216565b6001600160a01b03831660009081526005602052604081208054600192906114689084906120d6565b90915550506001600160a01b0382166000908152600560205260408120805460019290611496908490612291565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b33321461153e5760405162461bcd60e51b815260206004820152601560248201527410dbdb9d1c9858dd1cc818d85b9b9bdd081b5a5b9d605a1b604482015260640161071c565b6001600160a01b0382166115945760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161071c565b600081116115f55760405162461bcd60e51b815260206004820152602860248201527f455243373231723a206e65656420746f206d696e74206174206c65617374206f6044820152673732903a37b5b2b760c11b606482015260840161071c565b80600354101561165b5760405162461bcd60e51b815260206004820152602b60248201527f455243373231723a206d696e74696e67206d6f726520746f6b656e732074686160448201526a6e20617661696c61626c6560a81b606482015260840161071c565b60035460005b8281101561169e5760006116758584611934565b905061168185826119bd565b61168a836122a4565b925050806116979061213a565b9050611661565b5060038190556001600160a01b038316600090815260056020526040812080548492906116cc908490612291565b9091555050505050565b816001600160a01b0316836001600160a01b0316036117375760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161071c565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6117af84848461135b565b6117bb84848484611a4c565b610eae5760405162461bcd60e51b815260040161071c906122bb565b6060600a805461062490612063565b60608160000361180d5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561183757806118218161213a565b91506118309050600a83612323565b9150611811565b60008167ffffffffffffffff81111561185257611852611c34565b6040519080825280601f01601f19166020018201604052801561187c576020820181803683370190505b5090505b8415611353576118916001836120d6565b915061189e600a86612337565b6118a9906030612291565b60f81b8183815181106118be576118be61234b565b60200101906001600160f81b031916908160001a9053506118e0600a86612323565b9450611880565b600081815b845181101561192c576119188286838151811061190b5761190b61234b565b6020026020010151611b4d565b9150806119248161213a565b9150506118ec565b509392505050565b600080833a4342446119476001846120d6565b604080516001600160a01b0390971660208801528601949094526060850192909252608084015260a08301524060c08201523060e082015261010081018490526101200160408051601f198184030181529190528051602090910120905060006119b18483612337565b905061060c8185611b79565b60008181526004602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a460405181906001600160a01b038416907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688590600090a35050565b60006001600160a01b0384163b15611b4257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611a90903390899088908890600401612361565b6020604051808303816000875af1925050508015611acb575060408051601f3d908101601f19168201909252611ac89181019061239e565b60015b611b28573d808015611af9576040519150601f19603f3d011682016040523d82523d6000602084013e611afe565b606091505b508051600003611b205760405162461bcd60e51b815260040161071c906122bb565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611353565b506001949350505050565b6000818310611b69576000828152602084905260409020610f88565b5060009182526020526040902090565b60008281526002602052604081205481818103611b97575083611b9a565b50805b6000611ba76001866120d6565b9050808614611bf85760008181526002602052604081205490819003611bdd576000878152600260205260409020829055611bf6565b6000878152600260205260408082208390558382528120555b505b50949350505050565b6001600160e01b031981168114610b6457600080fd5b600060208284031215611c2957600080fd5b8135610f8881611c01565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611c7357611c73611c34565b604052919050565b600082601f830112611c8c57600080fd5b8135602067ffffffffffffffff821115611ca857611ca8611c34565b8160051b611cb7828201611c4a565b9283528481018201928281019087851115611cd157600080fd5b83870192505b84831015611cf057823582529183019190830190611cd7565b979650505050505050565b80356001600160a01b0381168114611d1257600080fd5b919050565b600080600060608486031215611d2c57600080fd5b833567ffffffffffffffff811115611d4357600080fd5b611d4f86828701611c7b565b93505060208401359150611d6560408501611cfb565b90509250925092565b60005b83811015611d89578181015183820152602001611d71565b50506000910152565b60008151808452611daa816020860160208601611d6e565b601f01601f19169290920160200192915050565b602081526000610f886020830184611d92565b600060208284031215611de357600080fd5b5035919050565b60008060408385031215611dfd57600080fd5b611e0683611cfb565b946020939093013593505050565b600060208284031215611e2657600080fd5b610f8882611cfb565b600080600060608486031215611e4457600080fd5b611e4d84611cfb565b9250611e5b60208501611cfb565b9150604084013590509250925092565b600060208284031215611e7d57600080fd5b813567ffffffffffffffff811115611e9457600080fd5b61135384828501611c7b565b60008060208385031215611eb357600080fd5b823567ffffffffffffffff80821115611ecb57600080fd5b818501915085601f830112611edf57600080fd5b813581811115611eee57600080fd5b866020828501011115611f0057600080fd5b60209290920196919550909350505050565b60008060408385031215611f2557600080fd5b50508035926020909101359150565b60008060408385031215611f4757600080fd5b611f5083611cfb565b915060208301358015158114611f6557600080fd5b809150509250929050565b60008060008060808587031215611f8657600080fd5b611f8f85611cfb565b93506020611f9e818701611cfb565b935060408601359250606086013567ffffffffffffffff80821115611fc257600080fd5b818801915088601f830112611fd657600080fd5b813581811115611fe857611fe8611c34565b611ffa601f8201601f19168501611c4a565b9150808252898482850101111561201057600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000806040838503121561204357600080fd5b61204c83611cfb565b915061205a60208401611cfb565b90509250929050565b600181811c9082168061207757607f821691505b60208210810361209757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600990820152682727aa2fa7aba722a960b91b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156105bf576105bf6120c0565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60006001820161214c5761214c6120c0565b5060010190565b601f82111561085157600081815260208120601f850160051c8101602086101561217a5750805b601f850160051c820191505b8181101561219957828155600101612186565b505050505050565b67ffffffffffffffff8311156121b9576121b9611c34565b6121cd836121c78354612063565b83612153565b6000601f84116001811461220157600085156121e95750838201355b600019600387901b1c1916600186901b17835561225b565b600083815260209020601f19861690835b828110156122325786850135825560209485019460019092019101612212565b508682101561224f5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60008351612274818460208801611d6e565b835190830190612288818360208801611d6e565b01949350505050565b808201808211156105bf576105bf6120c0565b6000816122b3576122b36120c0565b506000190190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b6000826123325761233261230d565b500490565b6000826123465761234661230d565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061239490830184611d92565b9695505050505050565b6000602082840312156123b057600080fd5b8151610f8881611c0156fea2646970667358221220e3e5e40bb36bf9368530e4c14eefa239d4b64d45d445c7bc518dff0dcda10ae864736f6c63430008100033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102535760003560e01c806359dbe84211610146578063a22cb465116100c3578063d5abeb0111610087578063d5abeb01146104f8578063e58306f91461051e578063e985e9c514610531578063f2fde38b14610544578063f5aa406d14610557578063feb4cffb1461056a57600080fd5b8063a22cb46514610489578063addeda791461049c578063b88d4fde146104bf578063c87b56dd146104d2578063cb30bc2e146104e557600080fd5b80638456db151161010a5780638456db15146104305780638b32f62a1461044357806395d89b411461044b57806398a8cffe14610453578063a0355eca1461047657600080fd5b806359dbe842146103db5780636352211e146103ee578063704802751461040157806370a082311461041457806378e979251461042757600080fd5b806327304dfd116101d457806342842e0e1161019857806342842e0e1461039b5780634c57390e146103ae5780634c9b5007146103b75780634e71e0c8146103c057806355f804b3146103c857600080fd5b806327304dfd1461034a57806331940cc01461036d5780633197cbb614610376578063372f657c1461037f578063386bfc981461039257600080fd5b80630d0092971161021b5780630d009297146102e857806316048bc4146102fb5780631785f53c1461030e57806318160ddd1461032157806323b872dd1461033757600080fd5b806301ffc9a714610258578063069093e91461028057806306fdde0314610293578063081812fc146102a8578063095ea7b3146102d3575b600080fd5b61026b610266366004611c17565b610573565b60405190151581526020015b60405180910390f35b61026b61028e366004611d17565b6105c5565b61029b610615565b6040516102779190611dbe565b6102bb6102b6366004611dd1565b6106a7565b6040516001600160a01b039091168152602001610277565b6102e66102e1366004611dea565b610741565b005b6102e66102f6366004611e14565b610856565b6008546102bb906001600160a01b031681565b6102e661031c366004611e14565b6108d9565b610329610924565b604051908152602001610277565b6102e6610345366004611e2f565b610959565b61026b610358366004611e14565b600f6020526000908152604090205460ff1681565b610329600c5481565b61032960135481565b6102e661038d366004611e6b565b61098a565b610329600b5481565b6102e66103a9366004611e2f565b610b67565b61032961076c81565b61032960105481565b6102e6610b82565b6102e66103d6366004611ea0565b610c32565b6102e66103e9366004611dd1565b610c69565b6102bb6103fc366004611dd1565b610c98565b6102e661040f366004611e14565b610d0f565b610329610422366004611e14565b610d5d565b61032960125481565b6009546102bb906001600160a01b031681565b610329606481565b61029b610de4565b61026b610461366004611e14565b600d6020526000908152604090205460ff1681565b6102e6610484366004611f12565b610df3565b6102e6610497366004611f34565b610e6d565b61026b6104aa366004611e14565b600e6020526000908152604090205460ff1681565b6102e66104cd366004611f70565b610e7c565b61029b6104e0366004611dd1565b610eb4565b6102e66104f3366004611e6b565b610f8f565b7f00000000000000000000000000000000000000000000000000000000000007d0610329565b6102e661052c366004611dea565b6110ac565b61026b61053f366004612030565b61111d565b6102e6610552366004611e14565b61114b565b6102e6610565366004611dd1565b6111d1565b61032960115481565b60006001600160e01b031982166380ac58cd60e01b14806105a457506001600160e01b03198216635b5e139f60e01b145b806105bf57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6040516bffffffffffffffffffffffff19606083901b166020820152600090819060340160405160208183030381529060405280519060200120905061060c858583611200565b95945050505050565b60606000805461062490612063565b80601f016020809104026020016040519081016040528092919081815260200182805461065090612063565b801561069d5780601f106106725761010080835404028352916020019161069d565b820191906000526020600020905b81548152906001019060200180831161068057829003601f168201915b5050505050905090565b6000818152600460205260408120546001600160a01b03166107255760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061074c82610c98565b9050806001600160a01b0316836001600160a01b0316036107b95760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161071c565b336001600160a01b03821614806107d557506107d5813361111d565b6108475760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161071c565b6108518383611216565b505050565b600954600160a01b900460ff16156108a35760405162461bcd60e51b815260206004820152601060248201526f1113d113d7d25392551250531256915160821b604482015260640161071c565b6009805460ff60a01b1916600160a01b179055600880546001600160a01b039092166001600160a01b0319909216919091179055565b6008546001600160a01b031633146109035760405162461bcd60e51b815260040161071c9061209d565b6001600160a01b03166000908152600f60205260409020805460ff19169055565b60006003547f00000000000000000000000000000000000000000000000000000000000007d061095491906120d6565b905090565b6109633382611284565b61097f5760405162461bcd60e51b815260040161071c906120e9565b61085183838361135b565b60125442116109db5760405162461bcd60e51b815260206004820152601c60248201527f77686974656c697374206d696e7420686173206e6f7420626567756e00000000604482015260640161071c565b6013544210610a2c5760405162461bcd60e51b815260206004820181905260248201527f77686974656c697374206d696e742068617320616c726561647920656e646564604482015260640161071c565b336000908152600d602052604090205460ff1615610a8c5760405162461bcd60e51b815260206004820152601a60248201527f616464726573732068617320616c7265616479206d696e746564000000000000604482015260640161071c565b610a9981600b54336105c5565b610ae55760405162461bcd60e51b815260206004820152601860248201527f61646472657373206e6f7420696e2077686974656c6973740000000000000000604482015260640161071c565b61076c60115410610b2c5760405162461bcd60e51b81526020600482015260116024820152700e6eae0e0d8f240dcdee840cadcdeeaced607b1b604482015260640161071c565b336000908152600d60205260408120805460ff191660011790556011805491610b548361213a565b9190505550610b643360016114f7565b50565b61085183838360405180602001604052806000815250610e7c565b6009546001600160a01b03163314610bcc5760405162461bcd60e51b815260206004820152600d60248201526c494e56414c49445f434c41494d60981b604482015260640161071c565b6009546008546040516001600160a01b0392831692909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a360098054600880546001600160a01b03199081166001600160a01b03841617909155169055565b6008546001600160a01b03163314610c5c5760405162461bcd60e51b815260040161071c9061209d565b600a6108518284836121a1565b6008546001600160a01b03163314610c935760405162461bcd60e51b815260040161071c9061209d565b600c55565b6000818152600460205260408120546001600160a01b0316806105bf5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161071c565b6008546001600160a01b03163314610d395760405162461bcd60e51b815260040161071c9061209d565b6001600160a01b03166000908152600f60205260409020805460ff19166001179055565b60006001600160a01b038216610dc85760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161071c565b506001600160a01b031660009081526005602052604090205490565b60606001805461062490612063565b6008546001600160a01b03163314610e1d5760405162461bcd60e51b815260040161071c9061209d565b808210610e625760405162461bcd60e51b81526020600482015260136024820152721d1a5b595cdd185b5c081b9bdd081d985b1a59606a1b604482015260640161071c565b601291909155601355565b610e783383836116d6565b5050565b610e863383611284565b610ea25760405162461bcd60e51b815260040161071c906120e9565b610eae848484846117a4565b50505050565b6000818152600460205260409020546060906001600160a01b0316610f335760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161071c565b6000610f3d6117d7565b90506000815111610f5d5760405180602001604052806000815250610f88565b80610f67846117e6565b604051602001610f78929190612262565b6040516020818303038152906040525b9392505050565b336000908152600e602052604090205460ff1615610fef5760405162461bcd60e51b815260206004820152601a60248201527f616464726573732068617320616c7265616479206d696e746564000000000000604482015260640161071c565b610ffc81600c54336105c5565b61103e5760405162461bcd60e51b815260206004820152601360248201527261646472657373206e6f7420696e207465616d60681b604482015260640161071c565b6064601054106110845760405162461bcd60e51b81526020600482015260116024820152700e6eae0e0d8f240dcdee840cadcdeeaced607b1b604482015260640161071c565b336000908152600e60205260408120805460ff191660011790556010805491610b548361213a565b6008546001600160a01b03163314806110d95750336000908152600f602052604090205460ff1615156001145b6111135760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b604482015260640161071c565b610e7882826114f7565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6008546001600160a01b031633146111755760405162461bcd60e51b815260040161071c9061209d565b6008546040516001600160a01b038084169216907fdcf55418cee3220104fef63f979ff3c4097ad240c0c43dcb33ce837748983e6290600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b031633146111fb5760405162461bcd60e51b815260040161071c9061209d565b600b55565b60008261120d85846118e7565b14949350505050565b600081815260066020526040902080546001600160a01b0319166001600160a01b038416908117909155819061124b82610c98565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600460205260408120546001600160a01b03166112fd5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161071c565b600061130883610c98565b9050806001600160a01b0316846001600160a01b031614806113435750836001600160a01b0316611338846106a7565b6001600160a01b0316145b806113535750611353818561111d565b949350505050565b826001600160a01b031661136e82610c98565b6001600160a01b0316146113d25760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b606482015260840161071c565b6001600160a01b0382166114345760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161071c565b61143f600082611216565b6001600160a01b03831660009081526005602052604081208054600192906114689084906120d6565b90915550506001600160a01b0382166000908152600560205260408120805460019290611496908490612291565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b33321461153e5760405162461bcd60e51b815260206004820152601560248201527410dbdb9d1c9858dd1cc818d85b9b9bdd081b5a5b9d605a1b604482015260640161071c565b6001600160a01b0382166115945760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161071c565b600081116115f55760405162461bcd60e51b815260206004820152602860248201527f455243373231723a206e65656420746f206d696e74206174206c65617374206f6044820152673732903a37b5b2b760c11b606482015260840161071c565b80600354101561165b5760405162461bcd60e51b815260206004820152602b60248201527f455243373231723a206d696e74696e67206d6f726520746f6b656e732074686160448201526a6e20617661696c61626c6560a81b606482015260840161071c565b60035460005b8281101561169e5760006116758584611934565b905061168185826119bd565b61168a836122a4565b925050806116979061213a565b9050611661565b5060038190556001600160a01b038316600090815260056020526040812080548492906116cc908490612291565b9091555050505050565b816001600160a01b0316836001600160a01b0316036117375760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161071c565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6117af84848461135b565b6117bb84848484611a4c565b610eae5760405162461bcd60e51b815260040161071c906122bb565b6060600a805461062490612063565b60608160000361180d5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561183757806118218161213a565b91506118309050600a83612323565b9150611811565b60008167ffffffffffffffff81111561185257611852611c34565b6040519080825280601f01601f19166020018201604052801561187c576020820181803683370190505b5090505b8415611353576118916001836120d6565b915061189e600a86612337565b6118a9906030612291565b60f81b8183815181106118be576118be61234b565b60200101906001600160f81b031916908160001a9053506118e0600a86612323565b9450611880565b600081815b845181101561192c576119188286838151811061190b5761190b61234b565b6020026020010151611b4d565b9150806119248161213a565b9150506118ec565b509392505050565b600080833a4342446119476001846120d6565b604080516001600160a01b0390971660208801528601949094526060850192909252608084015260a08301524060c08201523060e082015261010081018490526101200160408051601f198184030181529190528051602090910120905060006119b18483612337565b905061060c8185611b79565b60008181526004602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a460405181906001600160a01b038416907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688590600090a35050565b60006001600160a01b0384163b15611b4257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611a90903390899088908890600401612361565b6020604051808303816000875af1925050508015611acb575060408051601f3d908101601f19168201909252611ac89181019061239e565b60015b611b28573d808015611af9576040519150601f19603f3d011682016040523d82523d6000602084013e611afe565b606091505b508051600003611b205760405162461bcd60e51b815260040161071c906122bb565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611353565b506001949350505050565b6000818310611b69576000828152602084905260409020610f88565b5060009182526020526040902090565b60008281526002602052604081205481818103611b97575083611b9a565b50805b6000611ba76001866120d6565b9050808614611bf85760008181526002602052604081205490819003611bdd576000878152600260205260409020829055611bf6565b6000878152600260205260408082208390558382528120555b505b50949350505050565b6001600160e01b031981168114610b6457600080fd5b600060208284031215611c2957600080fd5b8135610f8881611c01565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611c7357611c73611c34565b604052919050565b600082601f830112611c8c57600080fd5b8135602067ffffffffffffffff821115611ca857611ca8611c34565b8160051b611cb7828201611c4a565b9283528481018201928281019087851115611cd157600080fd5b83870192505b84831015611cf057823582529183019190830190611cd7565b979650505050505050565b80356001600160a01b0381168114611d1257600080fd5b919050565b600080600060608486031215611d2c57600080fd5b833567ffffffffffffffff811115611d4357600080fd5b611d4f86828701611c7b565b93505060208401359150611d6560408501611cfb565b90509250925092565b60005b83811015611d89578181015183820152602001611d71565b50506000910152565b60008151808452611daa816020860160208601611d6e565b601f01601f19169290920160200192915050565b602081526000610f886020830184611d92565b600060208284031215611de357600080fd5b5035919050565b60008060408385031215611dfd57600080fd5b611e0683611cfb565b946020939093013593505050565b600060208284031215611e2657600080fd5b610f8882611cfb565b600080600060608486031215611e4457600080fd5b611e4d84611cfb565b9250611e5b60208501611cfb565b9150604084013590509250925092565b600060208284031215611e7d57600080fd5b813567ffffffffffffffff811115611e9457600080fd5b61135384828501611c7b565b60008060208385031215611eb357600080fd5b823567ffffffffffffffff80821115611ecb57600080fd5b818501915085601f830112611edf57600080fd5b813581811115611eee57600080fd5b866020828501011115611f0057600080fd5b60209290920196919550909350505050565b60008060408385031215611f2557600080fd5b50508035926020909101359150565b60008060408385031215611f4757600080fd5b611f5083611cfb565b915060208301358015158114611f6557600080fd5b809150509250929050565b60008060008060808587031215611f8657600080fd5b611f8f85611cfb565b93506020611f9e818701611cfb565b935060408601359250606086013567ffffffffffffffff80821115611fc257600080fd5b818801915088601f830112611fd657600080fd5b813581811115611fe857611fe8611c34565b611ffa601f8201601f19168501611c4a565b9150808252898482850101111561201057600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000806040838503121561204357600080fd5b61204c83611cfb565b915061205a60208401611cfb565b90509250929050565b600181811c9082168061207757607f821691505b60208210810361209757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600990820152682727aa2fa7aba722a960b91b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156105bf576105bf6120c0565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60006001820161214c5761214c6120c0565b5060010190565b601f82111561085157600081815260208120601f850160051c8101602086101561217a5750805b601f850160051c820191505b8181101561219957828155600101612186565b505050505050565b67ffffffffffffffff8311156121b9576121b9611c34565b6121cd836121c78354612063565b83612153565b6000601f84116001811461220157600085156121e95750838201355b600019600387901b1c1916600186901b17835561225b565b600083815260209020601f19861690835b828110156122325786850135825560209485019460019092019101612212565b508682101561224f5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60008351612274818460208801611d6e565b835190830190612288818360208801611d6e565b01949350505050565b808201808211156105bf576105bf6120c0565b6000816122b3576122b36120c0565b506000190190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b6000826123325761233261230d565b500490565b6000826123465761234661230d565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061239490830184611d92565b9695505050505050565b6000602082840312156123b057600080fd5b8151610f8881611c0156fea2646970667358221220e3e5e40bb36bf9368530e4c14eefa239d4b64d45d445c7bc518dff0dcda10ae864736f6c63430008100033

Deployed Bytecode Sourcemap

47411:2916:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22080:305;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;22080:305:0;;;;;;;;50097:227;;;;;;:::i;:::-;;:::i;23263:100::-;;;:::i;:::-;;;;;;;:::i;24824:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3499:32:1;;;3481:51;;3469:2;3454:18;24824:221:0;3335:203:1;24346:412:0;;;;;;:::i;:::-;;:::i;:::-;;46858:127;;;;;;:::i;:::-;;:::i;46225:22::-;;;;;-1:-1:-1;;;;;46225:22:0;;;48600:96;;;;;;:::i;:::-;;:::i;22397:119::-;;;:::i;:::-;;;4139:25:1;;;4127:2;4112:18;22397:119:0;3993:177:1;25574:339:0;;;;;;:::i;:::-;;:::i;47673:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;47540:23;;;;;;47933:22;;;;;;48890:593;;;;;;:::i;:::-;;:::i;47505:28::-;;;;;;25984:185;;;;;;:::i;:::-;;:::i;47721:47::-;;47764:4;47721:47;;47823:30;;;;;;47164:228;;;:::i;48184:106::-;;;;;;:::i;:::-;;:::i;48404:88::-;;;;;;:::i;:::-;;:::i;22957:239::-;;;;;;:::i;:::-;;:::i;48500:92::-;;;;;;:::i;:::-;;:::i;22687:208::-;;;;;;:::i;:::-;;:::i;47902:24::-;;;;;;46254:26;;;;;-1:-1:-1;;;;;46254:26:0;;;47775:41;;47813:3;47775:41;;23432:104;;;:::i;47570:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;48704:178;;;;;;:::i;:::-;;:::i;25117:155::-;;;;;;:::i;:::-;;:::i;47624:42::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;26240:328;;;;;;:::i;:::-;;:::i;23607:334::-;;;;;;:::i;:::-;;:::i;49491:393::-;;;;;;:::i;:::-;;:::i;22528:95::-;22605:10;22528:95;;49892:197;;;;;;:::i;:::-;;:::i;25343:164::-;;;;;;:::i;:::-;;:::i;46993:163::-;;;;;;:::i;:::-;;:::i;48298:98::-;;;;;;:::i;:::-;;:::i;47860:35::-;;;;;;22080:305;22182:4;-1:-1:-1;;;;;;22219:40:0;;-1:-1:-1;;;22219:40:0;;:105;;-1:-1:-1;;;;;;;22276:48:0;;-1:-1:-1;;;22276:48:0;22219:105;:158;;;-1:-1:-1;;;;;;;;;;14833:40:0;;;22341:36;22199:178;22080:305;-1:-1:-1;;22080:305:0:o;50097:227::-;50238:22;;-1:-1:-1;;7829:2:1;7825:15;;;7821:53;50238:22:0;;;7809:66:1;50196:4:0;;;;7891:12:1;;50238:22:0;;;;;;;;;;;;50228:33;;;;;;50213:48;;50279:37;50298:5;50305:4;50311;50279:18;:37::i;:::-;50272:44;50097:227;-1:-1:-1;;;;;50097:227:0:o;23263:100::-;23317:13;23350:5;23343:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23263:100;:::o;24824:221::-;24900:7;28167:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28167:16:0;24920:73;;;;-1:-1:-1;;;24920:73:0;;8501:2:1;24920:73:0;;;8483:21:1;8540:2;8520:18;;;8513:30;8579:34;8559:18;;;8552:62;-1:-1:-1;;;8630:18:1;;;8623:42;8682:19;;24920:73:0;;;;;;;;;-1:-1:-1;25013:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25013:24:0;;24824:221::o;24346:412::-;24427:13;24443:24;24459:7;24443:15;:24::i;:::-;24427:40;;24492:5;-1:-1:-1;;;;;24486:11:0;:2;-1:-1:-1;;;;;24486:11:0;;24478:57;;;;-1:-1:-1;;;24478:57:0;;8914:2:1;24478:57:0;;;8896:21:1;8953:2;8933:18;;;8926:30;8992:34;8972:18;;;8965:62;-1:-1:-1;;;9043:18:1;;;9036:31;9084:19;;24478:57:0;8712:397:1;24478:57:0;3295:10;-1:-1:-1;;;;;24570:21:0;;;;:62;;-1:-1:-1;24595:37:0;24612:5;3295:10;25343:164;:::i;24595:37::-;24548:168;;;;-1:-1:-1;;;24548:168:0;;9316:2:1;24548:168:0;;;9298:21:1;9355:2;9335:18;;;9328:30;9394:34;9374:18;;;9367:62;9465:26;9445:18;;;9438:54;9509:19;;24548:168:0;9114:420:1;24548:168:0;24729:21;24738:2;24742:7;24729:8;:21::i;:::-;24416:342;24346:412;;:::o;46858:127::-;46647:13;;-1:-1:-1;;;46647:13:0;;;;46646:14;46638:43;;;;-1:-1:-1;;;46638:43:0;;9741:2:1;46638:43:0;;;9723:21:1;9780:2;9760:18;;;9753:30;-1:-1:-1;;;9799:18:1;;;9792:46;9855:18;;46638:43:0;9539:340:1;46638:43:0;46928:13:::1;:20:::0;;-1:-1:-1;;;;46928:20:0::1;-1:-1:-1::0;;;46928:20:0::1;::::0;;46959:7:::1;:18:::0;;-1:-1:-1;;;;;46959:18:0;;::::1;-1:-1:-1::0;;;;;;46959:18:0;;::::1;::::0;;;::::1;::::0;;46858:127::o;48600:96::-;46763:7;;-1:-1:-1;;;;;46763:7:0;46749:10;:21;46741:43;;;;-1:-1:-1;;;46741:43:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48665:15:0::1;48683:5;48665:15:::0;;;:9:::1;:15;::::0;;;;:23;;-1:-1:-1;;48665:23:0::1;::::0;;48600:96::o;22397:119::-;22449:7;22489:19;;22476:10;:32;;;;:::i;:::-;22469:39;;22397:119;:::o;25574:339::-;25769:41;3295:10;25802:7;25769:18;:41::i;:::-;25761:103;;;;-1:-1:-1;;;25761:103:0;;;;;;;:::i;:::-;25877:28;25887:4;25893:2;25897:7;25877:9;:28::i;48890:593::-;48981:9;;48963:15;:27;48955:68;;;;-1:-1:-1;;;48955:68:0;;11106:2:1;48955:68:0;;;11088:21:1;11145:2;11125:18;;;11118:30;11184;11164:18;;;11157:58;11232:18;;48955:68:0;10904:352:1;48955:68:0;49060:7;;49042:15;:25;49034:70;;;;-1:-1:-1;;;49034:70:0;;11463:2:1;49034:70:0;;;11445:21:1;;;11482:18;;;11475:30;11541:34;11521:18;;;11514:62;11593:18;;49034:70:0;11261:356:1;49034:70:0;49140:10;49124:27;;;;:15;:27;;;;;;;;49123:28;49115:67;;;;-1:-1:-1;;;49115:67:0;;11824:2:1;49115:67:0;;;11806:21:1;11863:2;11843:18;;;11836:30;11902:28;11882:18;;;11875:56;11948:18;;49115:67:0;11622:350:1;49115:67:0;49201:50;49218:5;49225:13;;49240:10;49201:16;:50::i;:::-;49193:87;;;;-1:-1:-1;;;49193:87:0;;12179:2:1;49193:87:0;;;12161:21:1;12218:2;12198:18;;;12191:30;12257:26;12237:18;;;12230:54;12301:18;;49193:87:0;11977:348:1;49193:87:0;47764:4;49299:20;;:39;49291:69;;;;-1:-1:-1;;;49291:69:0;;12532:2:1;49291:69:0;;;12514:21:1;12571:2;12551:18;;;12544:30;-1:-1:-1;;;12590:18:1;;;12583:47;12647:18;;49291:69:0;12330:341:1;49291:69:0;49387:10;49371:27;;;;:15;:27;;;;;:34;;-1:-1:-1;;49371:34:0;49401:4;49371:34;;;49416:20;:22;;;;;;:::i;:::-;;;;;;49449:26;49461:10;49473:1;49449:11;:26::i;:::-;48890:593;:::o;25984:185::-;26122:39;26139:4;26145:2;26149:7;26122:39;;;;;;;;;;;;:16;:39::i;47164:228::-;47230:11;;-1:-1:-1;;;;;47230:11:0;47216:10;:25;47208:51;;;;-1:-1:-1;;;47208:51:0;;13018:2:1;47208:51:0;;;13000:21:1;13057:2;13037:18;;;13030:30;-1:-1:-1;;;13076:18:1;;;13069:43;13129:18;;47208:51:0;12816:337:1;47208:51:0;47305:11;;47296:7;;47275:42;;-1:-1:-1;;;;;47305:11:0;;;;47296:7;;;;47275:42;;47305:11;;47275:42;47338:11;;;47328:7;:21;;-1:-1:-1;;;;;;47328:21:0;;;-1:-1:-1;;;;;47338:11:0;;47328:21;;;;47360:24;;;47164:228::o;48184:106::-;46763:7;;-1:-1:-1;;;;;46763:7:0;46749:10;:21;46741:43;;;;-1:-1:-1;;;46741:43:0;;;;;;;:::i;:::-;48259:13:::1;:23;48275:7:::0;;48259:13;:23:::1;:::i;48404:88::-:0;46763:7;;-1:-1:-1;;;;;46763:7:0;46749:10;:21;46741:43;;;;-1:-1:-1;;;46741:43:0;;;;;;;:::i;:::-;48469:8:::1;:15:::0;48404:88::o;22957:239::-;23029:7;23065:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23065:16:0;;23092:73;;;;-1:-1:-1;;;23092:73:0;;15418:2:1;23092:73:0;;;15400:21:1;15457:2;15437:18;;;15430:30;15496:34;15476:18;;;15469:62;-1:-1:-1;;;15547:18:1;;;15540:39;15596:19;;23092:73:0;15216:405:1;48500:92:0;46763:7;;-1:-1:-1;;;;;46763:7:0;46749:10;:21;46741:43;;;;-1:-1:-1;;;46741:43:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48562:15:0::1;;::::0;;;:9:::1;:15;::::0;;;;:22;;-1:-1:-1;;48562:22:0::1;48580:4;48562:22;::::0;;48500:92::o;22687:208::-;22759:7;-1:-1:-1;;;;;22787:19:0;;22779:74;;;;-1:-1:-1;;;22779:74:0;;15828:2:1;22779:74:0;;;15810:21:1;15867:2;15847:18;;;15840:30;15906:34;15886:18;;;15879:62;-1:-1:-1;;;15957:18:1;;;15950:40;16007:19;;22779:74:0;15626:406:1;22779:74:0;-1:-1:-1;;;;;;22871:16:0;;;;;:9;:16;;;;;;;22687:208::o;23432:104::-;23488:13;23521:7;23514:14;;;;;:::i;48704:178::-;46763:7;;-1:-1:-1;;;;;46763:7:0;46749:10;:21;46741:43;;;;-1:-1:-1;;;46741:43:0;;;;;;;:::i;:::-;48795:3:::1;48787:5;:11;48779:43;;;::::0;-1:-1:-1;;;48779:43:0;;16239:2:1;48779:43:0::1;::::0;::::1;16221:21:1::0;16278:2;16258:18;;;16251:30;-1:-1:-1;;;16297:18:1;;;16290:49;16356:18;;48779:43:0::1;16037:343:1::0;48779:43:0::1;48833:9;:17:::0;;;;48861:7:::1;:13:::0;48704:178::o;25117:155::-;25212:52;3295:10;25245:8;25255;25212:18;:52::i;:::-;25117:155;;:::o;26240:328::-;26415:41;3295:10;26448:7;26415:18;:41::i;:::-;26407:103;;;;-1:-1:-1;;;26407:103:0;;;;;;;:::i;:::-;26521:39;26535:4;26541:2;26545:7;26554:5;26521:13;:39::i;:::-;26240:328;;;;:::o;23607:334::-;28143:4;28167:16;;;:7;:16;;;;;;23680:13;;-1:-1:-1;;;;;28167:16:0;23706:76;;;;-1:-1:-1;;;23706:76:0;;16587:2:1;23706:76:0;;;16569:21:1;16626:2;16606:18;;;16599:30;16665:34;16645:18;;;16638:62;-1:-1:-1;;;16716:18:1;;;16709:45;16771:19;;23706:76:0;16385:411:1;23706:76:0;23795:21;23819:10;:8;:10::i;:::-;23795:34;;23871:1;23853:7;23847:21;:25;:86;;;;;;;;;;;;;;;;;23899:7;23908:18;:7;:16;:18::i;:::-;23882:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23847:86;23840:93;23607:334;-1:-1:-1;;;23607:334:0:o;49491:393::-;49571:10;49560:22;;;;:10;:22;;;;;;;;49559:23;49551:62;;;;-1:-1:-1;;;49551:62:0;;11824:2:1;49551:62:0;;;11806:21:1;11863:2;11843:18;;;11836:30;11902:28;11882:18;;;11875:56;11948:18;;49551:62:0;11622:350:1;49551:62:0;49632:45;49649:5;49656:8;;49666:10;49632:16;:45::i;:::-;49624:77;;;;-1:-1:-1;;;49624:77:0;;17504:2:1;49624:77:0;;;17486:21:1;17543:2;17523:18;;;17516:30;-1:-1:-1;;;17562:18:1;;;17555:49;17621:18;;49624:77:0;17302:343:1;49624:77:0;47813:3;49720:15;;:29;49712:59;;;;-1:-1:-1;;;49712:59:0;;12532:2:1;49712:59:0;;;12514:21:1;12571:2;12551:18;;;12544:30;-1:-1:-1;;;12590:18:1;;;12583:47;12647:18;;49712:59:0;12330:341:1;49712:59:0;49793:10;49782:22;;;;:10;:22;;;;;:29;;-1:-1:-1;;49782:29:0;49807:4;49782:29;;;49822:15;:17;;;;;;:::i;49892:197::-;49985:7;;-1:-1:-1;;;;;49985:7:0;49971:10;:21;;:54;;-1:-1:-1;50006:10:0;49996:21;;;;:9;:21;;;;;;;;:29;;:21;:29;49971:54;49963:78;;;;-1:-1:-1;;;49963:78:0;;17852:2:1;49963:78:0;;;17834:21:1;17891:2;17871:18;;;17864:30;-1:-1:-1;;;17910:18:1;;;17903:41;17961:18;;49963:78:0;17650:335:1;49963:78:0;50052:29;50064:2;50068:12;50052:11;:29::i;25343:164::-;-1:-1:-1;;;;;25464:25:0;;;25440:4;25464:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25343:164::o;46993:163::-;46763:7;;-1:-1:-1;;;;;46763:7:0;46749:10;:21;46741:43;;;;-1:-1:-1;;;46741:43:0;;;;;;;:::i;:::-;47097:7:::1;::::0;47071:44:::1;::::0;-1:-1:-1;;;;;47071:44:0;;::::1;::::0;47097:7:::1;::::0;47071:44:::1;::::0;47097:7:::1;::::0;47071:44:::1;47126:11;:22:::0;;-1:-1:-1;;;;;;47126:22:0::1;-1:-1:-1::0;;;;;47126:22:0;;;::::1;::::0;;;::::1;::::0;;46993:163::o;48298:98::-;46763:7;;-1:-1:-1;;;;;46763:7:0;46749:10;:21;46741:43;;;;-1:-1:-1;;;46741:43:0;;;;;;;:::i;:::-;48368:13:::1;:20:::0;48298:98::o;38525:190::-;38650:4;38703;38674:25;38687:5;38694:4;38674:12;:25::i;:::-;:33;;38525:190;-1:-1:-1;;;;38525:190:0:o;34122:175::-;34197:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;34197:29:0;-1:-1:-1;;;;;34197:29:0;;;;;;;;:24;;34251;34197;34251:15;:24::i;:::-;-1:-1:-1;;;;;34242:47:0;;;;;;;;;;;34122:175;;:::o;28372:349::-;28465:4;28167:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28167:16:0;28482:73;;;;-1:-1:-1;;;28482:73:0;;18192:2:1;28482:73:0;;;18174:21:1;18231:2;18211:18;;;18204:30;18270:34;18250:18;;;18243:62;-1:-1:-1;;;18321:18:1;;;18314:42;18373:19;;28482:73:0;17990:408:1;28482:73:0;28566:13;28582:24;28598:7;28582:15;:24::i;:::-;28566:40;;28636:5;-1:-1:-1;;;;;28625:16:0;:7;-1:-1:-1;;;;;28625:16:0;;:51;;;;28669:7;-1:-1:-1;;;;;28645:31:0;:20;28657:7;28645:11;:20::i;:::-;-1:-1:-1;;;;;28645:31:0;;28625:51;:87;;;;28680:32;28697:5;28704:7;28680:16;:32::i;:::-;28617:96;28372:349;-1:-1:-1;;;;28372:349:0:o;33378:626::-;33538:4;-1:-1:-1;;;;;33510:32:0;:24;33526:7;33510:15;:24::i;:::-;-1:-1:-1;;;;;33510:32:0;;33502:82;;;;-1:-1:-1;;;33502:82:0;;18605:2:1;33502:82:0;;;18587:21:1;18644:2;18624:18;;;18617:30;18683:34;18663:18;;;18656:62;-1:-1:-1;;;18734:18:1;;;18727:35;18779:19;;33502:82:0;18403:401:1;33502:82:0;-1:-1:-1;;;;;33603:16:0;;33595:65;;;;-1:-1:-1;;;33595:65:0;;19011:2:1;33595:65:0;;;18993:21:1;19050:2;19030:18;;;19023:30;19089:34;19069:18;;;19062:62;-1:-1:-1;;;19140:18:1;;;19133:34;19184:19;;33595:65:0;18809:400:1;33595:65:0;33777:29;33794:1;33798:7;33777:8;:29::i;:::-;-1:-1:-1;;;;;33819:15:0;;;;;;:9;:15;;;;;:20;;33838:1;;33819:15;:20;;33838:1;;33819:20;:::i;:::-;;;;-1:-1:-1;;;;;;;33850:13:0;;;;;;:9;:13;;;;;:18;;33867:1;;33850:13;:18;;33867:1;;33850:18;:::i;:::-;;;;-1:-1:-1;;33879:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;33879:21:0;-1:-1:-1;;;;;33879:21:0;;;;;;;;;33918:27;;33879:16;;33918:27;;;;;;;24416:342;24346:412;;:::o;29064:984::-;3295:10;29166:9;29150:25;29142:59;;;;-1:-1:-1;;;29142:59:0;;19546:2:1;29142:59:0;;;19528:21:1;19585:2;19565:18;;;19558:30;-1:-1:-1;;;19604:18:1;;;19597:51;19665:18;;29142:59:0;19344:345:1;29142:59:0;-1:-1:-1;;;;;29220:16:0;;29212:61;;;;-1:-1:-1;;;29212:61:0;;19896:2:1;29212:61:0;;;19878:21:1;;;19915:18;;;19908:30;19974:34;19954:18;;;19947:62;20026:18;;29212:61:0;19694:356:1;29212:61:0;29305:1;29292:10;:14;29284:67;;;;-1:-1:-1;;;29284:67:0;;20257:2:1;29284:67:0;;;20239:21:1;20296:2;20276:18;;;20269:30;20335:34;20315:18;;;20308:62;-1:-1:-1;;;20386:18:1;;;20379:38;20434:19;;29284:67:0;20055:404:1;29284:67:0;29505:10;29482:19;;:33;;29474:89;;;;-1:-1:-1;;;29474:89:0;;20666:2:1;29474:89:0;;;20648:21:1;20705:2;20685:18;;;20678:30;20744:34;20724:18;;;20717:62;-1:-1:-1;;;20795:18:1;;;20788:41;20846:19;;29474:89:0;20464:407:1;29474:89:0;29617:19;;29584:30;29647:288;29667:10;29663:1;:14;29647:288;;;29724:15;29742:56;29768:2;29772:25;29742;:56::i;:::-;29724:74;;29827:40;29855:2;29859:7;29827:27;:40::i;:::-;29896:27;;;:::i;:::-;;;29684:251;29679:3;;;;:::i;:::-;;;29647:288;;;-1:-1:-1;29955:19:0;:47;;;-1:-1:-1;;;;;30013:13:0;;;;;;:9;:13;;;;;:27;;30030:10;;30013:13;:27;;30030:10;;30013:27;:::i;:::-;;;;-1:-1:-1;;;;;29064:984:0:o;34439:315::-;34594:8;-1:-1:-1;;;;;34585:17:0;:5;-1:-1:-1;;;;;34585:17:0;;34577:55;;;;-1:-1:-1;;;34577:55:0;;21219:2:1;34577:55:0;;;21201:21:1;21258:2;21238:18;;;21231:30;21297:27;21277:18;;;21270:55;21342:18;;34577:55:0;21017:349:1;34577:55:0;-1:-1:-1;;;;;34643:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;34643:46:0;;;;;;;;;;34705:41;;540::1;;;34705::0;;513:18:1;34705:41:0;;;;;;;34439:315;;;:::o;27450:::-;27607:28;27617:4;27623:2;27627:7;27607:9;:28::i;:::-;27654:48;27677:4;27683:2;27687:7;27696:5;27654:22;:48::i;:::-;27646:111;;;;-1:-1:-1;;;27646:111:0;;;;;;;:::i;48062:114::-;48122:13;48155;48148:20;;;;;:::i;494:723::-;550:13;771:5;780:1;771:10;767:53;;-1:-1:-1;;798:10:0;;;;;;;;;;;;-1:-1:-1;;;798:10:0;;;;;494:723::o;767:53::-;845:5;830:12;886:78;893:9;;886:78;;919:8;;;;:::i;:::-;;-1:-1:-1;942:10:0;;-1:-1:-1;950:2:0;942:10;;:::i;:::-;;;886:78;;;974:19;1006:6;996:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;996:17:0;;974:39;;1024:154;1031:10;;1024:154;;1058:11;1068:1;1058:11;;:::i;:::-;;-1:-1:-1;1127:10:0;1135:2;1127:5;:10;:::i;:::-;1114:24;;:2;:24;:::i;:::-;1101:39;;1084:6;1091;1084:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;1084:56:0;;;;;;;;-1:-1:-1;1155:11:0;1164:2;1155:11;;:::i;:::-;;;1024:154;;39392:296;39475:7;39518:4;39475:7;39533:118;39557:5;:12;39553:1;:16;39533:118;;;39606:33;39616:12;39630:5;39636:1;39630:8;;;;;;;;:::i;:::-;;;;;;;39606:9;:33::i;:::-;39591:48;-1:-1:-1;39571:3:0;;;;:::i;:::-;;;;39533:118;;;-1:-1:-1;39668:12:0;39392:296;-1:-1:-1;;;39392:296:0:o;30064:730::-;30179:7;;30307:2;30332:11;30366:12;30401:15;30439:16;30488;30503:1;30366:12;30488:16;:::i;:::-;30274:334;;;-1:-1:-1;;;;;22695:15:1;;;30274:334:0;;;22677:34:1;22727:18;;22720:34;;;;22770:18;;;22763:34;;;;22813:18;;;22806:34;22856:19;;;22849:35;30478:27:0;22900:19:1;;;22893:35;30536:4:0;22944:19:1;;;22937:44;22997:19;;;22990:35;;;22611:19;;30274:334:0;;;-1:-1:-1;;30274:334:0;;;;;;;;;30246:377;;30274:334;30246:377;;;;;-1:-1:-1;30224:410:0;30667:37;30679:25;30246:377;30667:37;:::i;:::-;30645:59;;30722:64;30747:11;30760:25;30722:24;:64::i;28729:327::-;28880:16;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28880:21:0;-1:-1:-1;;;;;28880:21:0;;;;;;;;28927:33;;28880:16;;;28927:33;;28880:16;;28927:33;28976:17;;28985:7;;-1:-1:-1;;;;;28976:17:0;;;;;;;;25117:155;;:::o;35319:799::-;35474:4;-1:-1:-1;;;;;35495:13:0;;4934:19;:23;35491:620;;35531:72;;-1:-1:-1;;;35531:72:0;;-1:-1:-1;;;;;35531:36:0;;;;;:72;;3295:10;;35582:4;;35588:7;;35597:5;;35531:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35531:72:0;;;;;;;;-1:-1:-1;;35531:72:0;;;;;;;;;;;;:::i;:::-;;;35527:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35773:6;:13;35790:1;35773:18;35769:272;;35816:60;;-1:-1:-1;;;35816:60:0;;;;;;;:::i;35769:272::-;35991:6;35985:13;35976:6;35972:2;35968:15;35961:38;35527:529;-1:-1:-1;;;;;;35654:51:0;-1:-1:-1;;;35654:51:0;;-1:-1:-1;35647:58:0;;35491:620;-1:-1:-1;36095:4:0;35319:799;;;;;;:::o;45599:149::-;45662:7;45693:1;45689;:5;:51;;45824:13;45918:15;;;45954:4;45947:15;;;46001:4;45985:21;;45689:51;;;-1:-1:-1;45824:13:0;45918:15;;;45954:4;45947:15;46001:4;45985:21;;;45599:149::o;30912:1441::-;31034:7;31080:28;;;:16;:28;;;;;;31034:7;31148:15;;;31144:292;;-1:-1:-1;31261:10:0;31144:292;;;-1:-1:-1;31414:10:0;31144:292;31448:17;31468:29;31496:1;31468:25;:29;:::i;:::-;31448:49;;31526:9;31512:10;:23;31508:804;;31759:22;31784:27;;;:16;:27;;;;;;;31830:19;;;31826:475;;31946:28;;;;:16;:28;;;;;:40;;;31826:475;;;32132:28;;;;:16;:28;;;;;;:45;;;32258:27;;;;;32251:34;31826:475;31537:775;31508:804;-1:-1:-1;32339:6:0;30912:1441;-1:-1:-1;;;;30912:1441:0:o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:127::-;653:10;648:3;644:20;641:1;634:31;684:4;681:1;674:15;708:4;705:1;698:15;724:275;795:2;789:9;860:2;841:13;;-1:-1:-1;;837:27:1;825:40;;895:18;880:34;;916:22;;;877:62;874:88;;;942:18;;:::i;:::-;978:2;971:22;724:275;;-1:-1:-1;724:275:1:o;1004:712::-;1058:5;1111:3;1104:4;1096:6;1092:17;1088:27;1078:55;;1129:1;1126;1119:12;1078:55;1165:6;1152:20;1191:4;1214:18;1210:2;1207:26;1204:52;;;1236:18;;:::i;:::-;1282:2;1279:1;1275:10;1305:28;1329:2;1325;1321:11;1305:28;:::i;:::-;1367:15;;;1437;;;1433:24;;;1398:12;;;;1469:15;;;1466:35;;;1497:1;1494;1487:12;1466:35;1533:2;1525:6;1521:15;1510:26;;1545:142;1561:6;1556:3;1553:15;1545:142;;;1627:17;;1615:30;;1578:12;;;;1665;;;;1545:142;;;1705:5;1004:712;-1:-1:-1;;;;;;;1004:712:1:o;1721:173::-;1789:20;;-1:-1:-1;;;;;1838:31:1;;1828:42;;1818:70;;1884:1;1881;1874:12;1818:70;1721:173;;;:::o;1899:490::-;2001:6;2009;2017;2070:2;2058:9;2049:7;2045:23;2041:32;2038:52;;;2086:1;2083;2076:12;2038:52;2126:9;2113:23;2159:18;2151:6;2148:30;2145:50;;;2191:1;2188;2181:12;2145:50;2214:61;2267:7;2258:6;2247:9;2243:22;2214:61;:::i;:::-;2204:71;;;2322:2;2311:9;2307:18;2294:32;2284:42;;2345:38;2379:2;2368:9;2364:18;2345:38;:::i;:::-;2335:48;;1899:490;;;;;:::o;2394:250::-;2479:1;2489:113;2503:6;2500:1;2497:13;2489:113;;;2579:11;;;2573:18;2560:11;;;2553:39;2525:2;2518:10;2489:113;;;-1:-1:-1;;2636:1:1;2618:16;;2611:27;2394:250::o;2649:271::-;2691:3;2729:5;2723:12;2756:6;2751:3;2744:19;2772:76;2841:6;2834:4;2829:3;2825:14;2818:4;2811:5;2807:16;2772:76;:::i;:::-;2902:2;2881:15;-1:-1:-1;;2877:29:1;2868:39;;;;2909:4;2864:50;;2649:271;-1:-1:-1;;2649:271:1:o;2925:220::-;3074:2;3063:9;3056:21;3037:4;3094:45;3135:2;3124:9;3120:18;3112:6;3094:45;:::i;3150:180::-;3209:6;3262:2;3250:9;3241:7;3237:23;3233:32;3230:52;;;3278:1;3275;3268:12;3230:52;-1:-1:-1;3301:23:1;;3150:180;-1:-1:-1;3150:180:1:o;3543:254::-;3611:6;3619;3672:2;3660:9;3651:7;3647:23;3643:32;3640:52;;;3688:1;3685;3678:12;3640:52;3711:29;3730:9;3711:29;:::i;:::-;3701:39;3787:2;3772:18;;;;3759:32;;-1:-1:-1;;;3543:254:1:o;3802:186::-;3861:6;3914:2;3902:9;3893:7;3889:23;3885:32;3882:52;;;3930:1;3927;3920:12;3882:52;3953:29;3972:9;3953:29;:::i;4175:328::-;4252:6;4260;4268;4321:2;4309:9;4300:7;4296:23;4292:32;4289:52;;;4337:1;4334;4327:12;4289:52;4360:29;4379:9;4360:29;:::i;:::-;4350:39;;4408:38;4442:2;4431:9;4427:18;4408:38;:::i;:::-;4398:48;;4493:2;4482:9;4478:18;4465:32;4455:42;;4175:328;;;;;:::o;4690:348::-;4774:6;4827:2;4815:9;4806:7;4802:23;4798:32;4795:52;;;4843:1;4840;4833:12;4795:52;4883:9;4870:23;4916:18;4908:6;4905:30;4902:50;;;4948:1;4945;4938:12;4902:50;4971:61;5024:7;5015:6;5004:9;5000:22;4971:61;:::i;5043:592::-;5114:6;5122;5175:2;5163:9;5154:7;5150:23;5146:32;5143:52;;;5191:1;5188;5181:12;5143:52;5231:9;5218:23;5260:18;5301:2;5293:6;5290:14;5287:34;;;5317:1;5314;5307:12;5287:34;5355:6;5344:9;5340:22;5330:32;;5400:7;5393:4;5389:2;5385:13;5381:27;5371:55;;5422:1;5419;5412:12;5371:55;5462:2;5449:16;5488:2;5480:6;5477:14;5474:34;;;5504:1;5501;5494:12;5474:34;5549:7;5544:2;5535:6;5531:2;5527:15;5523:24;5520:37;5517:57;;;5570:1;5567;5560:12;5517:57;5601:2;5593:11;;;;;5623:6;;-1:-1:-1;5043:592:1;;-1:-1:-1;;;;5043:592:1:o;5825:248::-;5893:6;5901;5954:2;5942:9;5933:7;5929:23;5925:32;5922:52;;;5970:1;5967;5960:12;5922:52;-1:-1:-1;;5993:23:1;;;6063:2;6048:18;;;6035:32;;-1:-1:-1;5825:248:1:o;6078:347::-;6143:6;6151;6204:2;6192:9;6183:7;6179:23;6175:32;6172:52;;;6220:1;6217;6210:12;6172:52;6243:29;6262:9;6243:29;:::i;:::-;6233:39;;6322:2;6311:9;6307:18;6294:32;6369:5;6362:13;6355:21;6348:5;6345:32;6335:60;;6391:1;6388;6381:12;6335:60;6414:5;6404:15;;;6078:347;;;;;:::o;6430:980::-;6525:6;6533;6541;6549;6602:3;6590:9;6581:7;6577:23;6573:33;6570:53;;;6619:1;6616;6609:12;6570:53;6642:29;6661:9;6642:29;:::i;:::-;6632:39;;6690:2;6711:38;6745:2;6734:9;6730:18;6711:38;:::i;:::-;6701:48;;6796:2;6785:9;6781:18;6768:32;6758:42;;6851:2;6840:9;6836:18;6823:32;6874:18;6915:2;6907:6;6904:14;6901:34;;;6931:1;6928;6921:12;6901:34;6969:6;6958:9;6954:22;6944:32;;7014:7;7007:4;7003:2;6999:13;6995:27;6985:55;;7036:1;7033;7026:12;6985:55;7072:2;7059:16;7094:2;7090;7087:10;7084:36;;;7100:18;;:::i;:::-;7142:53;7185:2;7166:13;;-1:-1:-1;;7162:27:1;7158:36;;7142:53;:::i;:::-;7129:66;;7218:2;7211:5;7204:17;7258:7;7253:2;7248;7244;7240:11;7236:20;7233:33;7230:53;;;7279:1;7276;7269:12;7230:53;7334:2;7329;7325;7321:11;7316:2;7309:5;7305:14;7292:45;7378:1;7373:2;7368;7361:5;7357:14;7353:23;7346:34;;7399:5;7389:15;;;;;6430:980;;;;;;;:::o;7415:260::-;7483:6;7491;7544:2;7532:9;7523:7;7519:23;7515:32;7512:52;;;7560:1;7557;7550:12;7512:52;7583:29;7602:9;7583:29;:::i;:::-;7573:39;;7631:38;7665:2;7654:9;7650:18;7631:38;:::i;:::-;7621:48;;7415:260;;;;;:::o;7914:380::-;7993:1;7989:12;;;;8036;;;8057:61;;8111:4;8103:6;8099:17;8089:27;;8057:61;8164:2;8156:6;8153:14;8133:18;8130:38;8127:161;;8210:10;8205:3;8201:20;8198:1;8191:31;8245:4;8242:1;8235:15;8273:4;8270:1;8263:15;8127:161;;7914:380;;;:::o;9884:332::-;10086:2;10068:21;;;10125:1;10105:18;;;10098:29;-1:-1:-1;;;10158:2:1;10143:18;;10136:39;10207:2;10192:18;;9884:332::o;10221:127::-;10282:10;10277:3;10273:20;10270:1;10263:31;10313:4;10310:1;10303:15;10337:4;10334:1;10327:15;10353:128;10420:9;;;10441:11;;;10438:37;;;10455:18;;:::i;10486:413::-;10688:2;10670:21;;;10727:2;10707:18;;;10700:30;10766:34;10761:2;10746:18;;10739:62;-1:-1:-1;;;10832:2:1;10817:18;;10810:47;10889:3;10874:19;;10486:413::o;12676:135::-;12715:3;12736:17;;;12733:43;;12756:18;;:::i;:::-;-1:-1:-1;12803:1:1;12792:13;;12676:135::o;13284:545::-;13386:2;13381:3;13378:11;13375:448;;;13422:1;13447:5;13443:2;13436:17;13492:4;13488:2;13478:19;13562:2;13550:10;13546:19;13543:1;13539:27;13533:4;13529:38;13598:4;13586:10;13583:20;13580:47;;;-1:-1:-1;13621:4:1;13580:47;13676:2;13671:3;13667:12;13664:1;13660:20;13654:4;13650:31;13640:41;;13731:82;13749:2;13742:5;13739:13;13731:82;;;13794:17;;;13775:1;13764:13;13731:82;;;13735:3;;;13284:545;;;:::o;14005:1206::-;14129:18;14124:3;14121:27;14118:53;;;14151:18;;:::i;:::-;14180:94;14270:3;14230:38;14262:4;14256:11;14230:38;:::i;:::-;14224:4;14180:94;:::i;:::-;14300:1;14325:2;14320:3;14317:11;14342:1;14337:616;;;;14997:1;15014:3;15011:93;;;-1:-1:-1;15070:19:1;;;15057:33;15011:93;-1:-1:-1;;13962:1:1;13958:11;;;13954:24;13950:29;13940:40;13986:1;13982:11;;;13937:57;15117:78;;14310:895;;14337:616;13231:1;13224:14;;;13268:4;13255:18;;-1:-1:-1;;14373:17:1;;;14474:9;14496:229;14510:7;14507:1;14504:14;14496:229;;;14599:19;;;14586:33;14571:49;;14706:4;14691:20;;;;14659:1;14647:14;;;;14526:12;14496:229;;;14500:3;14753;14744:7;14741:16;14738:159;;;14877:1;14873:6;14867:3;14861;14858:1;14854:11;14850:21;14846:34;14842:39;14829:9;14824:3;14820:19;14807:33;14803:79;14795:6;14788:95;14738:159;;;14940:1;14934:3;14931:1;14927:11;14923:19;14917:4;14910:33;14310:895;;;14005:1206;;;:::o;16801:496::-;16980:3;17018:6;17012:13;17034:66;17093:6;17088:3;17081:4;17073:6;17069:17;17034:66;:::i;:::-;17163:13;;17122:16;;;;17185:70;17163:13;17122:16;17232:4;17220:17;;17185:70;:::i;:::-;17271:20;;16801:496;-1:-1:-1;;;;16801:496:1:o;19214:125::-;19279:9;;;19300:10;;;19297:36;;;19313:18;;:::i;20876:136::-;20915:3;20943:5;20933:39;;20952:18;;:::i;:::-;-1:-1:-1;;;20988:18:1;;20876:136::o;21371:414::-;21573:2;21555:21;;;21612:2;21592:18;;;21585:30;21651:34;21646:2;21631:18;;21624:62;-1:-1:-1;;;21717:2:1;21702:18;;21695:48;21775:3;21760:19;;21371:414::o;21790:127::-;21851:10;21846:3;21842:20;21839:1;21832:31;21882:4;21879:1;21872:15;21906:4;21903:1;21896:15;21922:120;21962:1;21988;21978:35;;21993:18;;:::i;:::-;-1:-1:-1;22027:9:1;;21922:120::o;22047:112::-;22079:1;22105;22095:35;;22110:18;;:::i;:::-;-1:-1:-1;22144:9:1;;22047:112::o;22164:127::-;22225:10;22220:3;22216:20;22213:1;22206:31;22256:4;22253:1;22246:15;22280:4;22277:1;22270:15;23036:489;-1:-1:-1;;;;;23305:15:1;;;23287:34;;23357:15;;23352:2;23337:18;;23330:43;23404:2;23389:18;;23382:34;;;23452:3;23447:2;23432:18;;23425:31;;;23230:4;;23473:46;;23499:19;;23491:6;23473:46;:::i;:::-;23465:54;23036:489;-1:-1:-1;;;;;;23036:489:1:o;23530:249::-;23599:6;23652:2;23640:9;23631:7;23627:23;23623:32;23620:52;;;23668:1;23665;23658:12;23620:52;23700:9;23694:16;23719:30;23743:5;23719:30;:::i

Swarm Source

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