ETH Price: $3,312.67 (+1.94%)
Gas: 3 Gwei

Token

Azuki Elementals (AE)
 

Overview

Max Total Supply

107 AE

Holders

100

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
knightnah.eth
Balance
1 AE
0x47bA2d564d75677485638acfFe54A5CAB90807Fa
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
AzukiElementals

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-06-27
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

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: address zero is not a valid owner");
        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: invalid token ID");
        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) {
        _requireMinted(tokenId);

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

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

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token 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: caller is not token 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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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);

        _afterTokenTransfer(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);

        _afterTokenTransfer(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 from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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

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


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

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: contracts/nft/AzukiElementals.sol


// @openzeppelin v3.2.0
pragma solidity ^0.8.0;





contract AzukiElementals is ERC721Enumerable, Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIdTracker;

    constructor() public ERC721("Azuki Elementals", "AE") {}

    mapping(address => uint256) public addressMintedCount;
    mapping(address => uint256) public addressFreeMinted;
    uint256 public mintPrice = 9900000000000000;
    string private _baseTokenURI;

    function mint(uint64 quantity) external payable {
        require(msg.sender == tx.origin, "Be not allowed !");
        if (quantity == 1) {
            if (msg.value == 0) {
                require(
                    addressFreeMinted[msg.sender] == 0,
                    "Already free mint !"
                );
                addressFreeMinted[msg.sender] += 1;
            } else {
                require(msg.value >= mintPrice, "Insufficient amount !");
            }
        } else {
            require(msg.value >= mintPrice * quantity, "Insufficient amount !");
        }

        addressMintedCount[msg.sender] += quantity;

        for (uint256 i = 0; i < quantity; i++) {
            _mint(msg.sender, _tokenIdTracker.current());
            _tokenIdTracker.increment();
        }
    }

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

    function setBaseUri(string memory _uri) external onlyOwner {
        _baseTokenURI = _uri;
    }

    function setMintPrice(uint256 price) external onlyOwner {
        mintPrice = price;
    }

    function withdrow() external onlyOwner {
        address payable to = payable(msg.sender);
        to.transfer(address(this).balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressFreeMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"quantity","type":"uint64"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrow","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405266232bff5f46c000600e553480156200001c57600080fd5b506040518060400160405280601081526020017f417a756b6920456c656d656e74616c73000000000000000000000000000000008152506040518060400160405280600281526020017f414500000000000000000000000000000000000000000000000000000000000081525081600090816200009a91906200041d565b508060019081620000ac91906200041d565b505050620000cf620000c3620000d560201b60201c565b620000dd60201b60201c565b62000504565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200022557607f821691505b6020821081036200023b576200023a620001dd565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002a57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000266565b620002b1868362000266565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620002fe620002f8620002f284620002c9565b620002d3565b620002c9565b9050919050565b6000819050919050565b6200031a83620002dd565b62000332620003298262000305565b84845462000273565b825550505050565b600090565b620003496200033a565b620003568184846200030f565b505050565b5b818110156200037e57620003726000826200033f565b6001810190506200035c565b5050565b601f821115620003cd57620003978162000241565b620003a28462000256565b81016020851015620003b2578190505b620003ca620003c18562000256565b8301826200035b565b50505b505050565b600082821c905092915050565b6000620003f260001984600802620003d2565b1980831691505092915050565b60006200040d8383620003df565b9150826002028217905092915050565b6200042882620001a3565b67ffffffffffffffff811115620004445762000443620001ae565b5b6200045082546200020c565b6200045d82828562000382565b600060209050601f83116001811462000495576000841562000480578287015190505b6200048c8582620003ff565b865550620004fc565b601f198416620004a58662000241565b60005b82811015620004cf57848901518255600182019150602085019450602081019050620004a8565b86831015620004ef5784890151620004eb601f891682620003df565b8355505b6001600288020188555050505b505050505050565b613b0d80620005146000396000f3fe6080604052600436106101815760003560e01c8063715018a6116100d1578063b2e3ef2c1161008a578063e985e9c511610064578063e985e9c5146105a6578063f2fde38b146105e3578063f4a0a5281461060c578063fb9d09c81461063557610181565b8063b2e3ef2c14610503578063b88d4fde14610540578063c87b56dd1461056957610181565b8063715018a6146104075780638c5db7761461041e5780638da5cb5b1461045b57806395d89b4114610486578063a0bcfc7f146104b1578063a22cb465146104da57610181565b80632f745c591161013e5780634f6ccce7116101185780634f6ccce7146103255780636352211e146103625780636817c76c1461039f57806370a08231146103ca57610181565b80632f745c59146102a85780633b874521146102e557806342842e0e146102fc57610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b57806318160ddd1461025457806323b872dd1461027f575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a891906124ed565b610651565b6040516101ba9190612535565b60405180910390f35b3480156101cf57600080fd5b506101d86106cb565b6040516101e591906125e0565b60405180910390f35b3480156101fa57600080fd5b5061021560048036038101906102109190612638565b61075d565b60405161022291906126a6565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d91906126ed565b6107a3565b005b34801561026057600080fd5b506102696108ba565b604051610276919061273c565b60405180910390f35b34801561028b57600080fd5b506102a660048036038101906102a19190612757565b6108c7565b005b3480156102b457600080fd5b506102cf60048036038101906102ca91906126ed565b610927565b6040516102dc919061273c565b60405180910390f35b3480156102f157600080fd5b506102fa6109cc565b005b34801561030857600080fd5b50610323600480360381019061031e9190612757565b610a23565b005b34801561033157600080fd5b5061034c60048036038101906103479190612638565b610a43565b604051610359919061273c565b60405180910390f35b34801561036e57600080fd5b5061038960048036038101906103849190612638565b610ab4565b60405161039691906126a6565b60405180910390f35b3480156103ab57600080fd5b506103b4610b65565b6040516103c1919061273c565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec91906127aa565b610b6b565b6040516103fe919061273c565b60405180910390f35b34801561041357600080fd5b5061041c610c22565b005b34801561042a57600080fd5b50610445600480360381019061044091906127aa565b610c36565b604051610452919061273c565b60405180910390f35b34801561046757600080fd5b50610470610c4e565b60405161047d91906126a6565b60405180910390f35b34801561049257600080fd5b5061049b610c78565b6040516104a891906125e0565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d3919061290c565b610d0a565b005b3480156104e657600080fd5b5061050160048036038101906104fc9190612981565b610d25565b005b34801561050f57600080fd5b5061052a600480360381019061052591906127aa565b610d3b565b604051610537919061273c565b60405180910390f35b34801561054c57600080fd5b5061056760048036038101906105629190612a62565b610d53565b005b34801561057557600080fd5b50610590600480360381019061058b9190612638565b610db5565b60405161059d91906125e0565b60405180910390f35b3480156105b257600080fd5b506105cd60048036038101906105c89190612ae5565b610e1d565b6040516105da9190612535565b60405180910390f35b3480156105ef57600080fd5b5061060a600480360381019061060591906127aa565b610eb1565b005b34801561061857600080fd5b50610633600480360381019061062e9190612638565b610f34565b005b61064f600480360381019061064a9190612b65565b610f46565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106c457506106c3826111fb565b5b9050919050565b6060600080546106da90612bc1565b80601f016020809104026020016040519081016040528092919081815260200182805461070690612bc1565b80156107535780601f1061072857610100808354040283529160200191610753565b820191906000526020600020905b81548152906001019060200180831161073657829003601f168201915b5050505050905090565b6000610768826112dd565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107ae82610ab4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361081e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081590612c64565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661083d611328565b73ffffffffffffffffffffffffffffffffffffffff16148061086c575061086b81610866611328565b610e1d565b5b6108ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a290612cf6565b60405180910390fd5b6108b58383611330565b505050565b6000600880549050905090565b6108d86108d2611328565b826113e9565b610917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090e90612d88565b60405180910390fd5b61092283838361147e565b505050565b600061093283610b6b565b8210610973576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096a90612e1a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109d46116e4565b60003390508073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610a1f573d6000803e3d6000fd5b5050565b610a3e83838360405180602001604052806000815250610d53565b505050565b6000610a4d6108ba565b8210610a8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8590612eac565b60405180910390fd5b60088281548110610aa257610aa1612ecc565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5390612f47565b60405180910390fd5b80915050919050565b600e5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd290612fd9565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c2a6116e4565b610c346000611762565b565b600c6020528060005260406000206000915090505481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610c8790612bc1565b80601f0160208091040260200160405190810160405280929190818152602001828054610cb390612bc1565b8015610d005780601f10610cd557610100808354040283529160200191610d00565b820191906000526020600020905b815481529060010190602001808311610ce357829003601f168201915b5050505050905090565b610d126116e4565b80600f9081610d2191906131a5565b5050565b610d37610d30611328565b8383611828565b5050565b600d6020528060005260406000206000915090505481565b610d64610d5e611328565b836113e9565b610da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9a90612d88565b60405180910390fd5b610daf84848484611994565b50505050565b6060610dc0826112dd565b6000610dca6119f0565b90506000815111610dea5760405180602001604052806000815250610e15565b80610df484611a82565b604051602001610e059291906132b3565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610eb96116e4565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1f90613349565b60405180910390fd5b610f3181611762565b50565b610f3c6116e4565b80600e8190555050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fab906133b5565b60405180910390fd5b60018167ffffffffffffffff16036110f757600034036110ac576000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104790613421565b60405180910390fd5b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110a09190613470565b925050819055506110f2565b600e543410156110f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e8906134f0565b60405180910390fd5b5b611152565b8067ffffffffffffffff16600e5461110f9190613510565b341015611151576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611148906134f0565b60405180910390fd5b5b8067ffffffffffffffff16600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111ab9190613470565b9250508190555060005b8167ffffffffffffffff168110156111f7576111da336111d5600b611be2565b611bf0565b6111e4600b611dc9565b80806111ef90613552565b9150506111b5565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806112c657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806112d657506112d582611ddf565b5b9050919050565b6112e681611e49565b611325576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131c90612f47565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166113a383610ab4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806113f583610ab4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061143757506114368185610e1d565b5b8061147557508373ffffffffffffffffffffffffffffffffffffffff1661145d8461075d565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661149e82610ab4565b73ffffffffffffffffffffffffffffffffffffffff16146114f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114eb9061360c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155a9061369e565b60405180910390fd5b61156e838383611eb5565b611579600082611330565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115c991906136be565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116209190613470565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46116df838383611fc7565b505050565b6116ec611328565b73ffffffffffffffffffffffffffffffffffffffff1661170a610c4e565b73ffffffffffffffffffffffffffffffffffffffff1614611760576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117579061373e565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906137aa565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119879190612535565b60405180910390a3505050565b61199f84848461147e565b6119ab84848484611fcc565b6119ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e19061383c565b60405180910390fd5b50505050565b6060600f80546119ff90612bc1565b80601f0160208091040260200160405190810160405280929190818152602001828054611a2b90612bc1565b8015611a785780601f10611a4d57610100808354040283529160200191611a78565b820191906000526020600020905b815481529060010190602001808311611a5b57829003601f168201915b5050505050905090565b606060008203611ac9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611bdd565b600082905060005b60008214611afb578080611ae490613552565b915050600a82611af4919061388b565b9150611ad1565b60008167ffffffffffffffff811115611b1757611b166127e1565b5b6040519080825280601f01601f191660200182016040528015611b495781602001600182028036833780820191505090505b5090505b60008514611bd657600182611b6291906136be565b9150600a85611b7191906138bc565b6030611b7d9190613470565b60f81b818381518110611b9357611b92612ecc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611bcf919061388b565b9450611b4d565b8093505050505b919050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5690613939565b60405180910390fd5b611c6881611e49565b15611ca8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9f906139a5565b60405180910390fd5b611cb460008383611eb5565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d049190613470565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611dc560008383611fc7565b5050565b6001816000016000828254019250508190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b611ec0838383612153565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f0257611efd81612158565b611f41565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611f4057611f3f83826121a1565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f8357611f7e8161230e565b611fc2565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611fc157611fc082826123df565b5b5b505050565b505050565b6000611fed8473ffffffffffffffffffffffffffffffffffffffff1661245e565b15612146578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612016611328565b8786866040518563ffffffff1660e01b81526004016120389493929190613a1a565b6020604051808303816000875af192505050801561207457506040513d601f19601f820116820180604052508101906120719190613a7b565b60015b6120f6573d80600081146120a4576040519150601f19603f3d011682016040523d82523d6000602084013e6120a9565b606091505b5060008151036120ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e59061383c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061214b565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016121ae84610b6b565b6121b891906136be565b905060006007600084815260200190815260200160002054905081811461229d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061232291906136be565b905060006009600084815260200190815260200160002054905060006008838154811061235257612351612ecc565b5b90600052602060002001549050806008838154811061237457612373612ecc565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806123c3576123c2613aa8565b5b6001900381819060005260206000200160009055905550505050565b60006123ea83610b6b565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6124ca81612495565b81146124d557600080fd5b50565b6000813590506124e7816124c1565b92915050565b6000602082840312156125035761250261248b565b5b6000612511848285016124d8565b91505092915050565b60008115159050919050565b61252f8161251a565b82525050565b600060208201905061254a6000830184612526565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561258a57808201518184015260208101905061256f565b60008484015250505050565b6000601f19601f8301169050919050565b60006125b282612550565b6125bc818561255b565b93506125cc81856020860161256c565b6125d581612596565b840191505092915050565b600060208201905081810360008301526125fa81846125a7565b905092915050565b6000819050919050565b61261581612602565b811461262057600080fd5b50565b6000813590506126328161260c565b92915050565b60006020828403121561264e5761264d61248b565b5b600061265c84828501612623565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061269082612665565b9050919050565b6126a081612685565b82525050565b60006020820190506126bb6000830184612697565b92915050565b6126ca81612685565b81146126d557600080fd5b50565b6000813590506126e7816126c1565b92915050565b600080604083850312156127045761270361248b565b5b6000612712858286016126d8565b925050602061272385828601612623565b9150509250929050565b61273681612602565b82525050565b6000602082019050612751600083018461272d565b92915050565b6000806000606084860312156127705761276f61248b565b5b600061277e868287016126d8565b935050602061278f868287016126d8565b92505060406127a086828701612623565b9150509250925092565b6000602082840312156127c0576127bf61248b565b5b60006127ce848285016126d8565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61281982612596565b810181811067ffffffffffffffff82111715612838576128376127e1565b5b80604052505050565b600061284b612481565b90506128578282612810565b919050565b600067ffffffffffffffff821115612877576128766127e1565b5b61288082612596565b9050602081019050919050565b82818337600083830152505050565b60006128af6128aa8461285c565b612841565b9050828152602081018484840111156128cb576128ca6127dc565b5b6128d684828561288d565b509392505050565b600082601f8301126128f3576128f26127d7565b5b813561290384826020860161289c565b91505092915050565b6000602082840312156129225761292161248b565b5b600082013567ffffffffffffffff8111156129405761293f612490565b5b61294c848285016128de565b91505092915050565b61295e8161251a565b811461296957600080fd5b50565b60008135905061297b81612955565b92915050565b600080604083850312156129985761299761248b565b5b60006129a6858286016126d8565b92505060206129b78582860161296c565b9150509250929050565b600067ffffffffffffffff8211156129dc576129db6127e1565b5b6129e582612596565b9050602081019050919050565b6000612a05612a00846129c1565b612841565b905082815260208101848484011115612a2157612a206127dc565b5b612a2c84828561288d565b509392505050565b600082601f830112612a4957612a486127d7565b5b8135612a598482602086016129f2565b91505092915050565b60008060008060808587031215612a7c57612a7b61248b565b5b6000612a8a878288016126d8565b9450506020612a9b878288016126d8565b9350506040612aac87828801612623565b925050606085013567ffffffffffffffff811115612acd57612acc612490565b5b612ad987828801612a34565b91505092959194509250565b60008060408385031215612afc57612afb61248b565b5b6000612b0a858286016126d8565b9250506020612b1b858286016126d8565b9150509250929050565b600067ffffffffffffffff82169050919050565b612b4281612b25565b8114612b4d57600080fd5b50565b600081359050612b5f81612b39565b92915050565b600060208284031215612b7b57612b7a61248b565b5b6000612b8984828501612b50565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612bd957607f821691505b602082108103612bec57612beb612b92565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612c4e60218361255b565b9150612c5982612bf2565b604082019050919050565b60006020820190508181036000830152612c7d81612c41565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000612ce0603e8361255b565b9150612ceb82612c84565b604082019050919050565b60006020820190508181036000830152612d0f81612cd3565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000612d72602e8361255b565b9150612d7d82612d16565b604082019050919050565b60006020820190508181036000830152612da181612d65565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000612e04602b8361255b565b9150612e0f82612da8565b604082019050919050565b60006020820190508181036000830152612e3381612df7565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000612e96602c8361255b565b9150612ea182612e3a565b604082019050919050565b60006020820190508181036000830152612ec581612e89565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612f3160188361255b565b9150612f3c82612efb565b602082019050919050565b60006020820190508181036000830152612f6081612f24565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612fc360298361255b565b9150612fce82612f67565b604082019050919050565b60006020820190508181036000830152612ff281612fb6565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261305b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261301e565b613065868361301e565b95508019841693508086168417925050509392505050565b6000819050919050565b60006130a261309d61309884612602565b61307d565b612602565b9050919050565b6000819050919050565b6130bc83613087565b6130d06130c8826130a9565b84845461302b565b825550505050565b600090565b6130e56130d8565b6130f08184846130b3565b505050565b5b81811015613114576131096000826130dd565b6001810190506130f6565b5050565b601f8211156131595761312a81612ff9565b6131338461300e565b81016020851015613142578190505b61315661314e8561300e565b8301826130f5565b50505b505050565b600082821c905092915050565b600061317c6000198460080261315e565b1980831691505092915050565b6000613195838361316b565b9150826002028217905092915050565b6131ae82612550565b67ffffffffffffffff8111156131c7576131c66127e1565b5b6131d18254612bc1565b6131dc828285613118565b600060209050601f83116001811461320f57600084156131fd578287015190505b6132078582613189565b86555061326f565b601f19841661321d86612ff9565b60005b8281101561324557848901518255600182019150602085019450602081019050613220565b86831015613262578489015161325e601f89168261316b565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b600061328d82612550565b6132978185613277565b93506132a781856020860161256c565b80840191505092915050565b60006132bf8285613282565b91506132cb8284613282565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061333360268361255b565b915061333e826132d7565b604082019050919050565b6000602082019050818103600083015261336281613326565b9050919050565b7f4265206e6f7420616c6c6f776564202100000000000000000000000000000000600082015250565b600061339f60108361255b565b91506133aa82613369565b602082019050919050565b600060208201905081810360008301526133ce81613392565b9050919050565b7f416c72656164792066726565206d696e74202100000000000000000000000000600082015250565b600061340b60138361255b565b9150613416826133d5565b602082019050919050565b6000602082019050818103600083015261343a816133fe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061347b82612602565b915061348683612602565b925082820190508082111561349e5761349d613441565b5b92915050565b7f496e73756666696369656e7420616d6f756e7420210000000000000000000000600082015250565b60006134da60158361255b565b91506134e5826134a4565b602082019050919050565b60006020820190508181036000830152613509816134cd565b9050919050565b600061351b82612602565b915061352683612602565b925082820261353481612602565b9150828204841483151761354b5761354a613441565b5b5092915050565b600061355d82612602565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361358f5761358e613441565b5b600182019050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006135f660258361255b565b91506136018261359a565b604082019050919050565b60006020820190508181036000830152613625816135e9565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061368860248361255b565b91506136938261362c565b604082019050919050565b600060208201905081810360008301526136b78161367b565b9050919050565b60006136c982612602565b91506136d483612602565b92508282039050818111156136ec576136eb613441565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061372860208361255b565b9150613733826136f2565b602082019050919050565b600060208201905081810360008301526137578161371b565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061379460198361255b565b915061379f8261375e565b602082019050919050565b600060208201905081810360008301526137c381613787565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061382660328361255b565b9150613831826137ca565b604082019050919050565b6000602082019050818103600083015261385581613819565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061389682612602565b91506138a183612602565b9250826138b1576138b061385c565b5b828204905092915050565b60006138c782612602565b91506138d283612602565b9250826138e2576138e161385c565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061392360208361255b565b915061392e826138ed565b602082019050919050565b6000602082019050818103600083015261395281613916565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061398f601c8361255b565b915061399a82613959565b602082019050919050565b600060208201905081810360008301526139be81613982565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006139ec826139c5565b6139f681856139d0565b9350613a0681856020860161256c565b613a0f81612596565b840191505092915050565b6000608082019050613a2f6000830187612697565b613a3c6020830186612697565b613a49604083018561272d565b8181036060830152613a5b81846139e1565b905095945050505050565b600081519050613a75816124c1565b92915050565b600060208284031215613a9157613a9061248b565b5b6000613a9f84828501613a66565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220cda448aeb4342b04729cb5899e0c99a0b930ce6c69b18709d2a671218259f9cd64736f6c63430008120033

Deployed Bytecode

0x6080604052600436106101815760003560e01c8063715018a6116100d1578063b2e3ef2c1161008a578063e985e9c511610064578063e985e9c5146105a6578063f2fde38b146105e3578063f4a0a5281461060c578063fb9d09c81461063557610181565b8063b2e3ef2c14610503578063b88d4fde14610540578063c87b56dd1461056957610181565b8063715018a6146104075780638c5db7761461041e5780638da5cb5b1461045b57806395d89b4114610486578063a0bcfc7f146104b1578063a22cb465146104da57610181565b80632f745c591161013e5780634f6ccce7116101185780634f6ccce7146103255780636352211e146103625780636817c76c1461039f57806370a08231146103ca57610181565b80632f745c59146102a85780633b874521146102e557806342842e0e146102fc57610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b57806318160ddd1461025457806323b872dd1461027f575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a891906124ed565b610651565b6040516101ba9190612535565b60405180910390f35b3480156101cf57600080fd5b506101d86106cb565b6040516101e591906125e0565b60405180910390f35b3480156101fa57600080fd5b5061021560048036038101906102109190612638565b61075d565b60405161022291906126a6565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d91906126ed565b6107a3565b005b34801561026057600080fd5b506102696108ba565b604051610276919061273c565b60405180910390f35b34801561028b57600080fd5b506102a660048036038101906102a19190612757565b6108c7565b005b3480156102b457600080fd5b506102cf60048036038101906102ca91906126ed565b610927565b6040516102dc919061273c565b60405180910390f35b3480156102f157600080fd5b506102fa6109cc565b005b34801561030857600080fd5b50610323600480360381019061031e9190612757565b610a23565b005b34801561033157600080fd5b5061034c60048036038101906103479190612638565b610a43565b604051610359919061273c565b60405180910390f35b34801561036e57600080fd5b5061038960048036038101906103849190612638565b610ab4565b60405161039691906126a6565b60405180910390f35b3480156103ab57600080fd5b506103b4610b65565b6040516103c1919061273c565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec91906127aa565b610b6b565b6040516103fe919061273c565b60405180910390f35b34801561041357600080fd5b5061041c610c22565b005b34801561042a57600080fd5b50610445600480360381019061044091906127aa565b610c36565b604051610452919061273c565b60405180910390f35b34801561046757600080fd5b50610470610c4e565b60405161047d91906126a6565b60405180910390f35b34801561049257600080fd5b5061049b610c78565b6040516104a891906125e0565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d3919061290c565b610d0a565b005b3480156104e657600080fd5b5061050160048036038101906104fc9190612981565b610d25565b005b34801561050f57600080fd5b5061052a600480360381019061052591906127aa565b610d3b565b604051610537919061273c565b60405180910390f35b34801561054c57600080fd5b5061056760048036038101906105629190612a62565b610d53565b005b34801561057557600080fd5b50610590600480360381019061058b9190612638565b610db5565b60405161059d91906125e0565b60405180910390f35b3480156105b257600080fd5b506105cd60048036038101906105c89190612ae5565b610e1d565b6040516105da9190612535565b60405180910390f35b3480156105ef57600080fd5b5061060a600480360381019061060591906127aa565b610eb1565b005b34801561061857600080fd5b50610633600480360381019061062e9190612638565b610f34565b005b61064f600480360381019061064a9190612b65565b610f46565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106c457506106c3826111fb565b5b9050919050565b6060600080546106da90612bc1565b80601f016020809104026020016040519081016040528092919081815260200182805461070690612bc1565b80156107535780601f1061072857610100808354040283529160200191610753565b820191906000526020600020905b81548152906001019060200180831161073657829003601f168201915b5050505050905090565b6000610768826112dd565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107ae82610ab4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361081e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081590612c64565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661083d611328565b73ffffffffffffffffffffffffffffffffffffffff16148061086c575061086b81610866611328565b610e1d565b5b6108ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a290612cf6565b60405180910390fd5b6108b58383611330565b505050565b6000600880549050905090565b6108d86108d2611328565b826113e9565b610917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090e90612d88565b60405180910390fd5b61092283838361147e565b505050565b600061093283610b6b565b8210610973576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096a90612e1a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109d46116e4565b60003390508073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610a1f573d6000803e3d6000fd5b5050565b610a3e83838360405180602001604052806000815250610d53565b505050565b6000610a4d6108ba565b8210610a8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8590612eac565b60405180910390fd5b60088281548110610aa257610aa1612ecc565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5390612f47565b60405180910390fd5b80915050919050565b600e5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd290612fd9565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c2a6116e4565b610c346000611762565b565b600c6020528060005260406000206000915090505481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610c8790612bc1565b80601f0160208091040260200160405190810160405280929190818152602001828054610cb390612bc1565b8015610d005780601f10610cd557610100808354040283529160200191610d00565b820191906000526020600020905b815481529060010190602001808311610ce357829003601f168201915b5050505050905090565b610d126116e4565b80600f9081610d2191906131a5565b5050565b610d37610d30611328565b8383611828565b5050565b600d6020528060005260406000206000915090505481565b610d64610d5e611328565b836113e9565b610da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9a90612d88565b60405180910390fd5b610daf84848484611994565b50505050565b6060610dc0826112dd565b6000610dca6119f0565b90506000815111610dea5760405180602001604052806000815250610e15565b80610df484611a82565b604051602001610e059291906132b3565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610eb96116e4565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1f90613349565b60405180910390fd5b610f3181611762565b50565b610f3c6116e4565b80600e8190555050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fab906133b5565b60405180910390fd5b60018167ffffffffffffffff16036110f757600034036110ac576000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104790613421565b60405180910390fd5b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110a09190613470565b925050819055506110f2565b600e543410156110f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e8906134f0565b60405180910390fd5b5b611152565b8067ffffffffffffffff16600e5461110f9190613510565b341015611151576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611148906134f0565b60405180910390fd5b5b8067ffffffffffffffff16600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111ab9190613470565b9250508190555060005b8167ffffffffffffffff168110156111f7576111da336111d5600b611be2565b611bf0565b6111e4600b611dc9565b80806111ef90613552565b9150506111b5565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806112c657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806112d657506112d582611ddf565b5b9050919050565b6112e681611e49565b611325576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131c90612f47565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166113a383610ab4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806113f583610ab4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061143757506114368185610e1d565b5b8061147557508373ffffffffffffffffffffffffffffffffffffffff1661145d8461075d565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661149e82610ab4565b73ffffffffffffffffffffffffffffffffffffffff16146114f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114eb9061360c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155a9061369e565b60405180910390fd5b61156e838383611eb5565b611579600082611330565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115c991906136be565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116209190613470565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46116df838383611fc7565b505050565b6116ec611328565b73ffffffffffffffffffffffffffffffffffffffff1661170a610c4e565b73ffffffffffffffffffffffffffffffffffffffff1614611760576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117579061373e565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906137aa565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119879190612535565b60405180910390a3505050565b61199f84848461147e565b6119ab84848484611fcc565b6119ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e19061383c565b60405180910390fd5b50505050565b6060600f80546119ff90612bc1565b80601f0160208091040260200160405190810160405280929190818152602001828054611a2b90612bc1565b8015611a785780601f10611a4d57610100808354040283529160200191611a78565b820191906000526020600020905b815481529060010190602001808311611a5b57829003601f168201915b5050505050905090565b606060008203611ac9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611bdd565b600082905060005b60008214611afb578080611ae490613552565b915050600a82611af4919061388b565b9150611ad1565b60008167ffffffffffffffff811115611b1757611b166127e1565b5b6040519080825280601f01601f191660200182016040528015611b495781602001600182028036833780820191505090505b5090505b60008514611bd657600182611b6291906136be565b9150600a85611b7191906138bc565b6030611b7d9190613470565b60f81b818381518110611b9357611b92612ecc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611bcf919061388b565b9450611b4d565b8093505050505b919050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5690613939565b60405180910390fd5b611c6881611e49565b15611ca8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9f906139a5565b60405180910390fd5b611cb460008383611eb5565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d049190613470565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611dc560008383611fc7565b5050565b6001816000016000828254019250508190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b611ec0838383612153565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f0257611efd81612158565b611f41565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611f4057611f3f83826121a1565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f8357611f7e8161230e565b611fc2565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611fc157611fc082826123df565b5b5b505050565b505050565b6000611fed8473ffffffffffffffffffffffffffffffffffffffff1661245e565b15612146578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612016611328565b8786866040518563ffffffff1660e01b81526004016120389493929190613a1a565b6020604051808303816000875af192505050801561207457506040513d601f19601f820116820180604052508101906120719190613a7b565b60015b6120f6573d80600081146120a4576040519150601f19603f3d011682016040523d82523d6000602084013e6120a9565b606091505b5060008151036120ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e59061383c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061214b565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016121ae84610b6b565b6121b891906136be565b905060006007600084815260200190815260200160002054905081811461229d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061232291906136be565b905060006009600084815260200190815260200160002054905060006008838154811061235257612351612ecc565b5b90600052602060002001549050806008838154811061237457612373612ecc565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806123c3576123c2613aa8565b5b6001900381819060005260206000200160009055905550505050565b60006123ea83610b6b565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6124ca81612495565b81146124d557600080fd5b50565b6000813590506124e7816124c1565b92915050565b6000602082840312156125035761250261248b565b5b6000612511848285016124d8565b91505092915050565b60008115159050919050565b61252f8161251a565b82525050565b600060208201905061254a6000830184612526565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561258a57808201518184015260208101905061256f565b60008484015250505050565b6000601f19601f8301169050919050565b60006125b282612550565b6125bc818561255b565b93506125cc81856020860161256c565b6125d581612596565b840191505092915050565b600060208201905081810360008301526125fa81846125a7565b905092915050565b6000819050919050565b61261581612602565b811461262057600080fd5b50565b6000813590506126328161260c565b92915050565b60006020828403121561264e5761264d61248b565b5b600061265c84828501612623565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061269082612665565b9050919050565b6126a081612685565b82525050565b60006020820190506126bb6000830184612697565b92915050565b6126ca81612685565b81146126d557600080fd5b50565b6000813590506126e7816126c1565b92915050565b600080604083850312156127045761270361248b565b5b6000612712858286016126d8565b925050602061272385828601612623565b9150509250929050565b61273681612602565b82525050565b6000602082019050612751600083018461272d565b92915050565b6000806000606084860312156127705761276f61248b565b5b600061277e868287016126d8565b935050602061278f868287016126d8565b92505060406127a086828701612623565b9150509250925092565b6000602082840312156127c0576127bf61248b565b5b60006127ce848285016126d8565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61281982612596565b810181811067ffffffffffffffff82111715612838576128376127e1565b5b80604052505050565b600061284b612481565b90506128578282612810565b919050565b600067ffffffffffffffff821115612877576128766127e1565b5b61288082612596565b9050602081019050919050565b82818337600083830152505050565b60006128af6128aa8461285c565b612841565b9050828152602081018484840111156128cb576128ca6127dc565b5b6128d684828561288d565b509392505050565b600082601f8301126128f3576128f26127d7565b5b813561290384826020860161289c565b91505092915050565b6000602082840312156129225761292161248b565b5b600082013567ffffffffffffffff8111156129405761293f612490565b5b61294c848285016128de565b91505092915050565b61295e8161251a565b811461296957600080fd5b50565b60008135905061297b81612955565b92915050565b600080604083850312156129985761299761248b565b5b60006129a6858286016126d8565b92505060206129b78582860161296c565b9150509250929050565b600067ffffffffffffffff8211156129dc576129db6127e1565b5b6129e582612596565b9050602081019050919050565b6000612a05612a00846129c1565b612841565b905082815260208101848484011115612a2157612a206127dc565b5b612a2c84828561288d565b509392505050565b600082601f830112612a4957612a486127d7565b5b8135612a598482602086016129f2565b91505092915050565b60008060008060808587031215612a7c57612a7b61248b565b5b6000612a8a878288016126d8565b9450506020612a9b878288016126d8565b9350506040612aac87828801612623565b925050606085013567ffffffffffffffff811115612acd57612acc612490565b5b612ad987828801612a34565b91505092959194509250565b60008060408385031215612afc57612afb61248b565b5b6000612b0a858286016126d8565b9250506020612b1b858286016126d8565b9150509250929050565b600067ffffffffffffffff82169050919050565b612b4281612b25565b8114612b4d57600080fd5b50565b600081359050612b5f81612b39565b92915050565b600060208284031215612b7b57612b7a61248b565b5b6000612b8984828501612b50565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612bd957607f821691505b602082108103612bec57612beb612b92565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612c4e60218361255b565b9150612c5982612bf2565b604082019050919050565b60006020820190508181036000830152612c7d81612c41565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000612ce0603e8361255b565b9150612ceb82612c84565b604082019050919050565b60006020820190508181036000830152612d0f81612cd3565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000612d72602e8361255b565b9150612d7d82612d16565b604082019050919050565b60006020820190508181036000830152612da181612d65565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000612e04602b8361255b565b9150612e0f82612da8565b604082019050919050565b60006020820190508181036000830152612e3381612df7565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000612e96602c8361255b565b9150612ea182612e3a565b604082019050919050565b60006020820190508181036000830152612ec581612e89565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612f3160188361255b565b9150612f3c82612efb565b602082019050919050565b60006020820190508181036000830152612f6081612f24565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612fc360298361255b565b9150612fce82612f67565b604082019050919050565b60006020820190508181036000830152612ff281612fb6565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261305b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261301e565b613065868361301e565b95508019841693508086168417925050509392505050565b6000819050919050565b60006130a261309d61309884612602565b61307d565b612602565b9050919050565b6000819050919050565b6130bc83613087565b6130d06130c8826130a9565b84845461302b565b825550505050565b600090565b6130e56130d8565b6130f08184846130b3565b505050565b5b81811015613114576131096000826130dd565b6001810190506130f6565b5050565b601f8211156131595761312a81612ff9565b6131338461300e565b81016020851015613142578190505b61315661314e8561300e565b8301826130f5565b50505b505050565b600082821c905092915050565b600061317c6000198460080261315e565b1980831691505092915050565b6000613195838361316b565b9150826002028217905092915050565b6131ae82612550565b67ffffffffffffffff8111156131c7576131c66127e1565b5b6131d18254612bc1565b6131dc828285613118565b600060209050601f83116001811461320f57600084156131fd578287015190505b6132078582613189565b86555061326f565b601f19841661321d86612ff9565b60005b8281101561324557848901518255600182019150602085019450602081019050613220565b86831015613262578489015161325e601f89168261316b565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b600061328d82612550565b6132978185613277565b93506132a781856020860161256c565b80840191505092915050565b60006132bf8285613282565b91506132cb8284613282565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061333360268361255b565b915061333e826132d7565b604082019050919050565b6000602082019050818103600083015261336281613326565b9050919050565b7f4265206e6f7420616c6c6f776564202100000000000000000000000000000000600082015250565b600061339f60108361255b565b91506133aa82613369565b602082019050919050565b600060208201905081810360008301526133ce81613392565b9050919050565b7f416c72656164792066726565206d696e74202100000000000000000000000000600082015250565b600061340b60138361255b565b9150613416826133d5565b602082019050919050565b6000602082019050818103600083015261343a816133fe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061347b82612602565b915061348683612602565b925082820190508082111561349e5761349d613441565b5b92915050565b7f496e73756666696369656e7420616d6f756e7420210000000000000000000000600082015250565b60006134da60158361255b565b91506134e5826134a4565b602082019050919050565b60006020820190508181036000830152613509816134cd565b9050919050565b600061351b82612602565b915061352683612602565b925082820261353481612602565b9150828204841483151761354b5761354a613441565b5b5092915050565b600061355d82612602565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361358f5761358e613441565b5b600182019050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006135f660258361255b565b91506136018261359a565b604082019050919050565b60006020820190508181036000830152613625816135e9565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061368860248361255b565b91506136938261362c565b604082019050919050565b600060208201905081810360008301526136b78161367b565b9050919050565b60006136c982612602565b91506136d483612602565b92508282039050818111156136ec576136eb613441565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061372860208361255b565b9150613733826136f2565b602082019050919050565b600060208201905081810360008301526137578161371b565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061379460198361255b565b915061379f8261375e565b602082019050919050565b600060208201905081810360008301526137c381613787565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061382660328361255b565b9150613831826137ca565b604082019050919050565b6000602082019050818103600083015261385581613819565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061389682612602565b91506138a183612602565b9250826138b1576138b061385c565b5b828204905092915050565b60006138c782612602565b91506138d283612602565b9250826138e2576138e161385c565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061392360208361255b565b915061392e826138ed565b602082019050919050565b6000602082019050818103600083015261395281613916565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061398f601c8361255b565b915061399a82613959565b602082019050919050565b600060208201905081810360008301526139be81613982565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006139ec826139c5565b6139f681856139d0565b9350613a0681856020860161256c565b613a0f81612596565b840191505092915050565b6000608082019050613a2f6000830187612697565b613a3c6020830186612697565b613a49604083018561272d565b8181036060830152613a5b81846139e1565b905095945050505050565b600081519050613a75816124c1565b92915050565b600060208284031215613a9157613a9061248b565b5b6000613a9f84828501613a66565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220cda448aeb4342b04729cb5899e0c99a0b930ce6c69b18709d2a671218259f9cd64736f6c63430008120033

Deployed Bytecode Sourcemap

47731:1729:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41475:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28209:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29722:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29239:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42115:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30422:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41783:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49314:143;;;;;;;;;;;;;:::i;:::-;;30829:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42305:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27920:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48066:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27651:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6738:103;;;;;;;;;;;;;:::i;:::-;;47947:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6090:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28378:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49108:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29965:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48007:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31085:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28553:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30191:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6996:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49214:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48153:825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41475:224;41577:4;41616:35;41601:50;;;:11;:50;;;;:90;;;;41655:36;41679:11;41655:23;:36::i;:::-;41601:90;41594:97;;41475:224;;;:::o;28209:100::-;28263:13;28296:5;28289:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28209:100;:::o;29722:171::-;29798:7;29818:23;29833:7;29818:14;:23::i;:::-;29861:15;:24;29877:7;29861:24;;;;;;;;;;;;;;;;;;;;;29854:31;;29722:171;;;:::o;29239:417::-;29320:13;29336:23;29351:7;29336:14;:23::i;:::-;29320:39;;29384:5;29378:11;;:2;:11;;;29370:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29478:5;29462:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29487:37;29504:5;29511:12;:10;:12::i;:::-;29487:16;:37::i;:::-;29462:62;29440:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;29627:21;29636:2;29640:7;29627:8;:21::i;:::-;29309:347;29239:417;;:::o;42115:113::-;42176:7;42203:10;:17;;;;42196:24;;42115:113;:::o;30422:336::-;30617:41;30636:12;:10;:12::i;:::-;30650:7;30617:18;:41::i;:::-;30609:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;30722:28;30732:4;30738:2;30742:7;30722:9;:28::i;:::-;30422:336;;;:::o;41783:256::-;41880:7;41916:23;41933:5;41916:16;:23::i;:::-;41908:5;:31;41900:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;42005:12;:19;42018:5;42005:19;;;;;;;;;;;;;;;:26;42025:5;42005:26;;;;;;;;;;;;41998:33;;41783:256;;;;:::o;49314:143::-;5976:13;:11;:13::i;:::-;49364:18:::1;49393:10;49364:40;;49415:2;:11;;:34;49427:21;49415:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;49353:104;49314:143::o:0;30829:185::-;30967:39;30984:4;30990:2;30994:7;30967:39;;;;;;;;;;;;:16;:39::i;:::-;30829:185;;;:::o;42305:233::-;42380:7;42416:30;:28;:30::i;:::-;42408:5;:38;42400:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;42513:10;42524:5;42513:17;;;;;;;;:::i;:::-;;;;;;;;;;42506:24;;42305:233;;;:::o;27920:222::-;27992:7;28012:13;28028:7;:16;28036:7;28028:16;;;;;;;;;;;;;;;;;;;;;28012:32;;28080:1;28063:19;;:5;:19;;;28055:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;28129:5;28122:12;;;27920:222;;;:::o;48066:43::-;;;;:::o;27651:207::-;27723:7;27768:1;27751:19;;:5;:19;;;27743:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27834:9;:16;27844:5;27834:16;;;;;;;;;;;;;;;;27827:23;;27651:207;;;:::o;6738:103::-;5976:13;:11;:13::i;:::-;6803:30:::1;6830:1;6803:18;:30::i;:::-;6738:103::o:0;47947:53::-;;;;;;;;;;;;;;;;;:::o;6090:87::-;6136:7;6163:6;;;;;;;;;;;6156:13;;6090:87;:::o;28378:104::-;28434:13;28467:7;28460:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28378:104;:::o;49108:98::-;5976:13;:11;:13::i;:::-;49194:4:::1;49178:13;:20;;;;;;:::i;:::-;;49108:98:::0;:::o;29965:155::-;30060:52;30079:12;:10;:12::i;:::-;30093:8;30103;30060:18;:52::i;:::-;29965:155;;:::o;48007:52::-;;;;;;;;;;;;;;;;;:::o;31085:323::-;31259:41;31278:12;:10;:12::i;:::-;31292:7;31259:18;:41::i;:::-;31251:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;31362:38;31376:4;31382:2;31386:7;31395:4;31362:13;:38::i;:::-;31085:323;;;;:::o;28553:281::-;28626:13;28652:23;28667:7;28652:14;:23::i;:::-;28688:21;28712:10;:8;:10::i;:::-;28688:34;;28764:1;28746:7;28740:21;:25;:86;;;;;;;;;;;;;;;;;28792:7;28801:18;:7;:16;:18::i;:::-;28775:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28740:86;28733:93;;;28553:281;;;:::o;30191:164::-;30288:4;30312:18;:25;30331:5;30312:25;;;;;;;;;;;;;;;:35;30338:8;30312:35;;;;;;;;;;;;;;;;;;;;;;;;;30305:42;;30191:164;;;;:::o;6996:201::-;5976:13;:11;:13::i;:::-;7105:1:::1;7085:22;;:8;:22;;::::0;7077:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;7161:28;7180:8;7161:18;:28::i;:::-;6996:201:::0;:::o;49214:92::-;5976:13;:11;:13::i;:::-;49293:5:::1;49281:9;:17;;;;49214:92:::0;:::o;48153:825::-;48234:9;48220:23;;:10;:23;;;48212:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;48291:1;48279:8;:13;;;48275:477;;48326:1;48313:9;:14;48309:332;;48411:1;48378:17;:29;48396:10;48378:29;;;;;;;;;;;;;;;;:34;48348:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;48527:1;48494:17;:29;48512:10;48494:29;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;48309:332;;;48590:9;;48577;:22;;48569:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;48309:332;48275:477;;;48706:8;48694:20;;:9;;:20;;;;:::i;:::-;48681:9;:33;;48673:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;48275:477;48798:8;48764:42;;:18;:30;48783:10;48764:30;;;;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;48824:9;48819:152;48843:8;48839:12;;:1;:12;48819:152;;;48873:44;48879:10;48891:25;:15;:23;:25::i;:::-;48873:5;:44::i;:::-;48932:27;:15;:25;:27::i;:::-;48853:3;;;;;:::i;:::-;;;;48819:152;;;;48153:825;:::o;27282:305::-;27384:4;27436:25;27421:40;;;:11;:40;;;;:105;;;;27493:33;27478:48;;;:11;:48;;;;27421:105;:158;;;;27543:36;27567:11;27543:23;:36::i;:::-;27421:158;27401:178;;27282:305;;;:::o;37697:135::-;37779:16;37787:7;37779;:16::i;:::-;37771:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;37697:135;:::o;4641:98::-;4694:7;4721:10;4714:17;;4641:98;:::o;36976:174::-;37078:2;37051:15;:24;37067:7;37051:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37134:7;37130:2;37096:46;;37105:23;37120:7;37105:14;:23::i;:::-;37096:46;;;;;;;;;;;;36976:174;;:::o;33209:264::-;33302:4;33319:13;33335:23;33350:7;33335:14;:23::i;:::-;33319:39;;33388:5;33377:16;;:7;:16;;;:52;;;;33397:32;33414:5;33421:7;33397:16;:32::i;:::-;33377:52;:87;;;;33457:7;33433:31;;:20;33445:7;33433:11;:20::i;:::-;:31;;;33377:87;33369:96;;;33209:264;;;;:::o;36232:625::-;36391:4;36364:31;;:23;36379:7;36364:14;:23::i;:::-;:31;;;36356:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;36470:1;36456:16;;:2;:16;;;36448:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36526:39;36547:4;36553:2;36557:7;36526:20;:39::i;:::-;36630:29;36647:1;36651:7;36630:8;:29::i;:::-;36691:1;36672:9;:15;36682:4;36672:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;36720:1;36703:9;:13;36713:2;36703:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36751:2;36732:7;:16;36740:7;36732:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36790:7;36786:2;36771:27;;36780:4;36771:27;;;;;;;;;;;;36811:38;36831:4;36837:2;36841:7;36811:19;:38::i;:::-;36232:625;;;:::o;6255:132::-;6330:12;:10;:12::i;:::-;6319:23;;:7;:5;:7::i;:::-;:23;;;6311:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6255:132::o;7357:191::-;7431:16;7450:6;;;;;;;;;;;7431:25;;7476:8;7467:6;;:17;;;;;;;;;;;;;;;;;;7531:8;7500:40;;7521:8;7500:40;;;;;;;;;;;;7420:128;7357:191;:::o;37293:315::-;37448:8;37439:17;;:5;:17;;;37431:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;37535:8;37497:18;:25;37516:5;37497:25;;;;;;;;;;;;;;;:35;37523:8;37497:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;37581:8;37559:41;;37574:5;37559:41;;;37591:8;37559:41;;;;;;:::i;:::-;;;;;;;;37293:315;;;:::o;32289:313::-;32445:28;32455:4;32461:2;32465:7;32445:9;:28::i;:::-;32492:47;32515:4;32521:2;32525:7;32534:4;32492:22;:47::i;:::-;32484:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;32289:313;;;;:::o;48986:114::-;49046:13;49079;49072:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48986:114;:::o;1895:723::-;1951:13;2181:1;2172:5;:10;2168:53;;2199:10;;;;;;;;;;;;;;;;;;;;;2168:53;2231:12;2246:5;2231:20;;2262:14;2287:78;2302:1;2294:4;:9;2287:78;;2320:8;;;;;:::i;:::-;;;;2351:2;2343:10;;;;;:::i;:::-;;;2287:78;;;2375:19;2407:6;2397:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2375:39;;2425:154;2441:1;2432:5;:10;2425:154;;2469:1;2459:11;;;;;:::i;:::-;;;2536:2;2528:5;:10;;;;:::i;:::-;2515:2;:24;;;;:::i;:::-;2502:39;;2485:6;2492;2485:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2565:2;2556:11;;;;;:::i;:::-;;;2425:154;;;2603:6;2589:21;;;;;1895:723;;;;:::o;872:114::-;937:7;964;:14;;;957:21;;872:114;;;:::o;34807:439::-;34901:1;34887:16;;:2;:16;;;34879:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34960:16;34968:7;34960;:16::i;:::-;34959:17;34951:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35022:45;35051:1;35055:2;35059:7;35022:20;:45::i;:::-;35097:1;35080:9;:13;35090:2;35080:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35128:2;35109:7;:16;35117:7;35109:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35173:7;35169:2;35148:33;;35165:1;35148:33;;;;;;;;;;;;35194:44;35222:1;35226:2;35230:7;35194:19;:44::i;:::-;34807:439;;:::o;994:127::-;1101:1;1083:7;:14;;;:19;;;;;;;;;;;994:127;:::o;18944:157::-;19029:4;19068:25;19053:40;;;:11;:40;;;;19046:47;;18944:157;;;:::o;32915:127::-;32980:4;33032:1;33004:30;;:7;:16;33012:7;33004:16;;;;;;;;;;;;;;;;;;;;;:30;;;;32997:37;;32915:127;;;:::o;43151:589::-;43295:45;43322:4;43328:2;43332:7;43295:26;:45::i;:::-;43373:1;43357:18;;:4;:18;;;43353:187;;43392:40;43424:7;43392:31;:40::i;:::-;43353:187;;;43462:2;43454:10;;:4;:10;;;43450:90;;43481:47;43514:4;43520:7;43481:32;:47::i;:::-;43450:90;43353:187;43568:1;43554:16;;:2;:16;;;43550:183;;43587:45;43624:7;43587:36;:45::i;:::-;43550:183;;;43660:4;43654:10;;:2;:10;;;43650:83;;43681:40;43709:2;43713:7;43681:27;:40::i;:::-;43650:83;43550:183;43151:589;;;:::o;40332:125::-;;;;:::o;38396:853::-;38550:4;38571:15;:2;:13;;;:15::i;:::-;38567:675;;;38623:2;38607:36;;;38644:12;:10;:12::i;:::-;38658:4;38664:7;38673:4;38607:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38603:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38865:1;38848:6;:13;:18;38844:328;;38891:60;;;;;;;;;;:::i;:::-;;;;;;;;38844:328;39122:6;39116:13;39107:6;39103:2;39099:15;39092:38;38603:584;38739:41;;;38729:51;;;:6;:51;;;;38722:58;;;;;38567:675;39226:4;39219:11;;38396:853;;;;;;;:::o;39821:126::-;;;;:::o;44463:164::-;44567:10;:17;;;;44540:15;:24;44556:7;44540:24;;;;;;;;;;;:44;;;;44595:10;44611:7;44595:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44463:164;:::o;45254:988::-;45520:22;45570:1;45545:22;45562:4;45545:16;:22::i;:::-;:26;;;;:::i;:::-;45520:51;;45582:18;45603:17;:26;45621:7;45603:26;;;;;;;;;;;;45582:47;;45750:14;45736:10;:28;45732:328;;45781:19;45803:12;:18;45816:4;45803:18;;;;;;;;;;;;;;;:34;45822:14;45803:34;;;;;;;;;;;;45781:56;;45887:11;45854:12;:18;45867:4;45854:18;;;;;;;;;;;;;;;:30;45873:10;45854:30;;;;;;;;;;;:44;;;;46004:10;45971:17;:30;45989:11;45971:30;;;;;;;;;;;:43;;;;45766:294;45732:328;46156:17;:26;46174:7;46156:26;;;;;;;;;;;46149:33;;;46200:12;:18;46213:4;46200:18;;;;;;;;;;;;;;;:34;46219:14;46200:34;;;;;;;;;;;46193:41;;;45335:907;;45254:988;;:::o;46537:1079::-;46790:22;46835:1;46815:10;:17;;;;:21;;;;:::i;:::-;46790:46;;46847:18;46868:15;:24;46884:7;46868:24;;;;;;;;;;;;46847:45;;47219:19;47241:10;47252:14;47241:26;;;;;;;;:::i;:::-;;;;;;;;;;47219:48;;47305:11;47280:10;47291;47280:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;47416:10;47385:15;:28;47401:11;47385:28;;;;;;;;;;;:41;;;;47557:15;:24;47573:7;47557:24;;;;;;;;;;;47550:31;;;47592:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46608:1008;;;46537:1079;:::o;44041:221::-;44126:14;44143:20;44160:2;44143:16;:20::i;:::-;44126:37;;44201:7;44174:12;:16;44187:2;44174:16;;;;;;;;;;;;;;;:24;44191:6;44174:24;;;;;;;;;;;:34;;;;44248:6;44219:17;:26;44237:7;44219:26;;;;;;;;;;;:35;;;;44115:147;44041:221;;:::o;8788:326::-;8848:4;9105:1;9083:7;:19;;;:23;9076:30;;8788:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:329::-;5926:6;5975:2;5963:9;5954:7;5950:23;5946:32;5943:119;;;5981:79;;:::i;:::-;5943:119;6101:1;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6072:117;5867:329;;;;:::o;6202:117::-;6311:1;6308;6301:12;6325:117;6434:1;6431;6424:12;6448:180;6496:77;6493:1;6486:88;6593:4;6590:1;6583:15;6617:4;6614:1;6607:15;6634:281;6717:27;6739:4;6717:27;:::i;:::-;6709:6;6705:40;6847:6;6835:10;6832:22;6811:18;6799:10;6796:34;6793:62;6790:88;;;6858:18;;:::i;:::-;6790:88;6898:10;6894:2;6887:22;6677:238;6634:281;;:::o;6921:129::-;6955:6;6982:20;;:::i;:::-;6972:30;;7011:33;7039:4;7031:6;7011:33;:::i;:::-;6921:129;;;:::o;7056:308::-;7118:4;7208:18;7200:6;7197:30;7194:56;;;7230:18;;:::i;:::-;7194:56;7268:29;7290:6;7268:29;:::i;:::-;7260:37;;7352:4;7346;7342:15;7334:23;;7056:308;;;:::o;7370:146::-;7467:6;7462:3;7457;7444:30;7508:1;7499:6;7494:3;7490:16;7483:27;7370:146;;;:::o;7522:425::-;7600:5;7625:66;7641:49;7683:6;7641:49;:::i;:::-;7625:66;:::i;:::-;7616:75;;7714:6;7707:5;7700:21;7752:4;7745:5;7741:16;7790:3;7781:6;7776:3;7772:16;7769:25;7766:112;;;7797:79;;:::i;:::-;7766:112;7887:54;7934:6;7929:3;7924;7887:54;:::i;:::-;7606:341;7522:425;;;;;:::o;7967:340::-;8023:5;8072:3;8065:4;8057:6;8053:17;8049:27;8039:122;;8080:79;;:::i;:::-;8039:122;8197:6;8184:20;8222:79;8297:3;8289:6;8282:4;8274:6;8270:17;8222:79;:::i;:::-;8213:88;;8029:278;7967:340;;;;:::o;8313:509::-;8382:6;8431:2;8419:9;8410:7;8406:23;8402:32;8399:119;;;8437:79;;:::i;:::-;8399:119;8585:1;8574:9;8570:17;8557:31;8615:18;8607:6;8604:30;8601:117;;;8637:79;;:::i;:::-;8601:117;8742:63;8797:7;8788:6;8777:9;8773:22;8742:63;:::i;:::-;8732:73;;8528:287;8313:509;;;;:::o;8828:116::-;8898:21;8913:5;8898:21;:::i;:::-;8891:5;8888:32;8878:60;;8934:1;8931;8924:12;8878:60;8828:116;:::o;8950:133::-;8993:5;9031:6;9018:20;9009:29;;9047:30;9071:5;9047:30;:::i;:::-;8950:133;;;;:::o;9089:468::-;9154:6;9162;9211:2;9199:9;9190:7;9186:23;9182:32;9179:119;;;9217:79;;:::i;:::-;9179:119;9337:1;9362:53;9407:7;9398:6;9387:9;9383:22;9362:53;:::i;:::-;9352:63;;9308:117;9464:2;9490:50;9532:7;9523:6;9512:9;9508:22;9490:50;:::i;:::-;9480:60;;9435:115;9089:468;;;;;:::o;9563:307::-;9624:4;9714:18;9706:6;9703:30;9700:56;;;9736:18;;:::i;:::-;9700:56;9774:29;9796:6;9774:29;:::i;:::-;9766:37;;9858:4;9852;9848:15;9840:23;;9563:307;;;:::o;9876:423::-;9953:5;9978:65;9994:48;10035:6;9994:48;:::i;:::-;9978:65;:::i;:::-;9969:74;;10066:6;10059:5;10052:21;10104:4;10097:5;10093:16;10142:3;10133:6;10128:3;10124:16;10121:25;10118:112;;;10149:79;;:::i;:::-;10118:112;10239:54;10286:6;10281:3;10276;10239:54;:::i;:::-;9959:340;9876:423;;;;;:::o;10318:338::-;10373:5;10422:3;10415:4;10407:6;10403:17;10399:27;10389:122;;10430:79;;:::i;:::-;10389:122;10547:6;10534:20;10572:78;10646:3;10638:6;10631:4;10623:6;10619:17;10572:78;:::i;:::-;10563:87;;10379:277;10318:338;;;;:::o;10662:943::-;10757:6;10765;10773;10781;10830:3;10818:9;10809:7;10805:23;10801:33;10798:120;;;10837:79;;:::i;:::-;10798:120;10957:1;10982:53;11027:7;11018:6;11007:9;11003:22;10982:53;:::i;:::-;10972:63;;10928:117;11084:2;11110:53;11155:7;11146:6;11135:9;11131:22;11110:53;:::i;:::-;11100:63;;11055:118;11212:2;11238:53;11283:7;11274:6;11263:9;11259:22;11238:53;:::i;:::-;11228:63;;11183:118;11368:2;11357:9;11353:18;11340:32;11399:18;11391:6;11388:30;11385:117;;;11421:79;;:::i;:::-;11385:117;11526:62;11580:7;11571:6;11560:9;11556:22;11526:62;:::i;:::-;11516:72;;11311:287;10662:943;;;;;;;:::o;11611:474::-;11679:6;11687;11736:2;11724:9;11715:7;11711:23;11707:32;11704:119;;;11742:79;;:::i;:::-;11704:119;11862:1;11887:53;11932:7;11923:6;11912:9;11908:22;11887:53;:::i;:::-;11877:63;;11833:117;11989:2;12015:53;12060:7;12051:6;12040:9;12036:22;12015:53;:::i;:::-;12005:63;;11960:118;11611:474;;;;;:::o;12091:101::-;12127:7;12167:18;12160:5;12156:30;12145:41;;12091:101;;;:::o;12198:120::-;12270:23;12287:5;12270:23;:::i;:::-;12263:5;12260:34;12250:62;;12308:1;12305;12298:12;12250:62;12198:120;:::o;12324:137::-;12369:5;12407:6;12394:20;12385:29;;12423:32;12449:5;12423:32;:::i;:::-;12324:137;;;;:::o;12467:327::-;12525:6;12574:2;12562:9;12553:7;12549:23;12545:32;12542:119;;;12580:79;;:::i;:::-;12542:119;12700:1;12725:52;12769:7;12760:6;12749:9;12745:22;12725:52;:::i;:::-;12715:62;;12671:116;12467:327;;;;:::o;12800:180::-;12848:77;12845:1;12838:88;12945:4;12942:1;12935:15;12969:4;12966:1;12959:15;12986:320;13030:6;13067:1;13061:4;13057:12;13047:22;;13114:1;13108:4;13104:12;13135:18;13125:81;;13191:4;13183:6;13179:17;13169:27;;13125:81;13253:2;13245:6;13242:14;13222:18;13219:38;13216:84;;13272:18;;:::i;:::-;13216:84;13037:269;12986:320;;;:::o;13312:220::-;13452:34;13448:1;13440:6;13436:14;13429:58;13521:3;13516:2;13508:6;13504:15;13497:28;13312:220;:::o;13538:366::-;13680:3;13701:67;13765:2;13760:3;13701:67;:::i;:::-;13694:74;;13777:93;13866:3;13777:93;:::i;:::-;13895:2;13890:3;13886:12;13879:19;;13538:366;;;:::o;13910:419::-;14076:4;14114:2;14103:9;14099:18;14091:26;;14163:9;14157:4;14153:20;14149:1;14138:9;14134:17;14127:47;14191:131;14317:4;14191:131;:::i;:::-;14183:139;;13910:419;;;:::o;14335:249::-;14475:34;14471:1;14463:6;14459:14;14452:58;14544:32;14539:2;14531:6;14527:15;14520:57;14335:249;:::o;14590:366::-;14732:3;14753:67;14817:2;14812:3;14753:67;:::i;:::-;14746:74;;14829:93;14918:3;14829:93;:::i;:::-;14947:2;14942:3;14938:12;14931:19;;14590:366;;;:::o;14962:419::-;15128:4;15166:2;15155:9;15151:18;15143:26;;15215:9;15209:4;15205:20;15201:1;15190:9;15186:17;15179:47;15243:131;15369:4;15243:131;:::i;:::-;15235:139;;14962:419;;;:::o;15387:233::-;15527:34;15523:1;15515:6;15511:14;15504:58;15596:16;15591:2;15583:6;15579:15;15572:41;15387:233;:::o;15626:366::-;15768:3;15789:67;15853:2;15848:3;15789:67;:::i;:::-;15782:74;;15865:93;15954:3;15865:93;:::i;:::-;15983:2;15978:3;15974:12;15967:19;;15626:366;;;:::o;15998:419::-;16164:4;16202:2;16191:9;16187:18;16179:26;;16251:9;16245:4;16241:20;16237:1;16226:9;16222:17;16215:47;16279:131;16405:4;16279:131;:::i;:::-;16271:139;;15998:419;;;:::o;16423:230::-;16563:34;16559:1;16551:6;16547:14;16540:58;16632:13;16627:2;16619:6;16615:15;16608:38;16423:230;:::o;16659:366::-;16801:3;16822:67;16886:2;16881:3;16822:67;:::i;:::-;16815:74;;16898:93;16987:3;16898:93;:::i;:::-;17016:2;17011:3;17007:12;17000:19;;16659:366;;;:::o;17031:419::-;17197:4;17235:2;17224:9;17220:18;17212:26;;17284:9;17278:4;17274:20;17270:1;17259:9;17255:17;17248:47;17312:131;17438:4;17312:131;:::i;:::-;17304:139;;17031:419;;;:::o;17456:231::-;17596:34;17592:1;17584:6;17580:14;17573:58;17665:14;17660:2;17652:6;17648:15;17641:39;17456:231;:::o;17693:366::-;17835:3;17856:67;17920:2;17915:3;17856:67;:::i;:::-;17849:74;;17932:93;18021:3;17932:93;:::i;:::-;18050:2;18045:3;18041:12;18034:19;;17693:366;;;:::o;18065:419::-;18231:4;18269:2;18258:9;18254:18;18246:26;;18318:9;18312:4;18308:20;18304:1;18293:9;18289:17;18282:47;18346:131;18472:4;18346:131;:::i;:::-;18338:139;;18065:419;;;:::o;18490:180::-;18538:77;18535:1;18528:88;18635:4;18632:1;18625:15;18659:4;18656:1;18649:15;18676:174;18816:26;18812:1;18804:6;18800:14;18793:50;18676:174;:::o;18856:366::-;18998:3;19019:67;19083:2;19078:3;19019:67;:::i;:::-;19012:74;;19095:93;19184:3;19095:93;:::i;:::-;19213:2;19208:3;19204:12;19197:19;;18856:366;;;:::o;19228:419::-;19394:4;19432:2;19421:9;19417:18;19409:26;;19481:9;19475:4;19471:20;19467:1;19456:9;19452:17;19445:47;19509:131;19635:4;19509:131;:::i;:::-;19501:139;;19228:419;;;:::o;19653:228::-;19793:34;19789:1;19781:6;19777:14;19770:58;19862:11;19857:2;19849:6;19845:15;19838:36;19653:228;:::o;19887:366::-;20029:3;20050:67;20114:2;20109:3;20050:67;:::i;:::-;20043:74;;20126:93;20215:3;20126:93;:::i;:::-;20244:2;20239:3;20235:12;20228:19;;19887:366;;;:::o;20259:419::-;20425:4;20463:2;20452:9;20448:18;20440:26;;20512:9;20506:4;20502:20;20498:1;20487:9;20483:17;20476:47;20540:131;20666:4;20540:131;:::i;:::-;20532:139;;20259:419;;;:::o;20684:141::-;20733:4;20756:3;20748:11;;20779:3;20776:1;20769:14;20813:4;20810:1;20800:18;20792:26;;20684:141;;;:::o;20831:93::-;20868:6;20915:2;20910;20903:5;20899:14;20895:23;20885:33;;20831:93;;;:::o;20930:107::-;20974:8;21024:5;21018:4;21014:16;20993:37;;20930:107;;;;:::o;21043:393::-;21112:6;21162:1;21150:10;21146:18;21185:97;21215:66;21204:9;21185:97;:::i;:::-;21303:39;21333:8;21322:9;21303:39;:::i;:::-;21291:51;;21375:4;21371:9;21364:5;21360:21;21351:30;;21424:4;21414:8;21410:19;21403:5;21400:30;21390:40;;21119:317;;21043:393;;;;;:::o;21442:60::-;21470:3;21491:5;21484:12;;21442:60;;;:::o;21508:142::-;21558:9;21591:53;21609:34;21618:24;21636:5;21618:24;:::i;:::-;21609:34;:::i;:::-;21591:53;:::i;:::-;21578:66;;21508:142;;;:::o;21656:75::-;21699:3;21720:5;21713:12;;21656:75;;;:::o;21737:269::-;21847:39;21878:7;21847:39;:::i;:::-;21908:91;21957:41;21981:16;21957:41;:::i;:::-;21949:6;21942:4;21936:11;21908:91;:::i;:::-;21902:4;21895:105;21813:193;21737:269;;;:::o;22012:73::-;22057:3;22012:73;:::o;22091:189::-;22168:32;;:::i;:::-;22209:65;22267:6;22259;22253:4;22209:65;:::i;:::-;22144:136;22091:189;;:::o;22286:186::-;22346:120;22363:3;22356:5;22353:14;22346:120;;;22417:39;22454:1;22447:5;22417:39;:::i;:::-;22390:1;22383:5;22379:13;22370:22;;22346:120;;;22286:186;;:::o;22478:543::-;22579:2;22574:3;22571:11;22568:446;;;22613:38;22645:5;22613:38;:::i;:::-;22697:29;22715:10;22697:29;:::i;:::-;22687:8;22683:44;22880:2;22868:10;22865:18;22862:49;;;22901:8;22886:23;;22862:49;22924:80;22980:22;22998:3;22980:22;:::i;:::-;22970:8;22966:37;22953:11;22924:80;:::i;:::-;22583:431;;22568:446;22478:543;;;:::o;23027:117::-;23081:8;23131:5;23125:4;23121:16;23100:37;;23027:117;;;;:::o;23150:169::-;23194:6;23227:51;23275:1;23271:6;23263:5;23260:1;23256:13;23227:51;:::i;:::-;23223:56;23308:4;23302;23298:15;23288:25;;23201:118;23150:169;;;;:::o;23324:295::-;23400:4;23546:29;23571:3;23565:4;23546:29;:::i;:::-;23538:37;;23608:3;23605:1;23601:11;23595:4;23592:21;23584:29;;23324:295;;;;:::o;23624:1395::-;23741:37;23774:3;23741:37;:::i;:::-;23843:18;23835:6;23832:30;23829:56;;;23865:18;;:::i;:::-;23829:56;23909:38;23941:4;23935:11;23909:38;:::i;:::-;23994:67;24054:6;24046;24040:4;23994:67;:::i;:::-;24088:1;24112:4;24099:17;;24144:2;24136:6;24133:14;24161:1;24156:618;;;;24818:1;24835:6;24832:77;;;24884:9;24879:3;24875:19;24869:26;24860:35;;24832:77;24935:67;24995:6;24988:5;24935:67;:::i;:::-;24929:4;24922:81;24791:222;24126:887;;24156:618;24208:4;24204:9;24196:6;24192:22;24242:37;24274:4;24242:37;:::i;:::-;24301:1;24315:208;24329:7;24326:1;24323:14;24315:208;;;24408:9;24403:3;24399:19;24393:26;24385:6;24378:42;24459:1;24451:6;24447:14;24437:24;;24506:2;24495:9;24491:18;24478:31;;24352:4;24349:1;24345:12;24340:17;;24315:208;;;24551:6;24542:7;24539:19;24536:179;;;24609:9;24604:3;24600:19;24594:26;24652:48;24694:4;24686:6;24682:17;24671:9;24652:48;:::i;:::-;24644:6;24637:64;24559:156;24536:179;24761:1;24757;24749:6;24745:14;24741:22;24735:4;24728:36;24163:611;;;24126:887;;23716:1303;;;23624:1395;;:::o;25025:148::-;25127:11;25164:3;25149:18;;25025:148;;;;:::o;25179:390::-;25285:3;25313:39;25346:5;25313:39;:::i;:::-;25368:89;25450:6;25445:3;25368:89;:::i;:::-;25361:96;;25466:65;25524:6;25519:3;25512:4;25505:5;25501:16;25466:65;:::i;:::-;25556:6;25551:3;25547:16;25540:23;;25289:280;25179:390;;;;:::o;25575:435::-;25755:3;25777:95;25868:3;25859:6;25777:95;:::i;:::-;25770:102;;25889:95;25980:3;25971:6;25889:95;:::i;:::-;25882:102;;26001:3;25994:10;;25575:435;;;;;:::o;26016:225::-;26156:34;26152:1;26144:6;26140:14;26133:58;26225:8;26220:2;26212:6;26208:15;26201:33;26016:225;:::o;26247:366::-;26389:3;26410:67;26474:2;26469:3;26410:67;:::i;:::-;26403:74;;26486:93;26575:3;26486:93;:::i;:::-;26604:2;26599:3;26595:12;26588:19;;26247:366;;;:::o;26619:419::-;26785:4;26823:2;26812:9;26808:18;26800:26;;26872:9;26866:4;26862:20;26858:1;26847:9;26843:17;26836:47;26900:131;27026:4;26900:131;:::i;:::-;26892:139;;26619:419;;;:::o;27044:166::-;27184:18;27180:1;27172:6;27168:14;27161:42;27044:166;:::o;27216:366::-;27358:3;27379:67;27443:2;27438:3;27379:67;:::i;:::-;27372:74;;27455:93;27544:3;27455:93;:::i;:::-;27573:2;27568:3;27564:12;27557:19;;27216:366;;;:::o;27588:419::-;27754:4;27792:2;27781:9;27777:18;27769:26;;27841:9;27835:4;27831:20;27827:1;27816:9;27812:17;27805:47;27869:131;27995:4;27869:131;:::i;:::-;27861:139;;27588:419;;;:::o;28013:169::-;28153:21;28149:1;28141:6;28137:14;28130:45;28013:169;:::o;28188:366::-;28330:3;28351:67;28415:2;28410:3;28351:67;:::i;:::-;28344:74;;28427:93;28516:3;28427:93;:::i;:::-;28545:2;28540:3;28536:12;28529:19;;28188:366;;;:::o;28560:419::-;28726:4;28764:2;28753:9;28749:18;28741:26;;28813:9;28807:4;28803:20;28799:1;28788:9;28784:17;28777:47;28841:131;28967:4;28841:131;:::i;:::-;28833:139;;28560:419;;;:::o;28985:180::-;29033:77;29030:1;29023:88;29130:4;29127:1;29120:15;29154:4;29151:1;29144:15;29171:191;29211:3;29230:20;29248:1;29230:20;:::i;:::-;29225:25;;29264:20;29282:1;29264:20;:::i;:::-;29259:25;;29307:1;29304;29300:9;29293:16;;29328:3;29325:1;29322:10;29319:36;;;29335:18;;:::i;:::-;29319:36;29171:191;;;;:::o;29368:171::-;29508:23;29504:1;29496:6;29492:14;29485:47;29368:171;:::o;29545:366::-;29687:3;29708:67;29772:2;29767:3;29708:67;:::i;:::-;29701:74;;29784:93;29873:3;29784:93;:::i;:::-;29902:2;29897:3;29893:12;29886:19;;29545:366;;;:::o;29917:419::-;30083:4;30121:2;30110:9;30106:18;30098:26;;30170:9;30164:4;30160:20;30156:1;30145:9;30141:17;30134:47;30198:131;30324:4;30198:131;:::i;:::-;30190:139;;29917:419;;;:::o;30342:410::-;30382:7;30405:20;30423:1;30405:20;:::i;:::-;30400:25;;30439:20;30457:1;30439:20;:::i;:::-;30434:25;;30494:1;30491;30487:9;30516:30;30534:11;30516:30;:::i;:::-;30505:41;;30695:1;30686:7;30682:15;30679:1;30676:22;30656:1;30649:9;30629:83;30606:139;;30725:18;;:::i;:::-;30606:139;30390:362;30342:410;;;;:::o;30758:233::-;30797:3;30820:24;30838:5;30820:24;:::i;:::-;30811:33;;30866:66;30859:5;30856:77;30853:103;;30936:18;;:::i;:::-;30853:103;30983:1;30976:5;30972:13;30965:20;;30758:233;;;:::o;30997:224::-;31137:34;31133:1;31125:6;31121:14;31114:58;31206:7;31201:2;31193:6;31189:15;31182:32;30997:224;:::o;31227:366::-;31369:3;31390:67;31454:2;31449:3;31390:67;:::i;:::-;31383:74;;31466:93;31555:3;31466:93;:::i;:::-;31584:2;31579:3;31575:12;31568:19;;31227:366;;;:::o;31599:419::-;31765:4;31803:2;31792:9;31788:18;31780:26;;31852:9;31846:4;31842:20;31838:1;31827:9;31823:17;31816:47;31880:131;32006:4;31880:131;:::i;:::-;31872:139;;31599:419;;;:::o;32024:223::-;32164:34;32160:1;32152:6;32148:14;32141:58;32233:6;32228:2;32220:6;32216:15;32209:31;32024:223;:::o;32253:366::-;32395:3;32416:67;32480:2;32475:3;32416:67;:::i;:::-;32409:74;;32492:93;32581:3;32492:93;:::i;:::-;32610:2;32605:3;32601:12;32594:19;;32253:366;;;:::o;32625:419::-;32791:4;32829:2;32818:9;32814:18;32806:26;;32878:9;32872:4;32868:20;32864:1;32853:9;32849:17;32842:47;32906:131;33032:4;32906:131;:::i;:::-;32898:139;;32625:419;;;:::o;33050:194::-;33090:4;33110:20;33128:1;33110:20;:::i;:::-;33105:25;;33144:20;33162:1;33144:20;:::i;:::-;33139:25;;33188:1;33185;33181:9;33173:17;;33212:1;33206:4;33203:11;33200:37;;;33217:18;;:::i;:::-;33200:37;33050:194;;;;:::o;33250:182::-;33390:34;33386:1;33378:6;33374:14;33367:58;33250:182;:::o;33438:366::-;33580:3;33601:67;33665:2;33660:3;33601:67;:::i;:::-;33594:74;;33677:93;33766:3;33677:93;:::i;:::-;33795:2;33790:3;33786:12;33779:19;;33438:366;;;:::o;33810:419::-;33976:4;34014:2;34003:9;33999:18;33991:26;;34063:9;34057:4;34053:20;34049:1;34038:9;34034:17;34027:47;34091:131;34217:4;34091:131;:::i;:::-;34083:139;;33810:419;;;:::o;34235:175::-;34375:27;34371:1;34363:6;34359:14;34352:51;34235:175;:::o;34416:366::-;34558:3;34579:67;34643:2;34638:3;34579:67;:::i;:::-;34572:74;;34655:93;34744:3;34655:93;:::i;:::-;34773:2;34768:3;34764:12;34757:19;;34416:366;;;:::o;34788:419::-;34954:4;34992:2;34981:9;34977:18;34969:26;;35041:9;35035:4;35031:20;35027:1;35016:9;35012:17;35005:47;35069:131;35195:4;35069:131;:::i;:::-;35061:139;;34788:419;;;:::o;35213:237::-;35353:34;35349:1;35341:6;35337:14;35330:58;35422:20;35417:2;35409:6;35405:15;35398:45;35213:237;:::o;35456:366::-;35598:3;35619:67;35683:2;35678:3;35619:67;:::i;:::-;35612:74;;35695:93;35784:3;35695:93;:::i;:::-;35813:2;35808:3;35804:12;35797:19;;35456:366;;;:::o;35828:419::-;35994:4;36032:2;36021:9;36017:18;36009:26;;36081:9;36075:4;36071:20;36067:1;36056:9;36052:17;36045:47;36109:131;36235:4;36109:131;:::i;:::-;36101:139;;35828:419;;;:::o;36253:180::-;36301:77;36298:1;36291:88;36398:4;36395:1;36388:15;36422:4;36419:1;36412:15;36439:185;36479:1;36496:20;36514:1;36496:20;:::i;:::-;36491:25;;36530:20;36548:1;36530:20;:::i;:::-;36525:25;;36569:1;36559:35;;36574:18;;:::i;:::-;36559:35;36616:1;36613;36609:9;36604:14;;36439:185;;;;:::o;36630:176::-;36662:1;36679:20;36697:1;36679:20;:::i;:::-;36674:25;;36713:20;36731:1;36713:20;:::i;:::-;36708:25;;36752:1;36742:35;;36757:18;;:::i;:::-;36742:35;36798:1;36795;36791:9;36786:14;;36630:176;;;;:::o;36812:182::-;36952:34;36948:1;36940:6;36936:14;36929:58;36812:182;:::o;37000:366::-;37142:3;37163:67;37227:2;37222:3;37163:67;:::i;:::-;37156:74;;37239:93;37328:3;37239:93;:::i;:::-;37357:2;37352:3;37348:12;37341:19;;37000:366;;;:::o;37372:419::-;37538:4;37576:2;37565:9;37561:18;37553:26;;37625:9;37619:4;37615:20;37611:1;37600:9;37596:17;37589:47;37653:131;37779:4;37653:131;:::i;:::-;37645:139;;37372:419;;;:::o;37797:178::-;37937:30;37933:1;37925:6;37921:14;37914:54;37797:178;:::o;37981:366::-;38123:3;38144:67;38208:2;38203:3;38144:67;:::i;:::-;38137:74;;38220:93;38309:3;38220:93;:::i;:::-;38338:2;38333:3;38329:12;38322:19;;37981:366;;;:::o;38353:419::-;38519:4;38557:2;38546:9;38542:18;38534:26;;38606:9;38600:4;38596:20;38592:1;38581:9;38577:17;38570:47;38634:131;38760:4;38634:131;:::i;:::-;38626:139;;38353:419;;;:::o;38778:98::-;38829:6;38863:5;38857:12;38847:22;;38778:98;;;:::o;38882:168::-;38965:11;38999:6;38994:3;38987:19;39039:4;39034:3;39030:14;39015:29;;38882:168;;;;:::o;39056:373::-;39142:3;39170:38;39202:5;39170:38;:::i;:::-;39224:70;39287:6;39282:3;39224:70;:::i;:::-;39217:77;;39303:65;39361:6;39356:3;39349:4;39342:5;39338:16;39303:65;:::i;:::-;39393:29;39415:6;39393:29;:::i;:::-;39388:3;39384:39;39377:46;;39146:283;39056:373;;;;:::o;39435:640::-;39630:4;39668:3;39657:9;39653:19;39645:27;;39682:71;39750:1;39739:9;39735:17;39726:6;39682:71;:::i;:::-;39763:72;39831:2;39820:9;39816:18;39807:6;39763:72;:::i;:::-;39845;39913:2;39902:9;39898:18;39889:6;39845:72;:::i;:::-;39964:9;39958:4;39954:20;39949:2;39938:9;39934:18;39927:48;39992:76;40063:4;40054:6;39992:76;:::i;:::-;39984:84;;39435:640;;;;;;;:::o;40081:141::-;40137:5;40168:6;40162:13;40153:22;;40184:32;40210:5;40184:32;:::i;:::-;40081:141;;;;:::o;40228:349::-;40297:6;40346:2;40334:9;40325:7;40321:23;40317:32;40314:119;;;40352:79;;:::i;:::-;40314:119;40472:1;40497:63;40552:7;40543:6;40532:9;40528:22;40497:63;:::i;:::-;40487:73;;40443:127;40228:349;;;;:::o;40583:180::-;40631:77;40628:1;40621:88;40728:4;40725:1;40718:15;40752:4;40749:1;40742:15

Swarm Source

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