ETH Price: $2,744.89 (-0.73%)

Token

EvilGeniusScienceClub (EGSC)
 

Overview

Max Total Supply

178 EGSC

Holders

117

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 EGSC
0x5b9ddceb15ee855fc54640b3179278eaa5a7a9c9
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The Evil Genius Science Club is a generative collection of mad scientist characters with hand-drawn assets masterminded by cartoonist Jordan Lyric. Each one has a completely unique combination of traits with over 100 million possibilities!

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
EvilGeniusScienceClub

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-12
*/

// Sources flattened with hardhat v2.6.1 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]



pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]



pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]



pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]



pragma solidity ^0.8.0;







/**
 * @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, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view 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 overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public 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 = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

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

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @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(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        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);
    }

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]



pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]



pragma solidity ^0.8.0;


/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

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

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}


// File @openzeppelin/contracts/utils/math/[email protected]



pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


// File @openzeppelin/contracts/access/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File contracts/EvilGenius.sol



pragma solidity ^0.8.0;



contract EvilGeniusScienceClub is ERC721Enumerable, Ownable {

    using SafeMath for uint256;

    string public _baseTokenURI;
    uint256 public _price = 50000000000000000; // 0.05 Ether
    uint256 public _maxSupply = 10000;
    bool public _saleIsActive = false;

    address a1 = 0x55c3B3D49bdeFC4DC52667C4eA7c6Ce5089e08Ed;
    address a2 = 0x59c9485F0aB5ebe30D646A6c00a477F110758640;
    address a3 = 0xA4754D6c8905AA776692bc60732F92911EA1fCa2;

    constructor(string memory baseURI) ERC721("EvilGeniusScienceClub", "EGSC") {
        setBaseURI(baseURI);
    }

    function giveawayTokensMint() public onlyOwner {
        uint256 supply = totalSupply();

        require(supply == 0, "token_supply_not_zero");

        for (uint256 i = 0; i < 30; i++) {
            if (i < 10) {
                _safeMint(a1, i);
            }
            else if (i < 20) {
                _safeMint(a2, i);
            }
            else if (i < 30) {
                _safeMint(a3, i);
            }
        }
    }

    function mint(uint256 mintCount) public payable {
        uint256 supply = totalSupply();

        require(_saleIsActive,                      "sale_not_active");
        require(mintCount <= 20,                    "max_mint_count_exceeded");
        require(supply + mintCount <= _maxSupply,   "max_token_supply_exceeded");
        require(msg.value >= _price * mintCount,    "insufficient_payment_value");

        for (uint256 i = 0; i < mintCount; i++) {
            _safeMint(msg.sender, supply + i);
        }
    }

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

    function setBaseURI(string memory baseURI) public onlyOwner {
        _baseTokenURI = baseURI;
    }

    function setPrice(uint256 price) public onlyOwner {
        _price = price;
    }

    function saleStart() public onlyOwner {
        _saleIsActive = true;
    }

    function saleStop() public onlyOwner {
        _saleIsActive = false;
    }

    function tokensOfOwner(address owner) public view returns (uint256[] memory) {
        uint256 tokenCount = balanceOf(owner);
        uint256[] memory tokenIds = new uint256[](tokenCount);
        for (uint256 i = 0; i < tokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(owner, i);
        }
        return tokenIds;
    }

    function withdrawAll() public payable onlyOwner {
        uint256 _each = address(this).balance / 3;
        require(payable(a1).send(_each));
        require(payable(a2).send(_each));
        require(payable(a3).send(_each));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giveawayTokensMint","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":[{"internalType":"uint256","name":"mintCount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

608060405266b1a2bc2ec50000600c55612710600d556000600e60006101000a81548160ff0219169083151502179055507355c3b3d49bdefc4dc52667c4ea7c6ce5089e08ed600e60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507359c9485f0ab5ebe30d646a6c00a477f110758640600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073a4754d6c8905aa776692bc60732f92911ea1fca2601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200013c57600080fd5b5060405162004b5838038062004b588339818101604052810190620001629190620004ff565b6040518060400160405280601581526020017f4576696c47656e697573536369656e6365436c756200000000000000000000008152506040518060400160405280600481526020017f45475343000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001e6929190620003dd565b508060019080519060200190620001ff929190620003dd565b50505062000222620002166200023a60201b60201c565b6200024260201b60201c565b62000233816200030860201b60201c565b5062000737565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003186200023a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200033e620003b360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000397576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200038e906200056b565b60405180910390fd5b80600b9080519060200190620003af929190620003dd565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003eb9062000633565b90600052602060002090601f0160209004810192826200040f57600085556200045b565b82601f106200042a57805160ff19168380011785556200045b565b828001600101855582156200045b579182015b828111156200045a5782518255916020019190600101906200043d565b5b5090506200046a91906200046e565b5090565b5b80821115620004895760008160009055506001016200046f565b5090565b6000620004a46200049e84620005b6565b6200058d565b905082815260208101848484011115620004bd57600080fd5b620004ca848285620005fd565b509392505050565b600082601f830112620004e457600080fd5b8151620004f68482602086016200048d565b91505092915050565b6000602082840312156200051257600080fd5b600082015167ffffffffffffffff8111156200052d57600080fd5b6200053b84828501620004d2565b91505092915050565b600062000553602083620005ec565b915062000560826200070e565b602082019050919050565b60006020820190508181036000830152620005868162000544565b9050919050565b600062000599620005ac565b9050620005a7828262000669565b919050565b6000604051905090565b600067ffffffffffffffff821115620005d457620005d3620006ce565b5b620005df82620006fd565b9050602081019050919050565b600082825260208201905092915050565b60005b838110156200061d57808201518184015260208101905062000600565b838111156200062d576000848401525b50505050565b600060028204905060018216806200064c57607f821691505b602082108114156200066357620006626200069f565b5b50919050565b6200067482620006fd565b810181811067ffffffffffffffff82111715620006965762000695620006ce565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b61441180620007476000396000f3fe6080604052600436106101d85760003560e01c8063715018a611610102578063a22cb46511610095578063c87b56dd11610064578063c87b56dd14610656578063cfc86f7b14610693578063e985e9c5146106be578063f2fde38b146106fb576101d8565b8063a22cb465146105d6578063ab0bcc41146105ff578063b4b6961314610616578063b88d4fde1461062d576101d8565b80638da5cb5b116100d15780638da5cb5b1461053b57806391b7f5ed1461056657806395d89b411461058f578063a0712d68146105ba576101d8565b8063715018a6146104c65780638078059c146104dd5780638462151c146104f4578063853828b614610531576101d8565b806323b872dd1161017a57806355f804b31161014957806355f804b3146103f85780635d893ba0146104215780636352211e1461044c57806370a0823114610489576101d8565b806323b872dd1461032c5780632f745c591461035557806342842e0e146103925780634f6ccce7146103bb576101d8565b8063095ea7b3116101b6578063095ea7b31461028257806318160ddd146102ab57806322f4596f146102d6578063235b6ea114610301576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190613029565b610724565b604051610211919061360c565b60405180910390f35b34801561022657600080fd5b5061022f61079e565b60405161023c9190613627565b60405180910390f35b34801561025157600080fd5b5061026c600480360381019061026791906130bc565b610830565b6040516102799190613583565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a49190612fed565b6108b5565b005b3480156102b757600080fd5b506102c06109cd565b6040516102cd9190613929565b60405180910390f35b3480156102e257600080fd5b506102eb6109da565b6040516102f89190613929565b60405180910390f35b34801561030d57600080fd5b506103166109e0565b6040516103239190613929565b60405180910390f35b34801561033857600080fd5b50610353600480360381019061034e9190612ee7565b6109e6565b005b34801561036157600080fd5b5061037c60048036038101906103779190612fed565b610a46565b6040516103899190613929565b60405180910390f35b34801561039e57600080fd5b506103b960048036038101906103b49190612ee7565b610aeb565b005b3480156103c757600080fd5b506103e260048036038101906103dd91906130bc565b610b0b565b6040516103ef9190613929565b60405180910390f35b34801561040457600080fd5b5061041f600480360381019061041a919061307b565b610ba2565b005b34801561042d57600080fd5b50610436610c38565b604051610443919061360c565b60405180910390f35b34801561045857600080fd5b50610473600480360381019061046e91906130bc565b610c4b565b6040516104809190613583565b60405180910390f35b34801561049557600080fd5b506104b060048036038101906104ab9190612e82565b610cfd565b6040516104bd9190613929565b60405180910390f35b3480156104d257600080fd5b506104db610db5565b005b3480156104e957600080fd5b506104f2610e3d565b005b34801561050057600080fd5b5061051b60048036038101906105169190612e82565b610ed6565b60405161052891906135ea565b60405180910390f35b610539610fd0565b005b34801561054757600080fd5b50610550611180565b60405161055d9190613583565b60405180910390f35b34801561057257600080fd5b5061058d600480360381019061058891906130bc565b6111aa565b005b34801561059b57600080fd5b506105a4611230565b6040516105b19190613627565b60405180910390f35b6105d460048036038101906105cf91906130bc565b6112c2565b005b3480156105e257600080fd5b506105fd60048036038101906105f89190612fb1565b611439565b005b34801561060b57600080fd5b506106146115ba565b005b34801561062257600080fd5b5061062b611653565b005b34801561063957600080fd5b50610654600480360381019061064f9190612f36565b6117ed565b005b34801561066257600080fd5b5061067d600480360381019061067891906130bc565b61184f565b60405161068a9190613627565b60405180910390f35b34801561069f57600080fd5b506106a86118f6565b6040516106b59190613627565b60405180910390f35b3480156106ca57600080fd5b506106e560048036038101906106e09190612eab565b611984565b6040516106f2919061360c565b60405180910390f35b34801561070757600080fd5b50610722600480360381019061071d9190612e82565b611a18565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610797575061079682611b10565b5b9050919050565b6060600080546107ad90613c12565b80601f01602080910402602001604051908101604052809291908181526020018280546107d990613c12565b80156108265780601f106107fb57610100808354040283529160200191610826565b820191906000526020600020905b81548152906001019060200180831161080957829003601f168201915b5050505050905090565b600061083b82611bf2565b61087a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087190613809565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108c082610c4b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610931576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092890613889565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610950611c5e565b73ffffffffffffffffffffffffffffffffffffffff16148061097f575061097e81610979611c5e565b611984565b5b6109be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b590613729565b60405180910390fd5b6109c88383611c66565b505050565b6000600880549050905090565b600d5481565b600c5481565b6109f76109f1611c5e565b82611d1f565b610a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2d906138c9565b60405180910390fd5b610a41838383611dfd565b505050565b6000610a5183610cfd565b8210610a92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8990613649565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b06838383604051806020016040528060008152506117ed565b505050565b6000610b156109cd565b8210610b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4d90613909565b60405180910390fd5b60088281548110610b90577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610baa611c5e565b73ffffffffffffffffffffffffffffffffffffffff16610bc8611180565b73ffffffffffffffffffffffffffffffffffffffff1614610c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1590613829565b60405180910390fd5b80600b9080519060200190610c34929190612ca6565b5050565b600e60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb90613769565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6590613749565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610dbd611c5e565b73ffffffffffffffffffffffffffffffffffffffff16610ddb611180565b73ffffffffffffffffffffffffffffffffffffffff1614610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2890613829565b60405180910390fd5b610e3b6000612059565b565b610e45611c5e565b73ffffffffffffffffffffffffffffffffffffffff16610e63611180565b73ffffffffffffffffffffffffffffffffffffffff1614610eb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb090613829565b60405180910390fd5b6000600e60006101000a81548160ff021916908315150217905550565b60606000610ee383610cfd565b905060008167ffffffffffffffff811115610f27577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610f555781602001602082028036833780820191505090505b50905060005b82811015610fc557610f6d8582610a46565b828281518110610fa6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610fbd90613c75565b915050610f5b565b508092505050919050565b610fd8611c5e565b73ffffffffffffffffffffffffffffffffffffffff16610ff6611180565b73ffffffffffffffffffffffffffffffffffffffff161461104c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104390613829565b60405180910390fd5b600060034761105b9190613a9d565b9050600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050506110bd57600080fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505061111d57600080fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505061117d57600080fd5b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6111b2611c5e565b73ffffffffffffffffffffffffffffffffffffffff166111d0611180565b73ffffffffffffffffffffffffffffffffffffffff1614611226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121d90613829565b60405180910390fd5b80600c8190555050565b60606001805461123f90613c12565b80601f016020809104026020016040519081016040528092919081815260200182805461126b90613c12565b80156112b85780601f1061128d576101008083540402835291602001916112b8565b820191906000526020600020905b81548152906001019060200180831161129b57829003601f168201915b5050505050905090565b60006112cc6109cd565b9050600e60009054906101000a900460ff1661131d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611314906137a9565b60405180910390fd5b6014821115611361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135890613789565b60405180910390fd5b600d5482826113709190613a47565b11156113b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a8906138e9565b60405180910390fd5b81600c546113bf9190613ace565b341015611401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f8906138a9565b60405180910390fd5b60005b828110156114345761142133828461141c9190613a47565b61211f565b808061142c90613c75565b915050611404565b505050565b611441611c5e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a6906136e9565b60405180910390fd5b80600560006114bc611c5e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611569611c5e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115ae919061360c565b60405180910390a35050565b6115c2611c5e565b73ffffffffffffffffffffffffffffffffffffffff166115e0611180565b73ffffffffffffffffffffffffffffffffffffffff1614611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d90613829565b60405180910390fd5b6001600e60006101000a81548160ff021916908315150217905550565b61165b611c5e565b73ffffffffffffffffffffffffffffffffffffffff16611679611180565b73ffffffffffffffffffffffffffffffffffffffff16146116cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c690613829565b60405180910390fd5b60006116d96109cd565b90506000811461171e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611715906137c9565b60405180910390fd5b60005b601e8110156117e957600a8110156117645761175f600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261211f565b6117d6565b601481101561179e57611799600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261211f565b6117d5565b601e8110156117d4576117d3601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261211f565b5b5b5b80806117e190613c75565b915050611721565b5050565b6117fe6117f8611c5e565b83611d1f565b61183d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611834906138c9565b60405180910390fd5b6118498484848461213d565b50505050565b606061185a82611bf2565b611899576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189090613869565b60405180910390fd5b60006118a3612199565b905060008151116118c357604051806020016040528060008152506118ee565b806118cd8461222b565b6040516020016118de92919061355f565b6040516020818303038152906040525b915050919050565b600b805461190390613c12565b80601f016020809104026020016040519081016040528092919081815260200182805461192f90613c12565b801561197c5780601f106119515761010080835404028352916020019161197c565b820191906000526020600020905b81548152906001019060200180831161195f57829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a20611c5e565b73ffffffffffffffffffffffffffffffffffffffff16611a3e611180565b73ffffffffffffffffffffffffffffffffffffffff1614611a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8b90613829565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afb90613689565b60405180910390fd5b611b0d81612059565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611bdb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611beb5750611bea826123d8565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611cd983610c4b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d2a82611bf2565b611d69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6090613709565b60405180910390fd5b6000611d7483610c4b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611de357508373ffffffffffffffffffffffffffffffffffffffff16611dcb84610830565b73ffffffffffffffffffffffffffffffffffffffff16145b80611df45750611df38185611984565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e1d82610c4b565b73ffffffffffffffffffffffffffffffffffffffff1614611e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6a90613849565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eda906136c9565b60405180910390fd5b611eee838383612442565b611ef9600082611c66565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f499190613b28565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fa09190613a47565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612139828260405180602001604052806000815250612556565b5050565b612148848484611dfd565b612154848484846125b1565b612193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218a90613669565b60405180910390fd5b50505050565b6060600b80546121a890613c12565b80601f01602080910402602001604051908101604052809291908181526020018280546121d490613c12565b80156122215780601f106121f657610100808354040283529160200191612221565b820191906000526020600020905b81548152906001019060200180831161220457829003601f168201915b5050505050905090565b60606000821415612273576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123d3565b600082905060005b600082146122a557808061228e90613c75565b915050600a8261229e9190613a9d565b915061227b565b60008167ffffffffffffffff8111156122e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123195781602001600182028036833780820191505090505b5090505b600085146123cc576001826123329190613b28565b9150600a856123419190613cbe565b603061234d9190613a47565b60f81b818381518110612389577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123c59190613a9d565b945061231d565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61244d838383612748565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124905761248b8161274d565b6124cf565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124ce576124cd8382612796565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125125761250d81612903565b612551565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146125505761254f8282612a46565b5b5b505050565b6125608383612ac5565b61256d60008484846125b1565b6125ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a390613669565b60405180910390fd5b505050565b60006125d28473ffffffffffffffffffffffffffffffffffffffff16612c93565b1561273b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125fb611c5e565b8786866040518563ffffffff1660e01b815260040161261d949392919061359e565b602060405180830381600087803b15801561263757600080fd5b505af192505050801561266857506040513d601f19601f820116820180604052508101906126659190613052565b60015b6126eb573d8060008114612698576040519150601f19603f3d011682016040523d82523d6000602084013e61269d565b606091505b506000815114156126e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126da90613669565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612740565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016127a384610cfd565b6127ad9190613b28565b9050600060076000848152602001908152602001600020549050818114612892576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506129179190613b28565b905060006009600084815260200190815260200160002054905060006008838154811061296d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106129b5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612a2a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612a5183610cfd565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2c906137e9565b60405180910390fd5b612b3e81611bf2565b15612b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b75906136a9565b60405180910390fd5b612b8a60008383612442565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bda9190613a47565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612cb290613c12565b90600052602060002090601f016020900481019282612cd45760008555612d1b565b82601f10612ced57805160ff1916838001178555612d1b565b82800160010185558215612d1b579182015b82811115612d1a578251825591602001919060010190612cff565b5b509050612d289190612d2c565b5090565b5b80821115612d45576000816000905550600101612d2d565b5090565b6000612d5c612d5784613969565b613944565b905082815260208101848484011115612d7457600080fd5b612d7f848285613bd0565b509392505050565b6000612d9a612d958461399a565b613944565b905082815260208101848484011115612db257600080fd5b612dbd848285613bd0565b509392505050565b600081359050612dd48161437f565b92915050565b600081359050612de981614396565b92915050565b600081359050612dfe816143ad565b92915050565b600081519050612e13816143ad565b92915050565b600082601f830112612e2a57600080fd5b8135612e3a848260208601612d49565b91505092915050565b600082601f830112612e5457600080fd5b8135612e64848260208601612d87565b91505092915050565b600081359050612e7c816143c4565b92915050565b600060208284031215612e9457600080fd5b6000612ea284828501612dc5565b91505092915050565b60008060408385031215612ebe57600080fd5b6000612ecc85828601612dc5565b9250506020612edd85828601612dc5565b9150509250929050565b600080600060608486031215612efc57600080fd5b6000612f0a86828701612dc5565b9350506020612f1b86828701612dc5565b9250506040612f2c86828701612e6d565b9150509250925092565b60008060008060808587031215612f4c57600080fd5b6000612f5a87828801612dc5565b9450506020612f6b87828801612dc5565b9350506040612f7c87828801612e6d565b925050606085013567ffffffffffffffff811115612f9957600080fd5b612fa587828801612e19565b91505092959194509250565b60008060408385031215612fc457600080fd5b6000612fd285828601612dc5565b9250506020612fe385828601612dda565b9150509250929050565b6000806040838503121561300057600080fd5b600061300e85828601612dc5565b925050602061301f85828601612e6d565b9150509250929050565b60006020828403121561303b57600080fd5b600061304984828501612def565b91505092915050565b60006020828403121561306457600080fd5b600061307284828501612e04565b91505092915050565b60006020828403121561308d57600080fd5b600082013567ffffffffffffffff8111156130a757600080fd5b6130b384828501612e43565b91505092915050565b6000602082840312156130ce57600080fd5b60006130dc84828501612e6d565b91505092915050565b60006130f18383613541565b60208301905092915050565b61310681613b5c565b82525050565b6000613117826139db565b6131218185613a09565b935061312c836139cb565b8060005b8381101561315d57815161314488826130e5565b975061314f836139fc565b925050600181019050613130565b5085935050505092915050565b61317381613b6e565b82525050565b6000613184826139e6565b61318e8185613a1a565b935061319e818560208601613bdf565b6131a781613dab565b840191505092915050565b60006131bd826139f1565b6131c78185613a2b565b93506131d7818560208601613bdf565b6131e081613dab565b840191505092915050565b60006131f6826139f1565b6132008185613a3c565b9350613210818560208601613bdf565b80840191505092915050565b6000613229602b83613a2b565b915061323482613dbc565b604082019050919050565b600061324c603283613a2b565b915061325782613e0b565b604082019050919050565b600061326f602683613a2b565b915061327a82613e5a565b604082019050919050565b6000613292601c83613a2b565b915061329d82613ea9565b602082019050919050565b60006132b5602483613a2b565b91506132c082613ed2565b604082019050919050565b60006132d8601983613a2b565b91506132e382613f21565b602082019050919050565b60006132fb602c83613a2b565b915061330682613f4a565b604082019050919050565b600061331e603883613a2b565b915061332982613f99565b604082019050919050565b6000613341602a83613a2b565b915061334c82613fe8565b604082019050919050565b6000613364602983613a2b565b915061336f82614037565b604082019050919050565b6000613387601783613a2b565b915061339282614086565b602082019050919050565b60006133aa600f83613a2b565b91506133b5826140af565b602082019050919050565b60006133cd601583613a2b565b91506133d8826140d8565b602082019050919050565b60006133f0602083613a2b565b91506133fb82614101565b602082019050919050565b6000613413602c83613a2b565b915061341e8261412a565b604082019050919050565b6000613436602083613a2b565b915061344182614179565b602082019050919050565b6000613459602983613a2b565b9150613464826141a2565b604082019050919050565b600061347c602f83613a2b565b9150613487826141f1565b604082019050919050565b600061349f602183613a2b565b91506134aa82614240565b604082019050919050565b60006134c2601a83613a2b565b91506134cd8261428f565b602082019050919050565b60006134e5603183613a2b565b91506134f0826142b8565b604082019050919050565b6000613508601983613a2b565b915061351382614307565b602082019050919050565b600061352b602c83613a2b565b915061353682614330565b604082019050919050565b61354a81613bc6565b82525050565b61355981613bc6565b82525050565b600061356b82856131eb565b915061357782846131eb565b91508190509392505050565b600060208201905061359860008301846130fd565b92915050565b60006080820190506135b360008301876130fd565b6135c060208301866130fd565b6135cd6040830185613550565b81810360608301526135df8184613179565b905095945050505050565b60006020820190508181036000830152613604818461310c565b905092915050565b6000602082019050613621600083018461316a565b92915050565b6000602082019050818103600083015261364181846131b2565b905092915050565b600060208201905081810360008301526136628161321c565b9050919050565b600060208201905081810360008301526136828161323f565b9050919050565b600060208201905081810360008301526136a281613262565b9050919050565b600060208201905081810360008301526136c281613285565b9050919050565b600060208201905081810360008301526136e2816132a8565b9050919050565b60006020820190508181036000830152613702816132cb565b9050919050565b60006020820190508181036000830152613722816132ee565b9050919050565b6000602082019050818103600083015261374281613311565b9050919050565b6000602082019050818103600083015261376281613334565b9050919050565b6000602082019050818103600083015261378281613357565b9050919050565b600060208201905081810360008301526137a28161337a565b9050919050565b600060208201905081810360008301526137c28161339d565b9050919050565b600060208201905081810360008301526137e2816133c0565b9050919050565b60006020820190508181036000830152613802816133e3565b9050919050565b6000602082019050818103600083015261382281613406565b9050919050565b6000602082019050818103600083015261384281613429565b9050919050565b600060208201905081810360008301526138628161344c565b9050919050565b600060208201905081810360008301526138828161346f565b9050919050565b600060208201905081810360008301526138a281613492565b9050919050565b600060208201905081810360008301526138c2816134b5565b9050919050565b600060208201905081810360008301526138e2816134d8565b9050919050565b60006020820190508181036000830152613902816134fb565b9050919050565b600060208201905081810360008301526139228161351e565b9050919050565b600060208201905061393e6000830184613550565b92915050565b600061394e61395f565b905061395a8282613c44565b919050565b6000604051905090565b600067ffffffffffffffff82111561398457613983613d7c565b5b61398d82613dab565b9050602081019050919050565b600067ffffffffffffffff8211156139b5576139b4613d7c565b5b6139be82613dab565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a5282613bc6565b9150613a5d83613bc6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a9257613a91613cef565b5b828201905092915050565b6000613aa882613bc6565b9150613ab383613bc6565b925082613ac357613ac2613d1e565b5b828204905092915050565b6000613ad982613bc6565b9150613ae483613bc6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b1d57613b1c613cef565b5b828202905092915050565b6000613b3382613bc6565b9150613b3e83613bc6565b925082821015613b5157613b50613cef565b5b828203905092915050565b6000613b6782613ba6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613bfd578082015181840152602081019050613be2565b83811115613c0c576000848401525b50505050565b60006002820490506001821680613c2a57607f821691505b60208210811415613c3e57613c3d613d4d565b5b50919050565b613c4d82613dab565b810181811067ffffffffffffffff82111715613c6c57613c6b613d7c565b5b80604052505050565b6000613c8082613bc6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613cb357613cb2613cef565b5b600182019050919050565b6000613cc982613bc6565b9150613cd483613bc6565b925082613ce457613ce3613d1e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f6d61785f6d696e745f636f756e745f6578636565646564000000000000000000600082015250565b7f73616c655f6e6f745f6163746976650000000000000000000000000000000000600082015250565b7f746f6b656e5f737570706c795f6e6f745f7a65726f0000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f696e73756666696369656e745f7061796d656e745f76616c7565000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f6d61785f746f6b656e5f737570706c795f657863656564656400000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61438881613b5c565b811461439357600080fd5b50565b61439f81613b6e565b81146143aa57600080fd5b50565b6143b681613b7a565b81146143c157600080fd5b50565b6143cd81613bc6565b81146143d857600080fd5b5056fea26469706673582212208db1a14ec70434473a1f8ead0cc13b11991838aedbd3c8a4095a666798e8257f64736f6c634300080400330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f6e6674782e6d7970696e6174612e636c6f75642f697066732f516d65654377694b47333271766a6632567072505865394e70683737586d6a437a4b75714d6961786f44446244443f00000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101d85760003560e01c8063715018a611610102578063a22cb46511610095578063c87b56dd11610064578063c87b56dd14610656578063cfc86f7b14610693578063e985e9c5146106be578063f2fde38b146106fb576101d8565b8063a22cb465146105d6578063ab0bcc41146105ff578063b4b6961314610616578063b88d4fde1461062d576101d8565b80638da5cb5b116100d15780638da5cb5b1461053b57806391b7f5ed1461056657806395d89b411461058f578063a0712d68146105ba576101d8565b8063715018a6146104c65780638078059c146104dd5780638462151c146104f4578063853828b614610531576101d8565b806323b872dd1161017a57806355f804b31161014957806355f804b3146103f85780635d893ba0146104215780636352211e1461044c57806370a0823114610489576101d8565b806323b872dd1461032c5780632f745c591461035557806342842e0e146103925780634f6ccce7146103bb576101d8565b8063095ea7b3116101b6578063095ea7b31461028257806318160ddd146102ab57806322f4596f146102d6578063235b6ea114610301576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190613029565b610724565b604051610211919061360c565b60405180910390f35b34801561022657600080fd5b5061022f61079e565b60405161023c9190613627565b60405180910390f35b34801561025157600080fd5b5061026c600480360381019061026791906130bc565b610830565b6040516102799190613583565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a49190612fed565b6108b5565b005b3480156102b757600080fd5b506102c06109cd565b6040516102cd9190613929565b60405180910390f35b3480156102e257600080fd5b506102eb6109da565b6040516102f89190613929565b60405180910390f35b34801561030d57600080fd5b506103166109e0565b6040516103239190613929565b60405180910390f35b34801561033857600080fd5b50610353600480360381019061034e9190612ee7565b6109e6565b005b34801561036157600080fd5b5061037c60048036038101906103779190612fed565b610a46565b6040516103899190613929565b60405180910390f35b34801561039e57600080fd5b506103b960048036038101906103b49190612ee7565b610aeb565b005b3480156103c757600080fd5b506103e260048036038101906103dd91906130bc565b610b0b565b6040516103ef9190613929565b60405180910390f35b34801561040457600080fd5b5061041f600480360381019061041a919061307b565b610ba2565b005b34801561042d57600080fd5b50610436610c38565b604051610443919061360c565b60405180910390f35b34801561045857600080fd5b50610473600480360381019061046e91906130bc565b610c4b565b6040516104809190613583565b60405180910390f35b34801561049557600080fd5b506104b060048036038101906104ab9190612e82565b610cfd565b6040516104bd9190613929565b60405180910390f35b3480156104d257600080fd5b506104db610db5565b005b3480156104e957600080fd5b506104f2610e3d565b005b34801561050057600080fd5b5061051b60048036038101906105169190612e82565b610ed6565b60405161052891906135ea565b60405180910390f35b610539610fd0565b005b34801561054757600080fd5b50610550611180565b60405161055d9190613583565b60405180910390f35b34801561057257600080fd5b5061058d600480360381019061058891906130bc565b6111aa565b005b34801561059b57600080fd5b506105a4611230565b6040516105b19190613627565b60405180910390f35b6105d460048036038101906105cf91906130bc565b6112c2565b005b3480156105e257600080fd5b506105fd60048036038101906105f89190612fb1565b611439565b005b34801561060b57600080fd5b506106146115ba565b005b34801561062257600080fd5b5061062b611653565b005b34801561063957600080fd5b50610654600480360381019061064f9190612f36565b6117ed565b005b34801561066257600080fd5b5061067d600480360381019061067891906130bc565b61184f565b60405161068a9190613627565b60405180910390f35b34801561069f57600080fd5b506106a86118f6565b6040516106b59190613627565b60405180910390f35b3480156106ca57600080fd5b506106e560048036038101906106e09190612eab565b611984565b6040516106f2919061360c565b60405180910390f35b34801561070757600080fd5b50610722600480360381019061071d9190612e82565b611a18565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610797575061079682611b10565b5b9050919050565b6060600080546107ad90613c12565b80601f01602080910402602001604051908101604052809291908181526020018280546107d990613c12565b80156108265780601f106107fb57610100808354040283529160200191610826565b820191906000526020600020905b81548152906001019060200180831161080957829003601f168201915b5050505050905090565b600061083b82611bf2565b61087a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087190613809565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108c082610c4b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610931576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092890613889565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610950611c5e565b73ffffffffffffffffffffffffffffffffffffffff16148061097f575061097e81610979611c5e565b611984565b5b6109be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b590613729565b60405180910390fd5b6109c88383611c66565b505050565b6000600880549050905090565b600d5481565b600c5481565b6109f76109f1611c5e565b82611d1f565b610a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2d906138c9565b60405180910390fd5b610a41838383611dfd565b505050565b6000610a5183610cfd565b8210610a92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8990613649565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b06838383604051806020016040528060008152506117ed565b505050565b6000610b156109cd565b8210610b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4d90613909565b60405180910390fd5b60088281548110610b90577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610baa611c5e565b73ffffffffffffffffffffffffffffffffffffffff16610bc8611180565b73ffffffffffffffffffffffffffffffffffffffff1614610c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1590613829565b60405180910390fd5b80600b9080519060200190610c34929190612ca6565b5050565b600e60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb90613769565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6590613749565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610dbd611c5e565b73ffffffffffffffffffffffffffffffffffffffff16610ddb611180565b73ffffffffffffffffffffffffffffffffffffffff1614610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2890613829565b60405180910390fd5b610e3b6000612059565b565b610e45611c5e565b73ffffffffffffffffffffffffffffffffffffffff16610e63611180565b73ffffffffffffffffffffffffffffffffffffffff1614610eb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb090613829565b60405180910390fd5b6000600e60006101000a81548160ff021916908315150217905550565b60606000610ee383610cfd565b905060008167ffffffffffffffff811115610f27577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610f555781602001602082028036833780820191505090505b50905060005b82811015610fc557610f6d8582610a46565b828281518110610fa6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610fbd90613c75565b915050610f5b565b508092505050919050565b610fd8611c5e565b73ffffffffffffffffffffffffffffffffffffffff16610ff6611180565b73ffffffffffffffffffffffffffffffffffffffff161461104c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104390613829565b60405180910390fd5b600060034761105b9190613a9d565b9050600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050506110bd57600080fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505061111d57600080fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505061117d57600080fd5b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6111b2611c5e565b73ffffffffffffffffffffffffffffffffffffffff166111d0611180565b73ffffffffffffffffffffffffffffffffffffffff1614611226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121d90613829565b60405180910390fd5b80600c8190555050565b60606001805461123f90613c12565b80601f016020809104026020016040519081016040528092919081815260200182805461126b90613c12565b80156112b85780601f1061128d576101008083540402835291602001916112b8565b820191906000526020600020905b81548152906001019060200180831161129b57829003601f168201915b5050505050905090565b60006112cc6109cd565b9050600e60009054906101000a900460ff1661131d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611314906137a9565b60405180910390fd5b6014821115611361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135890613789565b60405180910390fd5b600d5482826113709190613a47565b11156113b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a8906138e9565b60405180910390fd5b81600c546113bf9190613ace565b341015611401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f8906138a9565b60405180910390fd5b60005b828110156114345761142133828461141c9190613a47565b61211f565b808061142c90613c75565b915050611404565b505050565b611441611c5e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a6906136e9565b60405180910390fd5b80600560006114bc611c5e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611569611c5e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115ae919061360c565b60405180910390a35050565b6115c2611c5e565b73ffffffffffffffffffffffffffffffffffffffff166115e0611180565b73ffffffffffffffffffffffffffffffffffffffff1614611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d90613829565b60405180910390fd5b6001600e60006101000a81548160ff021916908315150217905550565b61165b611c5e565b73ffffffffffffffffffffffffffffffffffffffff16611679611180565b73ffffffffffffffffffffffffffffffffffffffff16146116cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c690613829565b60405180910390fd5b60006116d96109cd565b90506000811461171e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611715906137c9565b60405180910390fd5b60005b601e8110156117e957600a8110156117645761175f600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261211f565b6117d6565b601481101561179e57611799600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261211f565b6117d5565b601e8110156117d4576117d3601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261211f565b5b5b5b80806117e190613c75565b915050611721565b5050565b6117fe6117f8611c5e565b83611d1f565b61183d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611834906138c9565b60405180910390fd5b6118498484848461213d565b50505050565b606061185a82611bf2565b611899576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189090613869565b60405180910390fd5b60006118a3612199565b905060008151116118c357604051806020016040528060008152506118ee565b806118cd8461222b565b6040516020016118de92919061355f565b6040516020818303038152906040525b915050919050565b600b805461190390613c12565b80601f016020809104026020016040519081016040528092919081815260200182805461192f90613c12565b801561197c5780601f106119515761010080835404028352916020019161197c565b820191906000526020600020905b81548152906001019060200180831161195f57829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a20611c5e565b73ffffffffffffffffffffffffffffffffffffffff16611a3e611180565b73ffffffffffffffffffffffffffffffffffffffff1614611a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8b90613829565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afb90613689565b60405180910390fd5b611b0d81612059565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611bdb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611beb5750611bea826123d8565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611cd983610c4b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d2a82611bf2565b611d69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6090613709565b60405180910390fd5b6000611d7483610c4b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611de357508373ffffffffffffffffffffffffffffffffffffffff16611dcb84610830565b73ffffffffffffffffffffffffffffffffffffffff16145b80611df45750611df38185611984565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e1d82610c4b565b73ffffffffffffffffffffffffffffffffffffffff1614611e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6a90613849565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eda906136c9565b60405180910390fd5b611eee838383612442565b611ef9600082611c66565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f499190613b28565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fa09190613a47565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612139828260405180602001604052806000815250612556565b5050565b612148848484611dfd565b612154848484846125b1565b612193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218a90613669565b60405180910390fd5b50505050565b6060600b80546121a890613c12565b80601f01602080910402602001604051908101604052809291908181526020018280546121d490613c12565b80156122215780601f106121f657610100808354040283529160200191612221565b820191906000526020600020905b81548152906001019060200180831161220457829003601f168201915b5050505050905090565b60606000821415612273576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123d3565b600082905060005b600082146122a557808061228e90613c75565b915050600a8261229e9190613a9d565b915061227b565b60008167ffffffffffffffff8111156122e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123195781602001600182028036833780820191505090505b5090505b600085146123cc576001826123329190613b28565b9150600a856123419190613cbe565b603061234d9190613a47565b60f81b818381518110612389577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123c59190613a9d565b945061231d565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61244d838383612748565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124905761248b8161274d565b6124cf565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124ce576124cd8382612796565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125125761250d81612903565b612551565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146125505761254f8282612a46565b5b5b505050565b6125608383612ac5565b61256d60008484846125b1565b6125ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a390613669565b60405180910390fd5b505050565b60006125d28473ffffffffffffffffffffffffffffffffffffffff16612c93565b1561273b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125fb611c5e565b8786866040518563ffffffff1660e01b815260040161261d949392919061359e565b602060405180830381600087803b15801561263757600080fd5b505af192505050801561266857506040513d601f19601f820116820180604052508101906126659190613052565b60015b6126eb573d8060008114612698576040519150601f19603f3d011682016040523d82523d6000602084013e61269d565b606091505b506000815114156126e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126da90613669565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612740565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016127a384610cfd565b6127ad9190613b28565b9050600060076000848152602001908152602001600020549050818114612892576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506129179190613b28565b905060006009600084815260200190815260200160002054905060006008838154811061296d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106129b5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612a2a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612a5183610cfd565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2c906137e9565b60405180910390fd5b612b3e81611bf2565b15612b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b75906136a9565b60405180910390fd5b612b8a60008383612442565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bda9190613a47565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612cb290613c12565b90600052602060002090601f016020900481019282612cd45760008555612d1b565b82601f10612ced57805160ff1916838001178555612d1b565b82800160010185558215612d1b579182015b82811115612d1a578251825591602001919060010190612cff565b5b509050612d289190612d2c565b5090565b5b80821115612d45576000816000905550600101612d2d565b5090565b6000612d5c612d5784613969565b613944565b905082815260208101848484011115612d7457600080fd5b612d7f848285613bd0565b509392505050565b6000612d9a612d958461399a565b613944565b905082815260208101848484011115612db257600080fd5b612dbd848285613bd0565b509392505050565b600081359050612dd48161437f565b92915050565b600081359050612de981614396565b92915050565b600081359050612dfe816143ad565b92915050565b600081519050612e13816143ad565b92915050565b600082601f830112612e2a57600080fd5b8135612e3a848260208601612d49565b91505092915050565b600082601f830112612e5457600080fd5b8135612e64848260208601612d87565b91505092915050565b600081359050612e7c816143c4565b92915050565b600060208284031215612e9457600080fd5b6000612ea284828501612dc5565b91505092915050565b60008060408385031215612ebe57600080fd5b6000612ecc85828601612dc5565b9250506020612edd85828601612dc5565b9150509250929050565b600080600060608486031215612efc57600080fd5b6000612f0a86828701612dc5565b9350506020612f1b86828701612dc5565b9250506040612f2c86828701612e6d565b9150509250925092565b60008060008060808587031215612f4c57600080fd5b6000612f5a87828801612dc5565b9450506020612f6b87828801612dc5565b9350506040612f7c87828801612e6d565b925050606085013567ffffffffffffffff811115612f9957600080fd5b612fa587828801612e19565b91505092959194509250565b60008060408385031215612fc457600080fd5b6000612fd285828601612dc5565b9250506020612fe385828601612dda565b9150509250929050565b6000806040838503121561300057600080fd5b600061300e85828601612dc5565b925050602061301f85828601612e6d565b9150509250929050565b60006020828403121561303b57600080fd5b600061304984828501612def565b91505092915050565b60006020828403121561306457600080fd5b600061307284828501612e04565b91505092915050565b60006020828403121561308d57600080fd5b600082013567ffffffffffffffff8111156130a757600080fd5b6130b384828501612e43565b91505092915050565b6000602082840312156130ce57600080fd5b60006130dc84828501612e6d565b91505092915050565b60006130f18383613541565b60208301905092915050565b61310681613b5c565b82525050565b6000613117826139db565b6131218185613a09565b935061312c836139cb565b8060005b8381101561315d57815161314488826130e5565b975061314f836139fc565b925050600181019050613130565b5085935050505092915050565b61317381613b6e565b82525050565b6000613184826139e6565b61318e8185613a1a565b935061319e818560208601613bdf565b6131a781613dab565b840191505092915050565b60006131bd826139f1565b6131c78185613a2b565b93506131d7818560208601613bdf565b6131e081613dab565b840191505092915050565b60006131f6826139f1565b6132008185613a3c565b9350613210818560208601613bdf565b80840191505092915050565b6000613229602b83613a2b565b915061323482613dbc565b604082019050919050565b600061324c603283613a2b565b915061325782613e0b565b604082019050919050565b600061326f602683613a2b565b915061327a82613e5a565b604082019050919050565b6000613292601c83613a2b565b915061329d82613ea9565b602082019050919050565b60006132b5602483613a2b565b91506132c082613ed2565b604082019050919050565b60006132d8601983613a2b565b91506132e382613f21565b602082019050919050565b60006132fb602c83613a2b565b915061330682613f4a565b604082019050919050565b600061331e603883613a2b565b915061332982613f99565b604082019050919050565b6000613341602a83613a2b565b915061334c82613fe8565b604082019050919050565b6000613364602983613a2b565b915061336f82614037565b604082019050919050565b6000613387601783613a2b565b915061339282614086565b602082019050919050565b60006133aa600f83613a2b565b91506133b5826140af565b602082019050919050565b60006133cd601583613a2b565b91506133d8826140d8565b602082019050919050565b60006133f0602083613a2b565b91506133fb82614101565b602082019050919050565b6000613413602c83613a2b565b915061341e8261412a565b604082019050919050565b6000613436602083613a2b565b915061344182614179565b602082019050919050565b6000613459602983613a2b565b9150613464826141a2565b604082019050919050565b600061347c602f83613a2b565b9150613487826141f1565b604082019050919050565b600061349f602183613a2b565b91506134aa82614240565b604082019050919050565b60006134c2601a83613a2b565b91506134cd8261428f565b602082019050919050565b60006134e5603183613a2b565b91506134f0826142b8565b604082019050919050565b6000613508601983613a2b565b915061351382614307565b602082019050919050565b600061352b602c83613a2b565b915061353682614330565b604082019050919050565b61354a81613bc6565b82525050565b61355981613bc6565b82525050565b600061356b82856131eb565b915061357782846131eb565b91508190509392505050565b600060208201905061359860008301846130fd565b92915050565b60006080820190506135b360008301876130fd565b6135c060208301866130fd565b6135cd6040830185613550565b81810360608301526135df8184613179565b905095945050505050565b60006020820190508181036000830152613604818461310c565b905092915050565b6000602082019050613621600083018461316a565b92915050565b6000602082019050818103600083015261364181846131b2565b905092915050565b600060208201905081810360008301526136628161321c565b9050919050565b600060208201905081810360008301526136828161323f565b9050919050565b600060208201905081810360008301526136a281613262565b9050919050565b600060208201905081810360008301526136c281613285565b9050919050565b600060208201905081810360008301526136e2816132a8565b9050919050565b60006020820190508181036000830152613702816132cb565b9050919050565b60006020820190508181036000830152613722816132ee565b9050919050565b6000602082019050818103600083015261374281613311565b9050919050565b6000602082019050818103600083015261376281613334565b9050919050565b6000602082019050818103600083015261378281613357565b9050919050565b600060208201905081810360008301526137a28161337a565b9050919050565b600060208201905081810360008301526137c28161339d565b9050919050565b600060208201905081810360008301526137e2816133c0565b9050919050565b60006020820190508181036000830152613802816133e3565b9050919050565b6000602082019050818103600083015261382281613406565b9050919050565b6000602082019050818103600083015261384281613429565b9050919050565b600060208201905081810360008301526138628161344c565b9050919050565b600060208201905081810360008301526138828161346f565b9050919050565b600060208201905081810360008301526138a281613492565b9050919050565b600060208201905081810360008301526138c2816134b5565b9050919050565b600060208201905081810360008301526138e2816134d8565b9050919050565b60006020820190508181036000830152613902816134fb565b9050919050565b600060208201905081810360008301526139228161351e565b9050919050565b600060208201905061393e6000830184613550565b92915050565b600061394e61395f565b905061395a8282613c44565b919050565b6000604051905090565b600067ffffffffffffffff82111561398457613983613d7c565b5b61398d82613dab565b9050602081019050919050565b600067ffffffffffffffff8211156139b5576139b4613d7c565b5b6139be82613dab565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a5282613bc6565b9150613a5d83613bc6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a9257613a91613cef565b5b828201905092915050565b6000613aa882613bc6565b9150613ab383613bc6565b925082613ac357613ac2613d1e565b5b828204905092915050565b6000613ad982613bc6565b9150613ae483613bc6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b1d57613b1c613cef565b5b828202905092915050565b6000613b3382613bc6565b9150613b3e83613bc6565b925082821015613b5157613b50613cef565b5b828203905092915050565b6000613b6782613ba6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613bfd578082015181840152602081019050613be2565b83811115613c0c576000848401525b50505050565b60006002820490506001821680613c2a57607f821691505b60208210811415613c3e57613c3d613d4d565b5b50919050565b613c4d82613dab565b810181811067ffffffffffffffff82111715613c6c57613c6b613d7c565b5b80604052505050565b6000613c8082613bc6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613cb357613cb2613cef565b5b600182019050919050565b6000613cc982613bc6565b9150613cd483613bc6565b925082613ce457613ce3613d1e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f6d61785f6d696e745f636f756e745f6578636565646564000000000000000000600082015250565b7f73616c655f6e6f745f6163746976650000000000000000000000000000000000600082015250565b7f746f6b656e5f737570706c795f6e6f745f7a65726f0000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f696e73756666696369656e745f7061796d656e745f76616c7565000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f6d61785f746f6b656e5f737570706c795f657863656564656400000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61438881613b5c565b811461439357600080fd5b50565b61439f81613b6e565b81146143aa57600080fd5b50565b6143b681613b7a565b81146143c157600080fd5b50565b6143cd81613bc6565b81146143d857600080fd5b5056fea26469706673582212208db1a14ec70434473a1f8ead0cc13b11991838aedbd3c8a4095a666798e8257f64736f6c63430008040033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f6e6674782e6d7970696e6174612e636c6f75642f697066732f516d65654377694b47333271766a6632567072505865394e70683737586d6a437a4b75714d6961786f44446244443f00000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string): https://nftx.mypinata.cloud/ipfs/QmeeCwiKG32qvjf2VprPXe9Nph77XmjCzKuqMiaxoDDbDD?

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [2] : 68747470733a2f2f6e6674782e6d7970696e6174612e636c6f75642f69706673
Arg [3] : 2f516d65654377694b47333271766a6632567072505865394e70683737586d6a
Arg [4] : 437a4b75714d6961786f44446244443f00000000000000000000000000000000


Deployed Bytecode Sourcemap

50328:2676:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34858:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21747:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23306:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22829:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35498:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50528:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50466:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24196:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35166:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24606:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35688:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52041:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50568:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21441:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21171:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49626:94;;;;;;;;;;;;;:::i;:::-;;52327:77;;;;;;;;;;;;;:::i;:::-;;52412:344;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52764:237;;;:::i;:::-;;48975:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52151:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21916:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51379:532;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23599:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52242:77;;;;;;;;;;;;;:::i;:::-;;50919:452;;;;;;;;;;;;;:::i;:::-;;24862:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22091:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50432:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23965:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49875:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34858:224;34960:4;34999:35;34984:50;;;:11;:50;;;;:90;;;;35038:36;35062:11;35038:23;:36::i;:::-;34984:90;34977:97;;34858:224;;;:::o;21747:100::-;21801:13;21834:5;21827:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21747:100;:::o;23306:221::-;23382:7;23410:16;23418:7;23410;:16::i;:::-;23402:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23495:15;:24;23511:7;23495:24;;;;;;;;;;;;;;;;;;;;;23488:31;;23306:221;;;:::o;22829:411::-;22910:13;22926:23;22941:7;22926:14;:23::i;:::-;22910:39;;22974:5;22968:11;;:2;:11;;;;22960:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23068:5;23052:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23077:37;23094:5;23101:12;:10;:12::i;:::-;23077:16;:37::i;:::-;23052:62;23030:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23211:21;23220:2;23224:7;23211:8;:21::i;:::-;22829:411;;;:::o;35498:113::-;35559:7;35586:10;:17;;;;35579:24;;35498:113;:::o;50528:33::-;;;;:::o;50466:41::-;;;;:::o;24196:339::-;24391:41;24410:12;:10;:12::i;:::-;24424:7;24391:18;:41::i;:::-;24383:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24499:28;24509:4;24515:2;24519:7;24499:9;:28::i;:::-;24196:339;;;:::o;35166:256::-;35263:7;35299:23;35316:5;35299:16;:23::i;:::-;35291:5;:31;35283:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35388:12;:19;35401:5;35388:19;;;;;;;;;;;;;;;:26;35408:5;35388:26;;;;;;;;;;;;35381:33;;35166:256;;;;:::o;24606:185::-;24744:39;24761:4;24767:2;24771:7;24744:39;;;;;;;;;;;;:16;:39::i;:::-;24606:185;;;:::o;35688:233::-;35763:7;35799:30;:28;:30::i;:::-;35791:5;:38;35783:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35896:10;35907:5;35896:17;;;;;;;;;;;;;;;;;;;;;;;;35889:24;;35688:233;;;:::o;52041:102::-;49206:12;:10;:12::i;:::-;49195:23;;:7;:5;:7::i;:::-;:23;;;49187:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52128:7:::1;52112:13;:23;;;;;;;;;;;;:::i;:::-;;52041:102:::0;:::o;50568:33::-;;;;;;;;;;;;;:::o;21441:239::-;21513:7;21533:13;21549:7;:16;21557:7;21549:16;;;;;;;;;;;;;;;;;;;;;21533:32;;21601:1;21584:19;;:5;:19;;;;21576:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21667:5;21660:12;;;21441:239;;;:::o;21171:208::-;21243:7;21288:1;21271:19;;:5;:19;;;;21263:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21355:9;:16;21365:5;21355:16;;;;;;;;;;;;;;;;21348:23;;21171:208;;;:::o;49626:94::-;49206:12;:10;:12::i;:::-;49195:23;;:7;:5;:7::i;:::-;:23;;;49187:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49691:21:::1;49709:1;49691:9;:21::i;:::-;49626:94::o:0;52327:77::-;49206:12;:10;:12::i;:::-;49195:23;;:7;:5;:7::i;:::-;:23;;;49187:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52391:5:::1;52375:13;;:21;;;;;;;;;;;;;;;;;;52327:77::o:0;52412:344::-;52471:16;52500:18;52521:16;52531:5;52521:9;:16::i;:::-;52500:37;;52548:25;52590:10;52576:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52548:53;;52617:9;52612:111;52636:10;52632:1;:14;52612:111;;;52682:29;52702:5;52709:1;52682:19;:29::i;:::-;52668:8;52677:1;52668:11;;;;;;;;;;;;;;;;;;;;;:43;;;;;52648:3;;;;;:::i;:::-;;;;52612:111;;;;52740:8;52733:15;;;;52412:344;;;:::o;52764:237::-;49206:12;:10;:12::i;:::-;49195:23;;:7;:5;:7::i;:::-;:23;;;49187:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52823:13:::1;52863:1;52839:21;:25;;;;:::i;:::-;52823:41;;52891:2;;;;;;;;;;;52883:16;;:23;52900:5;52883:23;;;;;;;;;;;;;;;;;;;;;;;52875:32;;;::::0;::::1;;52934:2;;;;;;;;;;;52926:16;;:23;52943:5;52926:23;;;;;;;;;;;;;;;;;;;;;;;52918:32;;;::::0;::::1;;52977:2;;;;;;;;;;;52969:16;;:23;52986:5;52969:23;;;;;;;;;;;;;;;;;;;;;;;52961:32;;;::::0;::::1;;49266:1;52764:237::o:0;48975:87::-;49021:7;49048:6;;;;;;;;;;;49041:13;;48975:87;:::o;52151:83::-;49206:12;:10;:12::i;:::-;49195:23;;:7;:5;:7::i;:::-;:23;;;49187:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52221:5:::1;52212:6;:14;;;;52151:83:::0;:::o;21916:104::-;21972:13;22005:7;21998:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21916:104;:::o;51379:532::-;51438:14;51455:13;:11;:13::i;:::-;51438:30;;51489:13;;;;;;;;;;;51481:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;51575:2;51562:9;:15;;51554:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;51665:10;;51652:9;51643:6;:18;;;;:::i;:::-;:32;;51635:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;51748:9;51739:6;;:18;;;;:::i;:::-;51726:9;:31;;51718:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;51809:9;51804:100;51828:9;51824:1;:13;51804:100;;;51859:33;51869:10;51890:1;51881:6;:10;;;;:::i;:::-;51859:9;:33::i;:::-;51839:3;;;;;:::i;:::-;;;;51804:100;;;;51379:532;;:::o;23599:295::-;23714:12;:10;:12::i;:::-;23702:24;;:8;:24;;;;23694:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23814:8;23769:18;:32;23788:12;:10;:12::i;:::-;23769:32;;;;;;;;;;;;;;;:42;23802:8;23769:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23867:8;23838:48;;23853:12;:10;:12::i;:::-;23838:48;;;23877:8;23838:48;;;;;;:::i;:::-;;;;;;;;23599:295;;:::o;52242:77::-;49206:12;:10;:12::i;:::-;49195:23;;:7;:5;:7::i;:::-;:23;;;49187:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52307:4:::1;52291:13;;:20;;;;;;;;;;;;;;;;;;52242:77::o:0;50919:452::-;49206:12;:10;:12::i;:::-;49195:23;;:7;:5;:7::i;:::-;:23;;;49187:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50977:14:::1;50994:13;:11;:13::i;:::-;50977:30;;51038:1;51028:6;:11;51020:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;51083:9;51078:286;51102:2;51098:1;:6;51078:286;;;51134:2;51130:1;:6;51126:227;;;51157:16;51167:2;;;;;;;;;;;51171:1;51157:9;:16::i;:::-;51126:227;;;51216:2;51212:1;:6;51208:145;;;51239:16;51249:2;;;;;;;;;;;51253:1;51239:9;:16::i;:::-;51208:145;;;51298:2;51294:1;:6;51290:63;;;51321:16;51331:2;;;;;;;;;;;51335:1;51321:9;:16::i;:::-;51290:63;51208:145;51126:227;51106:3;;;;;:::i;:::-;;;;51078:286;;;;49266:1;50919:452::o:0;24862:328::-;25037:41;25056:12;:10;:12::i;:::-;25070:7;25037:18;:41::i;:::-;25029:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25143:39;25157:4;25163:2;25167:7;25176:5;25143:13;:39::i;:::-;24862:328;;;;:::o;22091:334::-;22164:13;22198:16;22206:7;22198;:16::i;:::-;22190:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22279:21;22303:10;:8;:10::i;:::-;22279:34;;22355:1;22337:7;22331:21;:25;:86;;;;;;;;;;;;;;;;;22383:7;22392:18;:7;:16;:18::i;:::-;22366:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22331:86;22324:93;;;22091:334;;;:::o;50432:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23965:164::-;24062:4;24086:18;:25;24105:5;24086:25;;;;;;;;;;;;;;;:35;24112:8;24086:35;;;;;;;;;;;;;;;;;;;;;;;;;24079:42;;23965:164;;;;:::o;49875:192::-;49206:12;:10;:12::i;:::-;49195:23;;:7;:5;:7::i;:::-;:23;;;49187:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49984:1:::1;49964:22;;:8;:22;;;;49956:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;50040:19;50050:8;50040:9;:19::i;:::-;49875:192:::0;:::o;20802:305::-;20904:4;20956:25;20941:40;;;:11;:40;;;;:105;;;;21013:33;20998:48;;;:11;:48;;;;20941:105;:158;;;;21063:36;21087:11;21063:23;:36::i;:::-;20941:158;20921:178;;20802:305;;;:::o;26700:127::-;26765:4;26817:1;26789:30;;:7;:16;26797:7;26789:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26782:37;;26700:127;;;:::o;16204:98::-;16257:7;16284:10;16277:17;;16204:98;:::o;30682:174::-;30784:2;30757:15;:24;30773:7;30757:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30840:7;30836:2;30802:46;;30811:23;30826:7;30811:14;:23::i;:::-;30802:46;;;;;;;;;;;;30682:174;;:::o;26994:348::-;27087:4;27112:16;27120:7;27112;:16::i;:::-;27104:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27188:13;27204:23;27219:7;27204:14;:23::i;:::-;27188:39;;27257:5;27246:16;;:7;:16;;;:51;;;;27290:7;27266:31;;:20;27278:7;27266:11;:20::i;:::-;:31;;;27246:51;:87;;;;27301:32;27318:5;27325:7;27301:16;:32::i;:::-;27246:87;27238:96;;;26994:348;;;;:::o;29986:578::-;30145:4;30118:31;;:23;30133:7;30118:14;:23::i;:::-;:31;;;30110:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30228:1;30214:16;;:2;:16;;;;30206:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30284:39;30305:4;30311:2;30315:7;30284:20;:39::i;:::-;30388:29;30405:1;30409:7;30388:8;:29::i;:::-;30449:1;30430:9;:15;30440:4;30430:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30478:1;30461:9;:13;30471:2;30461:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30509:2;30490:7;:16;30498:7;30490:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30548:7;30544:2;30529:27;;30538:4;30529:27;;;;;;;;;;;;29986:578;;;:::o;50075:173::-;50131:16;50150:6;;;;;;;;;;;50131:25;;50176:8;50167:6;;:17;;;;;;;;;;;;;;;;;;50231:8;50200:40;;50221:8;50200:40;;;;;;;;;;;;50075:173;;:::o;27684:110::-;27760:26;27770:2;27774:7;27760:26;;;;;;;;;;;;:9;:26::i;:::-;27684:110;;:::o;26072:315::-;26229:28;26239:4;26245:2;26249:7;26229:9;:28::i;:::-;26276:48;26299:4;26305:2;26309:7;26318:5;26276:22;:48::i;:::-;26268:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26072:315;;;;:::o;51919:114::-;51979:13;52012;52005:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51919:114;:::o;16737:723::-;16793:13;17023:1;17014:5;:10;17010:53;;;17041:10;;;;;;;;;;;;;;;;;;;;;17010:53;17073:12;17088:5;17073:20;;17104:14;17129:78;17144:1;17136:4;:9;17129:78;;17162:8;;;;;:::i;:::-;;;;17193:2;17185:10;;;;;:::i;:::-;;;17129:78;;;17217:19;17249:6;17239:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17217:39;;17267:154;17283:1;17274:5;:10;17267:154;;17311:1;17301:11;;;;;:::i;:::-;;;17378:2;17370:5;:10;;;;:::i;:::-;17357:2;:24;;;;:::i;:::-;17344:39;;17327:6;17334;17327:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17407:2;17398:11;;;;;:::i;:::-;;;17267:154;;;17445:6;17431:21;;;;;16737:723;;;;:::o;19300:157::-;19385:4;19424:25;19409:40;;;:11;:40;;;;19402:47;;19300:157;;;:::o;36534:589::-;36678:45;36705:4;36711:2;36715:7;36678:26;:45::i;:::-;36756:1;36740:18;;:4;:18;;;36736:187;;;36775:40;36807:7;36775:31;:40::i;:::-;36736:187;;;36845:2;36837:10;;:4;:10;;;36833:90;;36864:47;36897:4;36903:7;36864:32;:47::i;:::-;36833:90;36736:187;36951:1;36937:16;;:2;:16;;;36933:183;;;36970:45;37007:7;36970:36;:45::i;:::-;36933:183;;;37043:4;37037:10;;:2;:10;;;37033:83;;37064:40;37092:2;37096:7;37064:27;:40::i;:::-;37033:83;36933:183;36534:589;;;:::o;28021:321::-;28151:18;28157:2;28161:7;28151:5;:18::i;:::-;28202:54;28233:1;28237:2;28241:7;28250:5;28202:22;:54::i;:::-;28180:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28021:321;;;:::o;31421:799::-;31576:4;31597:15;:2;:13;;;:15::i;:::-;31593:620;;;31649:2;31633:36;;;31670:12;:10;:12::i;:::-;31684:4;31690:7;31699:5;31633:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31629:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31892:1;31875:6;:13;:18;31871:272;;;31918:60;;;;;;;;;;:::i;:::-;;;;;;;;31871:272;32093:6;32087:13;32078:6;32074:2;32070:15;32063:38;31629:529;31766:41;;;31756:51;;;:6;:51;;;;31749:58;;;;;31593:620;32197:4;32190:11;;31421:799;;;;;;;:::o;32792:126::-;;;;:::o;37846:164::-;37950:10;:17;;;;37923:15;:24;37939:7;37923:24;;;;;;;;;;;:44;;;;37978:10;37994:7;37978:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37846:164;:::o;38637:988::-;38903:22;38953:1;38928:22;38945:4;38928:16;:22::i;:::-;:26;;;;:::i;:::-;38903:51;;38965:18;38986:17;:26;39004:7;38986:26;;;;;;;;;;;;38965:47;;39133:14;39119:10;:28;39115:328;;39164:19;39186:12;:18;39199:4;39186:18;;;;;;;;;;;;;;;:34;39205:14;39186:34;;;;;;;;;;;;39164:56;;39270:11;39237:12;:18;39250:4;39237:18;;;;;;;;;;;;;;;:30;39256:10;39237:30;;;;;;;;;;;:44;;;;39387:10;39354:17;:30;39372:11;39354:30;;;;;;;;;;;:43;;;;39115:328;;39539:17;:26;39557:7;39539:26;;;;;;;;;;;39532:33;;;39583:12;:18;39596:4;39583:18;;;;;;;;;;;;;;;:34;39602:14;39583:34;;;;;;;;;;;39576:41;;;38637:988;;;;:::o;39920:1079::-;40173:22;40218:1;40198:10;:17;;;;:21;;;;:::i;:::-;40173:46;;40230:18;40251:15;:24;40267:7;40251:24;;;;;;;;;;;;40230:45;;40602:19;40624:10;40635:14;40624:26;;;;;;;;;;;;;;;;;;;;;;;;40602:48;;40688:11;40663:10;40674;40663:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40799:10;40768:15;:28;40784:11;40768:28;;;;;;;;;;;:41;;;;40940:15;:24;40956:7;40940:24;;;;;;;;;;;40933:31;;;40975:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39920:1079;;;;:::o;37424:221::-;37509:14;37526:20;37543:2;37526:16;:20::i;:::-;37509:37;;37584:7;37557:12;:16;37570:2;37557:16;;;;;;;;;;;;;;;:24;37574:6;37557:24;;;;;;;;;;;:34;;;;37631:6;37602:17;:26;37620:7;37602:26;;;;;;;;;;;:35;;;;37424:221;;;:::o;28678:382::-;28772:1;28758:16;;:2;:16;;;;28750:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28831:16;28839:7;28831;:16::i;:::-;28830:17;28822:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28893:45;28922:1;28926:2;28930:7;28893:20;:45::i;:::-;28968:1;28951:9;:13;28961:2;28951:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28999:2;28980:7;:16;28988:7;28980:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29044:7;29040:2;29019:33;;29036:1;29019:33;;;;;;;;;;;;28678:382;;:::o;8240:387::-;8300:4;8508:12;8575:7;8563:20;8555:28;;8618:1;8611:4;:8;8604:15;;;8240:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;2068:6;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;2345:6;2353;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;2767:6;2775;2783;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;3343:6;3351;3359;3367;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;4128:6;4136;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;4538:6;4546;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:260::-;4941:6;4990:2;4978:9;4969:7;4965:23;4961:32;4958:2;;;5006:1;5003;4996:12;4958:2;5049:1;5074:52;5118:7;5109:6;5098:9;5094:22;5074:52;:::i;:::-;5064:62;;5020:116;4948:195;;;;:::o;5149:282::-;5218:6;5267:2;5255:9;5246:7;5242:23;5238:32;5235:2;;;5283:1;5280;5273:12;5235:2;5326:1;5351:63;5406:7;5397:6;5386:9;5382:22;5351:63;:::i;:::-;5341:73;;5297:127;5225:206;;;;:::o;5437:375::-;5506:6;5555:2;5543:9;5534:7;5530:23;5526:32;5523:2;;;5571:1;5568;5561:12;5523:2;5642:1;5631:9;5627:17;5614:31;5672:18;5664:6;5661:30;5658:2;;;5704:1;5701;5694:12;5658:2;5732:63;5787:7;5778:6;5767:9;5763:22;5732:63;:::i;:::-;5722:73;;5585:220;5513:299;;;;:::o;5818:262::-;5877:6;5926:2;5914:9;5905:7;5901:23;5897:32;5894:2;;;5942:1;5939;5932:12;5894:2;5985:1;6010:53;6055:7;6046:6;6035:9;6031:22;6010:53;:::i;:::-;6000:63;;5956:117;5884:196;;;;:::o;6086:179::-;6155:10;6176:46;6218:3;6210:6;6176:46;:::i;:::-;6254:4;6249:3;6245:14;6231:28;;6166:99;;;;:::o;6271:118::-;6358:24;6376:5;6358:24;:::i;:::-;6353:3;6346:37;6336:53;;:::o;6425:732::-;6544:3;6573:54;6621:5;6573:54;:::i;:::-;6643:86;6722:6;6717:3;6643:86;:::i;:::-;6636:93;;6753:56;6803:5;6753:56;:::i;:::-;6832:7;6863:1;6848:284;6873:6;6870:1;6867:13;6848:284;;;6949:6;6943:13;6976:63;7035:3;7020:13;6976:63;:::i;:::-;6969:70;;7062:60;7115:6;7062:60;:::i;:::-;7052:70;;6908:224;6895:1;6892;6888:9;6883:14;;6848:284;;;6852:14;7148:3;7141:10;;6549:608;;;;;;;:::o;7163:109::-;7244:21;7259:5;7244:21;:::i;:::-;7239:3;7232:34;7222:50;;:::o;7278:360::-;7364:3;7392:38;7424:5;7392:38;:::i;:::-;7446:70;7509:6;7504:3;7446:70;:::i;:::-;7439:77;;7525:52;7570:6;7565:3;7558:4;7551:5;7547:16;7525:52;:::i;:::-;7602:29;7624:6;7602:29;:::i;:::-;7597:3;7593:39;7586:46;;7368:270;;;;;:::o;7644:364::-;7732:3;7760:39;7793:5;7760:39;:::i;:::-;7815:71;7879:6;7874:3;7815:71;:::i;:::-;7808:78;;7895:52;7940:6;7935:3;7928:4;7921:5;7917:16;7895:52;:::i;:::-;7972:29;7994:6;7972:29;:::i;:::-;7967:3;7963:39;7956:46;;7736:272;;;;;:::o;8014:377::-;8120:3;8148:39;8181:5;8148:39;:::i;:::-;8203:89;8285:6;8280:3;8203:89;:::i;:::-;8196:96;;8301:52;8346:6;8341:3;8334:4;8327:5;8323:16;8301:52;:::i;:::-;8378:6;8373:3;8369:16;8362:23;;8124:267;;;;;:::o;8397:366::-;8539:3;8560:67;8624:2;8619:3;8560:67;:::i;:::-;8553:74;;8636:93;8725:3;8636:93;:::i;:::-;8754:2;8749:3;8745:12;8738:19;;8543:220;;;:::o;8769:366::-;8911:3;8932:67;8996:2;8991:3;8932:67;:::i;:::-;8925:74;;9008:93;9097:3;9008:93;:::i;:::-;9126:2;9121:3;9117:12;9110:19;;8915:220;;;:::o;9141:366::-;9283:3;9304:67;9368:2;9363:3;9304:67;:::i;:::-;9297:74;;9380:93;9469:3;9380:93;:::i;:::-;9498:2;9493:3;9489:12;9482:19;;9287:220;;;:::o;9513:366::-;9655:3;9676:67;9740:2;9735:3;9676:67;:::i;:::-;9669:74;;9752:93;9841:3;9752:93;:::i;:::-;9870:2;9865:3;9861:12;9854:19;;9659:220;;;:::o;9885:366::-;10027:3;10048:67;10112:2;10107:3;10048:67;:::i;:::-;10041:74;;10124:93;10213:3;10124:93;:::i;:::-;10242:2;10237:3;10233:12;10226:19;;10031:220;;;:::o;10257:366::-;10399:3;10420:67;10484:2;10479:3;10420:67;:::i;:::-;10413:74;;10496:93;10585:3;10496:93;:::i;:::-;10614:2;10609:3;10605:12;10598:19;;10403:220;;;:::o;10629:366::-;10771:3;10792:67;10856:2;10851:3;10792:67;:::i;:::-;10785:74;;10868:93;10957:3;10868:93;:::i;:::-;10986:2;10981:3;10977:12;10970:19;;10775:220;;;:::o;11001:366::-;11143:3;11164:67;11228:2;11223:3;11164:67;:::i;:::-;11157:74;;11240:93;11329:3;11240:93;:::i;:::-;11358:2;11353:3;11349:12;11342:19;;11147:220;;;:::o;11373:366::-;11515:3;11536:67;11600:2;11595:3;11536:67;:::i;:::-;11529:74;;11612:93;11701:3;11612:93;:::i;:::-;11730:2;11725:3;11721:12;11714:19;;11519:220;;;:::o;11745:366::-;11887:3;11908:67;11972:2;11967:3;11908:67;:::i;:::-;11901:74;;11984:93;12073:3;11984:93;:::i;:::-;12102:2;12097:3;12093:12;12086:19;;11891:220;;;:::o;12117:366::-;12259:3;12280:67;12344:2;12339:3;12280:67;:::i;:::-;12273:74;;12356:93;12445:3;12356:93;:::i;:::-;12474:2;12469:3;12465:12;12458:19;;12263:220;;;:::o;12489:366::-;12631:3;12652:67;12716:2;12711:3;12652:67;:::i;:::-;12645:74;;12728:93;12817:3;12728:93;:::i;:::-;12846:2;12841:3;12837:12;12830:19;;12635:220;;;:::o;12861:366::-;13003:3;13024:67;13088:2;13083:3;13024:67;:::i;:::-;13017:74;;13100:93;13189:3;13100:93;:::i;:::-;13218:2;13213:3;13209:12;13202:19;;13007:220;;;:::o;13233:366::-;13375:3;13396:67;13460:2;13455:3;13396:67;:::i;:::-;13389:74;;13472:93;13561:3;13472:93;:::i;:::-;13590:2;13585:3;13581:12;13574:19;;13379:220;;;:::o;13605:366::-;13747:3;13768:67;13832:2;13827:3;13768:67;:::i;:::-;13761:74;;13844:93;13933:3;13844:93;:::i;:::-;13962:2;13957:3;13953:12;13946:19;;13751:220;;;:::o;13977:366::-;14119:3;14140:67;14204:2;14199:3;14140:67;:::i;:::-;14133:74;;14216:93;14305:3;14216:93;:::i;:::-;14334:2;14329:3;14325:12;14318:19;;14123:220;;;:::o;14349:366::-;14491:3;14512:67;14576:2;14571:3;14512:67;:::i;:::-;14505:74;;14588:93;14677:3;14588:93;:::i;:::-;14706:2;14701:3;14697:12;14690:19;;14495:220;;;:::o;14721:366::-;14863:3;14884:67;14948:2;14943:3;14884:67;:::i;:::-;14877:74;;14960:93;15049:3;14960:93;:::i;:::-;15078:2;15073:3;15069:12;15062:19;;14867:220;;;:::o;15093:366::-;15235:3;15256:67;15320:2;15315:3;15256:67;:::i;:::-;15249:74;;15332:93;15421:3;15332:93;:::i;:::-;15450:2;15445:3;15441:12;15434:19;;15239:220;;;:::o;15465:366::-;15607:3;15628:67;15692:2;15687:3;15628:67;:::i;:::-;15621:74;;15704:93;15793:3;15704:93;:::i;:::-;15822:2;15817:3;15813:12;15806:19;;15611:220;;;:::o;15837:366::-;15979:3;16000:67;16064:2;16059:3;16000:67;:::i;:::-;15993:74;;16076:93;16165:3;16076:93;:::i;:::-;16194:2;16189:3;16185:12;16178:19;;15983:220;;;:::o;16209:366::-;16351:3;16372:67;16436:2;16431:3;16372:67;:::i;:::-;16365:74;;16448:93;16537:3;16448:93;:::i;:::-;16566:2;16561:3;16557:12;16550:19;;16355:220;;;:::o;16581:366::-;16723:3;16744:67;16808:2;16803:3;16744:67;:::i;:::-;16737:74;;16820:93;16909:3;16820:93;:::i;:::-;16938:2;16933:3;16929:12;16922:19;;16727:220;;;:::o;16953:108::-;17030:24;17048:5;17030:24;:::i;:::-;17025:3;17018:37;17008:53;;:::o;17067:118::-;17154:24;17172:5;17154:24;:::i;:::-;17149:3;17142:37;17132:53;;:::o;17191:435::-;17371:3;17393:95;17484:3;17475:6;17393:95;:::i;:::-;17386:102;;17505:95;17596:3;17587:6;17505:95;:::i;:::-;17498:102;;17617:3;17610:10;;17375:251;;;;;:::o;17632:222::-;17725:4;17763:2;17752:9;17748:18;17740:26;;17776:71;17844:1;17833:9;17829:17;17820:6;17776:71;:::i;:::-;17730:124;;;;:::o;17860:640::-;18055:4;18093:3;18082:9;18078:19;18070:27;;18107:71;18175:1;18164:9;18160:17;18151:6;18107:71;:::i;:::-;18188:72;18256:2;18245:9;18241:18;18232:6;18188:72;:::i;:::-;18270;18338:2;18327:9;18323:18;18314:6;18270:72;:::i;:::-;18389:9;18383:4;18379:20;18374:2;18363:9;18359:18;18352:48;18417:76;18488:4;18479:6;18417:76;:::i;:::-;18409:84;;18060:440;;;;;;;:::o;18506:373::-;18649:4;18687:2;18676:9;18672:18;18664:26;;18736:9;18730:4;18726:20;18722:1;18711:9;18707:17;18700:47;18764:108;18867:4;18858:6;18764:108;:::i;:::-;18756:116;;18654:225;;;;:::o;18885:210::-;18972:4;19010:2;18999:9;18995:18;18987:26;;19023:65;19085:1;19074:9;19070:17;19061:6;19023:65;:::i;:::-;18977:118;;;;:::o;19101:313::-;19214:4;19252:2;19241:9;19237:18;19229:26;;19301:9;19295:4;19291:20;19287:1;19276:9;19272:17;19265:47;19329:78;19402:4;19393:6;19329:78;:::i;:::-;19321:86;;19219:195;;;;:::o;19420:419::-;19586:4;19624:2;19613:9;19609:18;19601:26;;19673:9;19667:4;19663:20;19659:1;19648:9;19644:17;19637:47;19701:131;19827:4;19701:131;:::i;:::-;19693:139;;19591:248;;;:::o;19845:419::-;20011:4;20049:2;20038:9;20034:18;20026:26;;20098:9;20092:4;20088:20;20084:1;20073:9;20069:17;20062:47;20126:131;20252:4;20126:131;:::i;:::-;20118:139;;20016:248;;;:::o;20270:419::-;20436:4;20474:2;20463:9;20459:18;20451:26;;20523:9;20517:4;20513:20;20509:1;20498:9;20494:17;20487:47;20551:131;20677:4;20551:131;:::i;:::-;20543:139;;20441:248;;;:::o;20695:419::-;20861:4;20899:2;20888:9;20884:18;20876:26;;20948:9;20942:4;20938:20;20934:1;20923:9;20919:17;20912:47;20976:131;21102:4;20976:131;:::i;:::-;20968:139;;20866:248;;;:::o;21120:419::-;21286:4;21324:2;21313:9;21309:18;21301:26;;21373:9;21367:4;21363:20;21359:1;21348:9;21344:17;21337:47;21401:131;21527:4;21401:131;:::i;:::-;21393:139;;21291:248;;;:::o;21545:419::-;21711:4;21749:2;21738:9;21734:18;21726:26;;21798:9;21792:4;21788:20;21784:1;21773:9;21769:17;21762:47;21826:131;21952:4;21826:131;:::i;:::-;21818:139;;21716:248;;;:::o;21970:419::-;22136:4;22174:2;22163:9;22159:18;22151:26;;22223:9;22217:4;22213:20;22209:1;22198:9;22194:17;22187:47;22251:131;22377:4;22251:131;:::i;:::-;22243:139;;22141:248;;;:::o;22395:419::-;22561:4;22599:2;22588:9;22584:18;22576:26;;22648:9;22642:4;22638:20;22634:1;22623:9;22619:17;22612:47;22676:131;22802:4;22676:131;:::i;:::-;22668:139;;22566:248;;;:::o;22820:419::-;22986:4;23024:2;23013:9;23009:18;23001:26;;23073:9;23067:4;23063:20;23059:1;23048:9;23044:17;23037:47;23101:131;23227:4;23101:131;:::i;:::-;23093:139;;22991:248;;;:::o;23245:419::-;23411:4;23449:2;23438:9;23434:18;23426:26;;23498:9;23492:4;23488:20;23484:1;23473:9;23469:17;23462:47;23526:131;23652:4;23526:131;:::i;:::-;23518:139;;23416:248;;;:::o;23670:419::-;23836:4;23874:2;23863:9;23859:18;23851:26;;23923:9;23917:4;23913:20;23909:1;23898:9;23894:17;23887:47;23951:131;24077:4;23951:131;:::i;:::-;23943:139;;23841:248;;;:::o;24095:419::-;24261:4;24299:2;24288:9;24284:18;24276:26;;24348:9;24342:4;24338:20;24334:1;24323:9;24319:17;24312:47;24376:131;24502:4;24376:131;:::i;:::-;24368:139;;24266:248;;;:::o;24520:419::-;24686:4;24724:2;24713:9;24709:18;24701:26;;24773:9;24767:4;24763:20;24759:1;24748:9;24744:17;24737:47;24801:131;24927:4;24801:131;:::i;:::-;24793:139;;24691:248;;;:::o;24945:419::-;25111:4;25149:2;25138:9;25134:18;25126:26;;25198:9;25192:4;25188:20;25184:1;25173:9;25169:17;25162:47;25226:131;25352:4;25226:131;:::i;:::-;25218:139;;25116:248;;;:::o;25370:419::-;25536:4;25574:2;25563:9;25559:18;25551:26;;25623:9;25617:4;25613:20;25609:1;25598:9;25594:17;25587:47;25651:131;25777:4;25651:131;:::i;:::-;25643:139;;25541:248;;;:::o;25795:419::-;25961:4;25999:2;25988:9;25984:18;25976:26;;26048:9;26042:4;26038:20;26034:1;26023:9;26019:17;26012:47;26076:131;26202:4;26076:131;:::i;:::-;26068:139;;25966:248;;;:::o;26220:419::-;26386:4;26424:2;26413:9;26409:18;26401:26;;26473:9;26467:4;26463:20;26459:1;26448:9;26444:17;26437:47;26501:131;26627:4;26501:131;:::i;:::-;26493:139;;26391:248;;;:::o;26645:419::-;26811:4;26849:2;26838:9;26834:18;26826:26;;26898:9;26892:4;26888:20;26884:1;26873:9;26869:17;26862:47;26926:131;27052:4;26926:131;:::i;:::-;26918:139;;26816:248;;;:::o;27070:419::-;27236:4;27274:2;27263:9;27259:18;27251:26;;27323:9;27317:4;27313:20;27309:1;27298:9;27294:17;27287:47;27351:131;27477:4;27351:131;:::i;:::-;27343:139;;27241:248;;;:::o;27495:419::-;27661:4;27699:2;27688:9;27684:18;27676:26;;27748:9;27742:4;27738:20;27734:1;27723:9;27719:17;27712:47;27776:131;27902:4;27776:131;:::i;:::-;27768:139;;27666:248;;;:::o;27920:419::-;28086:4;28124:2;28113:9;28109:18;28101:26;;28173:9;28167:4;28163:20;28159:1;28148:9;28144:17;28137:47;28201:131;28327:4;28201:131;:::i;:::-;28193:139;;28091:248;;;:::o;28345:419::-;28511:4;28549:2;28538:9;28534:18;28526:26;;28598:9;28592:4;28588:20;28584:1;28573:9;28569:17;28562:47;28626:131;28752:4;28626:131;:::i;:::-;28618:139;;28516:248;;;:::o;28770:419::-;28936:4;28974:2;28963:9;28959:18;28951:26;;29023:9;29017:4;29013:20;29009:1;28998:9;28994:17;28987:47;29051:131;29177:4;29051:131;:::i;:::-;29043:139;;28941:248;;;:::o;29195:222::-;29288:4;29326:2;29315:9;29311:18;29303:26;;29339:71;29407:1;29396:9;29392:17;29383:6;29339:71;:::i;:::-;29293:124;;;;:::o;29423:129::-;29457:6;29484:20;;:::i;:::-;29474:30;;29513:33;29541:4;29533:6;29513:33;:::i;:::-;29464:88;;;:::o;29558:75::-;29591:6;29624:2;29618:9;29608:19;;29598:35;:::o;29639:307::-;29700:4;29790:18;29782:6;29779:30;29776:2;;;29812:18;;:::i;:::-;29776:2;29850:29;29872:6;29850:29;:::i;:::-;29842:37;;29934:4;29928;29924:15;29916:23;;29705:241;;;:::o;29952:308::-;30014:4;30104:18;30096:6;30093:30;30090:2;;;30126:18;;:::i;:::-;30090:2;30164:29;30186:6;30164:29;:::i;:::-;30156:37;;30248:4;30242;30238:15;30230:23;;30019:241;;;:::o;30266:132::-;30333:4;30356:3;30348:11;;30386:4;30381:3;30377:14;30369:22;;30338:60;;;:::o;30404:114::-;30471:6;30505:5;30499:12;30489:22;;30478:40;;;:::o;30524:98::-;30575:6;30609:5;30603:12;30593:22;;30582:40;;;:::o;30628:99::-;30680:6;30714:5;30708:12;30698:22;;30687:40;;;:::o;30733:113::-;30803:4;30835;30830:3;30826:14;30818:22;;30808:38;;;:::o;30852:184::-;30951:11;30985:6;30980:3;30973:19;31025:4;31020:3;31016:14;31001:29;;30963:73;;;;:::o;31042:168::-;31125:11;31159:6;31154:3;31147:19;31199:4;31194:3;31190:14;31175:29;;31137:73;;;;:::o;31216:169::-;31300:11;31334:6;31329:3;31322:19;31374:4;31369:3;31365:14;31350:29;;31312:73;;;;:::o;31391:148::-;31493:11;31530:3;31515:18;;31505:34;;;;:::o;31545:305::-;31585:3;31604:20;31622:1;31604:20;:::i;:::-;31599:25;;31638:20;31656:1;31638:20;:::i;:::-;31633:25;;31792:1;31724:66;31720:74;31717:1;31714:81;31711:2;;;31798:18;;:::i;:::-;31711:2;31842:1;31839;31835:9;31828:16;;31589:261;;;;:::o;31856:185::-;31896:1;31913:20;31931:1;31913:20;:::i;:::-;31908:25;;31947:20;31965:1;31947:20;:::i;:::-;31942:25;;31986:1;31976:2;;31991:18;;:::i;:::-;31976:2;32033:1;32030;32026:9;32021:14;;31898:143;;;;:::o;32047:348::-;32087:7;32110:20;32128:1;32110:20;:::i;:::-;32105:25;;32144:20;32162:1;32144:20;:::i;:::-;32139:25;;32332:1;32264:66;32260:74;32257:1;32254:81;32249:1;32242:9;32235:17;32231:105;32228:2;;;32339:18;;:::i;:::-;32228:2;32387:1;32384;32380:9;32369:20;;32095:300;;;;:::o;32401:191::-;32441:4;32461:20;32479:1;32461:20;:::i;:::-;32456:25;;32495:20;32513:1;32495:20;:::i;:::-;32490:25;;32534:1;32531;32528:8;32525:2;;;32539:18;;:::i;:::-;32525:2;32584:1;32581;32577:9;32569:17;;32446:146;;;;:::o;32598:96::-;32635:7;32664:24;32682:5;32664:24;:::i;:::-;32653:35;;32643:51;;;:::o;32700:90::-;32734:7;32777:5;32770:13;32763:21;32752:32;;32742:48;;;:::o;32796:149::-;32832:7;32872:66;32865:5;32861:78;32850:89;;32840:105;;;:::o;32951:126::-;32988:7;33028:42;33021:5;33017:54;33006:65;;32996:81;;;:::o;33083:77::-;33120:7;33149:5;33138:16;;33128:32;;;:::o;33166:154::-;33250:6;33245:3;33240;33227:30;33312:1;33303:6;33298:3;33294:16;33287:27;33217:103;;;:::o;33326:307::-;33394:1;33404:113;33418:6;33415:1;33412:13;33404:113;;;33503:1;33498:3;33494:11;33488:18;33484:1;33479:3;33475:11;33468:39;33440:2;33437:1;33433:10;33428:15;;33404:113;;;33535:6;33532:1;33529:13;33526:2;;;33615:1;33606:6;33601:3;33597:16;33590:27;33526:2;33375:258;;;;:::o;33639:320::-;33683:6;33720:1;33714:4;33710:12;33700:22;;33767:1;33761:4;33757:12;33788:18;33778:2;;33844:4;33836:6;33832:17;33822:27;;33778:2;33906;33898:6;33895:14;33875:18;33872:38;33869:2;;;33925:18;;:::i;:::-;33869:2;33690:269;;;;:::o;33965:281::-;34048:27;34070:4;34048:27;:::i;:::-;34040:6;34036:40;34178:6;34166:10;34163:22;34142:18;34130:10;34127:34;34124:62;34121:2;;;34189:18;;:::i;:::-;34121:2;34229:10;34225:2;34218:22;34008:238;;;:::o;34252:233::-;34291:3;34314:24;34332:5;34314:24;:::i;:::-;34305:33;;34360:66;34353:5;34350:77;34347:2;;;34430:18;;:::i;:::-;34347:2;34477:1;34470:5;34466:13;34459:20;;34295:190;;;:::o;34491:176::-;34523:1;34540:20;34558:1;34540:20;:::i;:::-;34535:25;;34574:20;34592:1;34574:20;:::i;:::-;34569:25;;34613:1;34603:2;;34618:18;;:::i;:::-;34603:2;34659:1;34656;34652:9;34647:14;;34525:142;;;;:::o;34673:180::-;34721:77;34718:1;34711:88;34818:4;34815:1;34808:15;34842:4;34839:1;34832:15;34859:180;34907:77;34904:1;34897:88;35004:4;35001:1;34994:15;35028:4;35025:1;35018:15;35045:180;35093:77;35090:1;35083:88;35190:4;35187:1;35180:15;35214:4;35211:1;35204:15;35231:180;35279:77;35276:1;35269:88;35376:4;35373:1;35366:15;35400:4;35397:1;35390:15;35417:102;35458:6;35509:2;35505:7;35500:2;35493:5;35489:14;35485:28;35475:38;;35465:54;;;:::o;35525:230::-;35665:34;35661:1;35653:6;35649:14;35642:58;35734:13;35729:2;35721:6;35717:15;35710:38;35631:124;:::o;35761:237::-;35901:34;35897:1;35889:6;35885:14;35878:58;35970:20;35965:2;35957:6;35953:15;35946:45;35867:131;:::o;36004:225::-;36144:34;36140:1;36132:6;36128:14;36121:58;36213:8;36208:2;36200:6;36196:15;36189:33;36110:119;:::o;36235:178::-;36375:30;36371:1;36363:6;36359:14;36352:54;36341:72;:::o;36419:223::-;36559:34;36555:1;36547:6;36543:14;36536:58;36628:6;36623:2;36615:6;36611:15;36604:31;36525:117;:::o;36648:175::-;36788:27;36784:1;36776:6;36772:14;36765:51;36754:69;:::o;36829:231::-;36969:34;36965:1;36957:6;36953:14;36946:58;37038:14;37033:2;37025:6;37021:15;37014:39;36935:125;:::o;37066:243::-;37206:34;37202:1;37194:6;37190:14;37183:58;37275:26;37270:2;37262:6;37258:15;37251:51;37172:137;:::o;37315:229::-;37455:34;37451:1;37443:6;37439:14;37432:58;37524:12;37519:2;37511:6;37507:15;37500:37;37421:123;:::o;37550:228::-;37690:34;37686:1;37678:6;37674:14;37667:58;37759:11;37754:2;37746:6;37742:15;37735:36;37656:122;:::o;37784:173::-;37924:25;37920:1;37912:6;37908:14;37901:49;37890:67;:::o;37963:165::-;38103:17;38099:1;38091:6;38087:14;38080:41;38069:59;:::o;38134:171::-;38274:23;38270:1;38262:6;38258:14;38251:47;38240:65;:::o;38311:182::-;38451:34;38447:1;38439:6;38435:14;38428:58;38417:76;:::o;38499:231::-;38639:34;38635:1;38627:6;38623:14;38616:58;38708:14;38703:2;38695:6;38691:15;38684:39;38605:125;:::o;38736:182::-;38876:34;38872:1;38864:6;38860:14;38853:58;38842:76;:::o;38924:228::-;39064:34;39060:1;39052:6;39048:14;39041:58;39133:11;39128:2;39120:6;39116:15;39109:36;39030:122;:::o;39158:234::-;39298:34;39294:1;39286:6;39282:14;39275:58;39367:17;39362:2;39354:6;39350:15;39343:42;39264:128;:::o;39398:220::-;39538:34;39534:1;39526:6;39522:14;39515:58;39607:3;39602:2;39594:6;39590:15;39583:28;39504:114;:::o;39624:176::-;39764:28;39760:1;39752:6;39748:14;39741:52;39730:70;:::o;39806:236::-;39946:34;39942:1;39934:6;39930:14;39923:58;40015:19;40010:2;40002:6;39998:15;39991:44;39912:130;:::o;40048:175::-;40188:27;40184:1;40176:6;40172:14;40165:51;40154:69;:::o;40229:231::-;40369:34;40365:1;40357:6;40353:14;40346:58;40438:14;40433:2;40425:6;40421:15;40414:39;40335:125;:::o;40466:122::-;40539:24;40557:5;40539:24;:::i;:::-;40532:5;40529:35;40519:2;;40578:1;40575;40568:12;40519:2;40509:79;:::o;40594:116::-;40664:21;40679:5;40664:21;:::i;:::-;40657:5;40654:32;40644:2;;40700:1;40697;40690:12;40644:2;40634:76;:::o;40716:120::-;40788:23;40805:5;40788:23;:::i;:::-;40781:5;40778:34;40768:2;;40826:1;40823;40816:12;40768:2;40758:78;:::o;40842:122::-;40915:24;40933:5;40915:24;:::i;:::-;40908:5;40905:35;40895:2;;40954:1;40951;40944:12;40895:2;40885:79;:::o

Swarm Source

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