ETH Price: $3,291.04 (+1.52%)
Gas: 2 Gwei

Token

Art of the Unknowns (UKN)
 

Overview

Max Total Supply

65 UKN

Holders

14

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
peruggia-v.eth
Balance
1 UKN
0xf4b4A58974524E183c275F3c6EA895bC2368E738
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:
Unknowns

Compiler Version
v0.6.2+commit.bacdbe57

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <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 GSN 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 payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: ..\node_modules\@openzeppelin\contracts\introspection\IERC165.sol

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <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: ..\node_modules\@openzeppelin\contracts\token\ERC721\IERC721.sol

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2 <0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: ..\node_modules\@openzeppelin\contracts\token\ERC721\IERC721Metadata.sol

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2 <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: ..\node_modules\@openzeppelin\contracts\token\ERC721\IERC721Enumerable.sol

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2 <0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

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

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

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

// File: ..\node_modules\@openzeppelin\contracts\introspection\ERC165.sol

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

// File: ..\node_modules\@openzeppelin\contracts\math\SafeMath.sol

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2 <0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: ..\node_modules\@openzeppelin\contracts\utils\EnumerableSet.sol

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

// File: ..\node_modules\@openzeppelin\contracts\utils\EnumerableMap.sol

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Library for managing an enumerable variant of Solidity's
 * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]
 * type.
 *
 * Maps have the following properties:
 *
 * - Entries are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Entries are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableMap for EnumerableMap.UintToAddressMap;
 *
 *     // Declare a set state variable
 *     EnumerableMap.UintToAddressMap private myMap;
 * }
 * ```
 *
 * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are
 * supported.
 */
library EnumerableMap {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Map type with
    // bytes32 keys and values.
    // The Map implementation uses private functions, and user-facing
    // implementations (such as Uint256ToAddressMap) are just wrappers around
    // the underlying Map.
    // This means that we can only create new EnumerableMaps for types that fit
    // in bytes32.

    struct MapEntry {
        bytes32 _key;
        bytes32 _value;
    }

    struct Map {
        // Storage of map keys and values
        MapEntry[] _entries;

        // Position of the entry defined by a key in the `entries` array, plus 1
        // because index 0 means a key is not in the map.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex == 0) { // Equivalent to !contains(map, key)
            map._entries.push(MapEntry({ _key: key, _value: value }));
            // The entry is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            map._indexes[key] = map._entries.length;
            return true;
        } else {
            map._entries[keyIndex - 1]._value = value;
            return false;
        }
    }

    /**
     * @dev Removes a key-value pair from a map. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function _remove(Map storage map, bytes32 key) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex != 0) { // Equivalent to contains(map, key)
            // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one
            // in the array, and then remove the last entry (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = keyIndex - 1;
            uint256 lastIndex = map._entries.length - 1;

            // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            MapEntry storage lastEntry = map._entries[lastIndex];

            // Move the last entry to the index where the entry to delete is
            map._entries[toDeleteIndex] = lastEntry;
            // Update the index for the moved entry
            map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved entry was stored
            map._entries.pop();

            // Delete the index for the deleted slot
            delete map._indexes[key];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function _contains(Map storage map, bytes32 key) private view returns (bool) {
        return map._indexes[key] != 0;
    }

    /**
     * @dev Returns the number of key-value pairs in the map. O(1).
     */
    function _length(Map storage map) private view returns (uint256) {
        return map._entries.length;
    }

   /**
    * @dev Returns the key-value pair stored at position `index` in the map. O(1).
    *
    * Note that there are no guarantees on the ordering of entries inside the
    * array, and it may change when more entries are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {
        require(map._entries.length > index, "EnumerableMap: index out of bounds");

        MapEntry storage entry = map._entries[index];
        return (entry._key, entry._value);
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     */
    function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {
        uint256 keyIndex = map._indexes[key];
        if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key)
        return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function _get(Map storage map, bytes32 key) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    /**
     * @dev Same as {_get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {_tryGet}.
     */
    function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    // UintToAddressMap

    struct UintToAddressMap {
        Map _inner;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {
        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {
        return _remove(map._inner, bytes32(key));
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {
        return _contains(map._inner, bytes32(key));
    }

    /**
     * @dev Returns the number of elements in the map. O(1).
     */
    function length(UintToAddressMap storage map) internal view returns (uint256) {
        return _length(map._inner);
    }

   /**
    * @dev Returns the element stored at position `index` in the set. O(1).
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
        (bytes32 key, bytes32 value) = _at(map._inner, index);
        return (uint256(key), address(uint160(uint256(value))));
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     *
     * _Available since v3.4._
     */
    function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {
        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
        return (success, address(uint160(uint256(value))));
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key)))));
    }

    /**
     * @dev Same as {get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryGet}.
     */
    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));
    }
}

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

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;












/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using SafeMath for uint256;
    using Address for address;
    using EnumerableSet for EnumerableSet.UintSet;
    using EnumerableMap for EnumerableMap.UintToAddressMap;
    using Strings for uint256;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // Mapping from holder address to their (enumerable) set of owned tokens
    mapping (address => EnumerableSet.UintSet) private _holderTokens;

    // Enumerable mapping from token ids to their owners
    EnumerableMap.UintToAddressMap private _tokenOwners;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Optional mapping for token URIs
    mapping (uint256 => string) private _tokenURIs;

    // Base URI
    string private _baseURI;

    /*
     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    /*
     *     bytes4(keccak256('name()')) == 0x06fdde03
     *     bytes4(keccak256('symbol()')) == 0x95d89b41
     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
     *
     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
     */
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    /*
     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd
     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
     *
     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
     */
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

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

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token");
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(base, tokenId.toString()));
    }

    /**
    * @dev Returns the base URI set via {_setBaseURI}. This will be
    * automatically added as a prefix in {tokenURI} to each token's URI, or
    * to the token ID if no specific URI is set for that token ID.
    */
    function baseURI() public view virtual returns (string memory) {
        return _baseURI;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        return _holderTokens[owner].at(index);
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds
        return _tokenOwners.length();
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return tokenId;
    }

    /**
     * @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 || ERC721.isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _tokenOwners.contains(tokenId);
    }

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

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     d*
     * - `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);

        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

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

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

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

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

        // Clear metadata (if any)
        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }

        _holderTokens[owner].remove(tokenId);

        _tokenOwners.remove(tokenId);

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(address from, address to, uint256 tokenId) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); // internal 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);

        _holderTokens[from].remove(tokenId);
        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev Internal function to set the base URI for all token IDs. It is
     * automatically added as a prefix to the value returned in {tokenURI},
     * or to the token ID if {tokenURI} is empty.
     */
    function _setBaseURI(string memory baseURI_) internal virtual {
        _baseURI = baseURI_;
    }

    /**
     * @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()) {
            return true;
        }
        bytes memory returndata = to.functionCall(abi.encodeWithSelector(
            IERC721Receiver(to).onERC721Received.selector,
            _msgSender(),
            from,
            tokenId,
            _data
        ), "ERC721: transfer to non ERC721Receiver implementer");
        bytes4 retval = abi.decode(returndata, (bytes4));
        return (retval == _ERC721_RECEIVED);
    }

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

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

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

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <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 () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

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

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    /**
     * @dev Converts a `uint256` to its ASCII `string` 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);
        uint256 index = digits - 1;
        temp = value;
        while (temp != 0) {
            buffer[index--] = bytes1(uint8(48 + temp % 10));
            temp /= 10;
        }
        return string(buffer);
    }
}

// File: contracts\NFT.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.2;


library NFT {
    using Strings for uint256;

    uint8 constant COLOR_FLOOR = 30;
    uint8 constant COLOR_CEIL = 200;
    uint8 constant LIMIT_COLOR = 255;
    uint8 constant LIMIT_100 = 100;
    uint8 constant ONOFF_RATIO = 61;
    uint8 constant COLOR_RATIO = 39;
    uint8 constant OFFSET = 4;
    uint8 constant MAX_X = 7;
    uint8 constant MAX_Y = 13;
    uint8 constant R1 = 0;
    uint8 constant G1 = 1;
    uint8 constant B1 = 2;
    uint8 constant R2 = 3;
    uint8 constant G2 = 4;
    uint8 constant B2 = 5;


    function genSVG(bytes32 seed, bool isGenesis) internal pure returns (string memory svg) {
      return string(
        abi.encodePacked(
          "<svg xmlns='http://www.w3.org/2000/svg' height='210' width='210' viewBox='0 0 21 21' shape-rendering='crispEdges'> <rect width='21' height='21'/>",
          getRects(seed, isGenesis),
          "</svg>"
        )
      );
    }

    function isCorner(uint x, uint y) internal pure returns (bool) {
      if( x == 0 && (y == 0 || y == 1)) {
        return true;
      }

      if( x == 1 && (y == 0 || y == MAX_Y - 1)) {
        return true;
      }

      if(x == 0 && (y == MAX_Y - 1 || y == MAX_Y - 2)) {
        return true;
      }

      return false;
    }

    function isEye (uint x, uint y) internal pure returns (bool) {
      if((x == 5 || x == 7) && y == 5) {
        return true;
      }
      return false;
    }

    function getRects(bytes32 seed, bool isGenesis) internal pure returns (string memory rects) {
      string memory result = "";

      bytes32 lastSeed = keccak256(abi.encodePacked(seed));
      uint8 r1 = genColor(lastSeed, R1);
      uint8 g1 = genColor(lastSeed, G1);
      uint8 b1 = genColor(lastSeed, B1);
      uint8 r2 = genColor(lastSeed, R2);
      uint8 g2 = genColor(lastSeed, G2);
      uint8 b2 = genColor(lastSeed, B2);
      uint8 r; uint8 g; uint8 b;

      for(uint8 y=0; y<MAX_Y; y++) {
        for(uint8 x=0; x<MAX_X; x++) {

          lastSeed = keccak256(abi.encodePacked(lastSeed));
          if(genOnOff(lastSeed, COLOR_RATIO)) {
            r = r1; g = g1; b = b1;
          } else {
            r = r2; g = g2; b = b2;
          }
          lastSeed = keccak256(abi.encodePacked(lastSeed));
          if(genOnOff(lastSeed, ONOFF_RATIO) && !isCorner(x, y)) {
            
            result = packRects(result, createRect(r, g, b, x, y, 1, 1 ));

            if(x < MAX_X - 1) {
              uint8 mirrorX = MAX_Y - x - 1; 
              result = packRects(result, createRect(r, g, b, mirrorX, y, 1, 1 ));
            }
          }

          
        } 
      }
      
      // braket
      result = packRects(result, createRect(0, 0, 0, 0, 0, 3, 1));
      result = packRects(result, createRect(0, 0, 0, 0, 0, 1, 3));

      result = packRects(result, createRect(0, 0, 0, 0, 10, 1, 3));
      result = packRects(result, createRect(0, 0, 0, 0, 12, 3, 1));

      result = packRects(result, createRect(0, 0, 0, 10, 0, 3, 1));
      result = packRects(result, createRect(0, 0, 0, 12, 1, 1, 2));

      result = packRects(result, createRect(0, 0, 0, 12, 10, 1, 3));
      result = packRects(result, createRect(0, 0, 0, 10, 12, 2, 1));

      // eye margin
      result = packRects(result, createRect(0, 0, 0, 3, 6, 1, 1));
      result = packRects(result, createRect(0, 0, 0, 5, 6, 3, 1));
      result = packRects(result, createRect(0, 0, 0, 9, 6, 1, 1));

      result = packRects(result, createRect(0, 0, 0, 3, 5, 7, 1));
      result = packRects(result, createRect(0, 0, 0, 3, 7, 7, 1));

      // eyes

      uint8 eye = (isGenesis) ? 0 : 255;

      result = packRects(result, createRect(255, eye, eye, 4, 6, 1, 1));
      result = packRects(result, createRect(255, eye, eye, 8, 6, 1, 1));
      

      return result;
    }

        

    function createRect(uint8 r, uint8 g, uint8 b, uint8 x, uint8 y, uint8 width, uint8 height) internal pure returns (string memory) {
      return string(abi.encodePacked(
        "<rect fill='rgb(" , uint2str(r) , "," , uint2str(g) , "," , uint2str(b) , ")' ",
        "x='" , uint2str(x + OFFSET) , "' y='" , uint2str(y + OFFSET) , "' ",
        "width='", uint2str(width), "' height='", uint2str(height), "'/>"
      ));

    }

    function genOnOff(bytes32 seed, uint8 ratio) internal pure returns (bool) {
      uint8 value = uint8(seed[0]);
      return (value % LIMIT_100) > ratio;
    }

    function genColor(bytes32 seed, uint8 index) internal pure returns (uint8) {
      uint8 value = uint8(seed[index]);
      return COLOR_FLOOR + (value % COLOR_CEIL);
    }
    
    function toUint256(bytes memory _bytes)   
      internal
      pure
      returns (uint256 value) {

        assembly {
          value := mload(add(_bytes, 0x20))
        }
    }

    function packRects(string memory result, string memory rect) internal pure returns (string memory) {
      return string(abi.encodePacked(
        result,
        rect
      ));
    }

    function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len;
        while (_i != 0) {
            k = k-1;
            uint8 temp = (48 + uint8(_i - _i / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }
}

// File: contracts\Unknowns.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.2;




contract Unknowns is ERC721, Ownable {

  uint constant MAX_UNKNOWNS = 2000;
  uint constant MAX_GENESIS = 200;
  uint constant MAX_BATCH = 10;
  uint constant UNKNOWN_SECRET = 202003231988101219851130;

  event UpdateArt(address indexed _from, uint16[] ids, string artId);

  uint[] public idsMinted;
  
  uint private uknCost = 200000000000000000;
  uint private mintLimit = 200;
  uint private updateMin = 5;
  uint private updateUpper = 0;
  uint private updateLower = 0;

  constructor() public payable Ownable() ERC721("Art of the Unknowns", "UKN") {
  
  }

  receive() external payable{}

  function withdrawal() public onlyOwner {
    payable(msg.sender).transfer(address(this).balance);
  }

  function setLimit(uint limit) public onlyOwner {
    mintLimit = limit;
  }

  function setUpdateRange(uint upper, uint lower) public onlyOwner {
    updateUpper = upper;
    updateLower = lower;
  }

  function setUpdateMin(uint min) public onlyOwner {
    updateMin = min;
  }

  function setCost(uint costGwei) public onlyOwner {
    uknCost = costGwei * 1e9;
  }

  function getSVG(uint16 id) public view returns (string memory) {
    require(_exists(id), "Nonexistent token");
    bool isGenesis = (id < MAX_GENESIS) ? true : false;

    bytes32 seed = keccak256(abi.encodePacked(id + UNKNOWN_SECRET));
    return string(bytes(NFT.genSVG(seed, isGenesis)));
  }

  function getTokenSeed(uint16 id) public view returns (bytes32) {
    require(_exists(id), "Nonexistent token");
    return keccak256(abi.encodePacked(id + UNKNOWN_SECRET));
  }

  function getMintedIds() external view returns (uint[] memory) {
    return idsMinted;
  }

  function batchMint(uint16[] memory ids) public payable {

    require(ids.length <= MAX_BATCH, "Cannot create more than 10 Unknowns at a time");

    if(msg.sender != owner()) 
      require(msg.value >= ids.length * uknCost, "Unknowns cost more than that");

    for(uint16 i=0; i<ids.length; i++) {

      require(ids[i] < mintLimit, "Minting Unknown not yet allowed");

      require(ids[i] >= 0 && ids[i] < MAX_UNKNOWNS, "No such Unknowns");

      require(!_exists(ids[i]), "Unknown already minted");

      _safeMint(msg.sender, ids[i]);

      idsMinted.push(ids[i]);

    }

  }

  function batchUpdate(uint16[] memory ids, string memory artId) public {

    require(ids.length >= updateMin, "Minimum number of Unknowns not meant");

    for(uint i=0; i<ids.length; i++) {
      require(_isApprovedOrOwner(msg.sender, ids[i]), "Not the owner of this Unknown");
      require(updateUpper <= ids[i] && updateLower > ids[i], "Cannot update Unknown at this time");
    }

    emit UpdateArt(msg.sender, ids, artId);
  }

  function _baseURI() internal pure virtual returns (string memory) {
    return "http://app.ukn.art/api/";
  }

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

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

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint16[]","name":"ids","type":"uint16[]"},{"indexed":false,"internalType":"string","name":"artId","type":"string"}],"name":"UpdateArt","type":"event"},{"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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"ids","type":"uint16[]"}],"name":"batchMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"ids","type":"uint16[]"},{"internalType":"string","name":"artId","type":"string"}],"name":"batchUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintedIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"id","type":"uint16"}],"name":"getSVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"id","type":"uint16"}],"name":"getTokenSeed","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"idsMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"uint256","name":"costGwei","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"min","type":"uint256"}],"name":"setUpdateMin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"upper","type":"uint256"},{"internalType":"uint256","name":"lower","type":"uint256"}],"name":"setUpdateRange","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":"withdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6702c68af0bb140000600c5560c8600d556005600e556000600f819055601055601360809081527f417274206f662074686520556e6b6e6f776e730000000000000000000000000060a052610100604052600360c0908152622aa5a760e91b60e0526200007c6301ffc9a760e01b6001600160e01b036200016516565b815162000091906006906020850190620001ef565b508051620000a7906007906020840190620001ef565b50620000c36380ac58cd60e01b6001600160e01b036200016516565b620000de635b5e139f60e01b6001600160e01b036200016516565b620000f963780e9d6360e01b6001600160e01b036200016516565b5060009050620001116001600160e01b03620001ea16565b600a80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35062000291565b6001600160e01b03198082161415620001c5576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b335b90565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200023257805160ff191683800117855562000262565b8280016001018555821562000262579182015b828111156200026257825182559160200191906001019062000245565b506200027092915062000274565b5090565b620001ec91905b808211156200027057600081556001016200027b565b61354580620002a16000396000f3fe6080604052600436106101dc5760003560e01c80636352211e11610102578063a22cb46511610095578063e7bb1c0611610064578063e7bb1c061461095c578063e985e9c51461098a578063ea2d0ad7146109c5578063f2fde38b146109ef576101e3565b8063a22cb46514610811578063b88d4fde1461084c578063c87b56dd1461091d578063d4e9329214610947576101e3565b8063715018a6116100d1578063715018a6146107a25780638c1a9092146107b75780638da5cb5b146107e757806395d89b41146107fc576101e3565b80636352211e146106cb578063693c6062146106f55780636c0360eb1461075a57806370a082311461076f576101e3565b806327ea6f2b1161017a5780634f6ccce7116101495780634f6ccce7146105a85780634fafd56b146105d257806356dca48f1461060057806359ee5e141461062a576101e3565b806327ea6f2b146104d85780632f745c591461050257806342842e0e1461053b57806344a0d68a1461057e576101e3565b8063095ea7b3116101b6578063095ea7b31461030057806318160ddd1461033b5780631d713ed11461036257806323b872dd14610495576101e3565b806301ffc9a7146101e857806306fdde0314610230578063081812fc146102ba576101e3565b366101e357005b600080fd5b3480156101f457600080fd5b5061021c6004803603602081101561020b57600080fd5b50356001600160e01b031916610a22565b604080519115158252519081900360200190f35b34801561023c57600080fd5b50610245610a45565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561027f578181015183820152602001610267565b50505050905090810190601f1680156102ac5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102c657600080fd5b506102e4600480360360208110156102dd57600080fd5b5035610adb565b604080516001600160a01b039092168252519081900360200190f35b34801561030c57600080fd5b506103396004803603604081101561032357600080fd5b506001600160a01b038135169060200135610b3d565b005b34801561034757600080fd5b50610350610c18565b60408051918252519081900360200190f35b34801561036e57600080fd5b506103396004803603604081101561038557600080fd5b810190602081018135600160201b81111561039f57600080fd5b8201836020820111156103b157600080fd5b803590602001918460208302840111600160201b831117156103d257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561042157600080fd5b82018360208201111561043357600080fd5b803590602001918460018302840111600160201b8311171561045457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610c29945050505050565b3480156104a157600080fd5b50610339600480360360608110156104b857600080fd5b506001600160a01b03813581169160208101359091169060400135610e5a565b3480156104e457600080fd5b50610339600480360360208110156104fb57600080fd5b5035610eb1565b34801561050e57600080fd5b506103506004803603604081101561052557600080fd5b506001600160a01b038135169060200135610f18565b34801561054757600080fd5b506103396004803603606081101561055e57600080fd5b506001600160a01b03813581169160208101359091169060400135610f49565b34801561058a57600080fd5b50610339600480360360208110156105a157600080fd5b5035610f64565b3480156105b457600080fd5b50610350600480360360208110156105cb57600080fd5b5035610fd1565b3480156105de57600080fd5b50610350600480360360208110156105f557600080fd5b503561ffff16610fed565b34801561060c57600080fd5b506103506004803603602081101561062357600080fd5b5035611079565b6103396004803603602081101561064057600080fd5b810190602081018135600160201b81111561065a57600080fd5b82018360208201111561066c57600080fd5b803590602001918460208302840111600160201b8311171561068d57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611097945050505050565b3480156106d757600080fd5b506102e4600480360360208110156106ee57600080fd5b5035611339565b34801561070157600080fd5b5061070a611367565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561074657818101518382015260200161072e565b505050509050019250505060405180910390f35b34801561076657600080fd5b506102456113be565b34801561077b57600080fd5b506103506004803603602081101561079257600080fd5b50356001600160a01b031661141f565b3480156107ae57600080fd5b50610339611487565b3480156107c357600080fd5b50610339600480360360408110156107da57600080fd5b5080359060200135611533565b3480156107f357600080fd5b506102e46115a0565b34801561080857600080fd5b506102456115af565b34801561081d57600080fd5b506103396004803603604081101561083457600080fd5b506001600160a01b0381351690602001351515611610565b34801561085857600080fd5b506103396004803603608081101561086f57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156108a957600080fd5b8201836020820111156108bb57600080fd5b803590602001918460018302840111600160201b831117156108dc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611715945050505050565b34801561092957600080fd5b506102456004803603602081101561094057600080fd5b5035611773565b34801561095357600080fd5b506103396118a4565b34801561096857600080fd5b506102456004803603602081101561097f57600080fd5b503561ffff16611935565b34801561099657600080fd5b5061021c600480360360408110156109ad57600080fd5b506001600160a01b03813581169160200135166119e8565b3480156109d157600080fd5b50610339600480360360208110156109e857600080fd5b5035611a16565b3480156109fb57600080fd5b5061033960048036036020811015610a1257600080fd5b50356001600160a01b0316611a7d565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ad15780601f10610aa657610100808354040283529160200191610ad1565b820191906000526020600020905b815481529060010190602001808311610ab457829003601f168201915b5050505050905090565b6000610ae682611b80565b610b215760405162461bcd60e51b815260040180806020018281038252602c8152602001806133d4602c913960400191505060405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610b4882611339565b9050806001600160a01b0316836001600160a01b03161415610b9b5760405162461bcd60e51b815260040180806020018281038252602181526020018061349a6021913960400191505060405180910390fd5b806001600160a01b0316610bad611b93565b6001600160a01b03161480610bce5750610bce81610bc9611b93565b6119e8565b610c095760405162461bcd60e51b81526004018080602001828103825260388152602001806133276038913960400191505060405180910390fd5b610c138383611b97565b505050565b6000610c246002611c05565b905090565b600e5482511015610c6b5760405162461bcd60e51b81526004018080602001828103825260248152602001806134bb6024913960400191505060405180910390fd5b60005b8251811015610d6d57610c9833848381518110610c8757fe5b602002602001015161ffff16611c10565b610ce9576040805162461bcd60e51b815260206004820152601d60248201527f4e6f7420746865206f776e6572206f66207468697320556e6b6e6f776e000000604482015290519081900360640190fd5b828181518110610cf557fe5b602002602001015161ffff16600f5411158015610d2a5750828181518110610d1957fe5b602002602001015161ffff16601054115b610d655760405162461bcd60e51b81526004018080602001828103825260228152602001806134206022913960400191505060405180910390fd5b600101610c6e565b50336001600160a01b03167e3b171aa28aef1d42e30a4146d87b4b120099edd76b39c182ec86f4745579b38383604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610dde578181015183820152602001610dc6565b50505050905001838103825284818151815260200191508051906020019080838360005b83811015610e1a578181015183820152602001610e02565b50505050905090810190601f168015610e475780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a25050565b610e6b610e65611b93565b82611c10565b610ea65760405162461bcd60e51b81526004018080602001828103825260318152602001806134df6031913960400191505060405180910390fd5b610c13838383611cac565b610eb9611b93565b6001600160a01b0316610eca6115a0565b6001600160a01b031614610f13576040805162461bcd60e51b81526020600482018190526024820152600080516020613400833981519152604482015290519081900360640190fd5b600d55565b6001600160a01b0382166000908152600160205260408120610f40908363ffffffff611e0a16565b90505b92915050565b610c1383838360405180602001604052806000815250611715565b610f6c611b93565b6001600160a01b0316610f7d6115a0565b6001600160a01b031614610fc6576040805162461bcd60e51b81526020600482018190526024820152600080516020613400833981519152604482015290519081900360640190fd5b633b9aca0002600c55565b600080610fe560028463ffffffff611e1616565b509392505050565b6000610ffc8261ffff16611b80565b611041576040805162461bcd60e51b81526020600482015260116024820152702737b732bc34b9ba32b73a103a37b5b2b760791b604482015290519081900360640190fd5b506040805161ffff8316692ac69dfd722f8dbf9b7a016020808301919091528251808303820181529183019092528051910120919050565b600b818154811061108657fe5b600091825260209091200154905081565b600a815111156110d85760405162461bcd60e51b815260040180806020018281038252602d8152602001806132fa602d913960400191505060405180910390fd5b6110e06115a0565b6001600160a01b0316336001600160a01b03161461115257600c54815102341015611152576040805162461bcd60e51b815260206004820152601c60248201527f556e6b6e6f776e7320636f7374206d6f7265207468616e207468617400000000604482015290519081900360640190fd5b60005b81518161ffff16101561133557600d54828261ffff168151811061117557fe5b602002602001015161ffff16106111d3576040805162461bcd60e51b815260206004820152601f60248201527f4d696e74696e6720556e6b6e6f776e206e6f742079657420616c6c6f77656400604482015290519081900360640190fd5b6000828261ffff16815181106111e557fe5b602002602001015161ffff161015801561121b57506107d0828261ffff168151811061120d57fe5b602002602001015161ffff16105b61125f576040805162461bcd60e51b815260206004820152601060248201526f4e6f207375636820556e6b6e6f776e7360801b604482015290519081900360640190fd5b611283828261ffff168151811061127257fe5b602002602001015161ffff16611b80565b156112ce576040805162461bcd60e51b8152602060048201526016602482015275155b9adb9bdddb88185b1c9958591e481b5a5b9d195960521b604482015290519081900360640190fd5b6112f333838361ffff16815181106112e257fe5b602002602001015161ffff16611e32565b600b828261ffff168151811061130557fe5b60209081029190910181015182546001818101855560009485529290932061ffff90911692019190915501611155565b5050565b6000610f4382604051806060016040528060298152602001613389602991396002919063ffffffff611e4c16565b6060600b805480602002602001604051908101604052809291908181526020018280548015610ad157602002820191906000526020600020905b8154815260200190600101908083116113a1575050505050905090565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ad15780601f10610aa657610100808354040283529160200191610ad1565b60006001600160a01b0382166114665760405162461bcd60e51b815260040180806020018281038252602a81526020018061335f602a913960400191505060405180910390fd5b6001600160a01b0382166000908152600160205260409020610f4390611c05565b61148f611b93565b6001600160a01b03166114a06115a0565b6001600160a01b0316146114e9576040805162461bcd60e51b81526020600482018190526024820152600080516020613400833981519152604482015290519081900360640190fd5b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b61153b611b93565b6001600160a01b031661154c6115a0565b6001600160a01b031614611595576040805162461bcd60e51b81526020600482018190526024820152600080516020613400833981519152604482015290519081900360640190fd5b600f91909155601055565b600a546001600160a01b031690565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ad15780601f10610aa657610100808354040283529160200191610ad1565b611618611b93565b6001600160a01b0316826001600160a01b0316141561167e576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b806005600061168b611b93565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556116cf611b93565b60408051841515815290516001600160a01b0392909216917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a35050565b611726611720611b93565b83611c10565b6117615760405162461bcd60e51b81526004018080602001828103825260318152602001806134df6031913960400191505060405180910390fd5b61176d84848484611e59565b50505050565b606061177e82611b80565b6117b95760405162461bcd60e51b815260040180806020018281038252602f81526020018061346b602f913960400191505060405180910390fd5b60606117c3611eab565b905060008151116117e3576040518060200160405280600081525061189d565b806117ed84611ee2565b6040516020018083805190602001908083835b6020831061181f5780518252601f199092019160209182019101611800565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106118675780518252601f199092019160209182019101611848565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040525b9392505050565b6118ac611b93565b6001600160a01b03166118bd6115a0565b6001600160a01b031614611906576040805162461bcd60e51b81526020600482018190526024820152600080516020613400833981519152604482015290519081900360640190fd5b60405133904780156108fc02916000818181858888f19350505050158015611932573d6000803e3d6000fd5b50565b60606119448261ffff16611b80565b611989576040805162461bcd60e51b81526020600482015260116024820152702737b732bc34b9ba32b73a103a37b5b2b760791b604482015290519081900360640190fd5b600060c88361ffff161061199e5760006119a1565b60015b6040805161ffff8616692ac69dfd722f8dbf9b7a0160208083019190915282518083038201815291830190925280519101209091506119e08183611fa6565b949350505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b611a1e611b93565b6001600160a01b0316611a2f6115a0565b6001600160a01b031614611a78576040805162461bcd60e51b81526020600482018190526024820152600080516020613400833981519152604482015290519081900360640190fd5b600e55565b611a85611b93565b6001600160a01b0316611a966115a0565b6001600160a01b031614611adf576040805162461bcd60e51b81526020600482018190526024820152600080516020613400833981519152604482015290519081900360640190fd5b6001600160a01b038116611b245760405162461bcd60e51b81526004018080602001828103825260268152602001806131cd6026913960400191505060405180910390fd5b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000610f4360028363ffffffff61203916565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611bcc82611339565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610f4382612045565b6000611c1b82611b80565b611c565760405162461bcd60e51b815260040180806020018281038252602c8152602001806132ce602c913960400191505060405180910390fd5b6000611c6183611339565b9050806001600160a01b0316846001600160a01b03161480611c9c5750836001600160a01b0316611c9184610adb565b6001600160a01b0316145b806119e057506119e081856119e8565b826001600160a01b0316611cbf82611339565b6001600160a01b031614611d045760405162461bcd60e51b81526004018080602001828103825260298152602001806134426029913960400191505060405180910390fd5b6001600160a01b038216611d495760405162461bcd60e51b81526004018080602001828103825260248152602001806131f36024913960400191505060405180910390fd5b611d54838383610c13565b611d5f600082611b97565b6001600160a01b0383166000908152600160205260409020611d87908263ffffffff61204916565b506001600160a01b0382166000908152600160205260409020611db0908263ffffffff61205516565b50611dc36002828463ffffffff61206116565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000610f408383612077565b6000808080611e2586866120db565b9097909650945050505050565b611335828260405180602001604052806000815250612156565b60006119e08484846121a8565b611e64848484611cac565b611e7084848484612272565b61176d5760405162461bcd60e51b815260040180806020018281038252603281526020018061319b6032913960400191505060405180910390fd5b60408051808201909152601781527f687474703a2f2f6170702e756b6e2e6172742f6170692f000000000000000000602082015290565b606081611f0757506040805180820190915260018152600360fc1b6020820152610a40565b8160005b8115611f1f57600101600a82049150611f0b565b6060816040519080825280601f01601f191660200182016040528015611f4c576020820181803883390190505b50859350905060001982015b8315611f9d57600a840660300160f81b82828060019003935081518110611f7b57fe5b60200101906001600160f81b031916908160001a905350600a84049350611f58565b50949350505050565b6060611fb283836123f2565b604051602001806091613217823960910182805190602001908083835b60208310611fee5780518252601f199092019160209182019101611fcf565b5181516020939093036101000a6000190180199091169216919091179052651e17b9bb339f60d11b920191825250604080518083036019190181526006909201905295945050505050565b6000610f408383612748565b5490565b6000610f408383612760565b6000610f408383612826565b60006119e084846001600160a01b038516612870565b815460009082106120b95760405162461bcd60e51b81526004018080602001828103825260228152602001806131796022913960400191505060405180910390fd5b8260000182815481106120c857fe5b9060005260206000200154905092915050565b81546000908190831061211f5760405162461bcd60e51b81526004018080602001828103825260228152602001806133b26022913960400191505060405180910390fd5b600084600001848154811061213057fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6121608383612907565b61216d6000848484612272565b610c135760405162461bcd60e51b815260040180806020018281038252603281526020018061319b6032913960400191505060405180910390fd5b600082815260018401602052604081205482816122435760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156122085781810151838201526020016121f0565b50505050905090810190601f1680156122355780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5084600001600182038154811061225657fe5b9060005260206000209060020201600101549150509392505050565b6000612286846001600160a01b0316612a41565b612292575060016119e0565b60606123b8630a85bd0160e11b6122a7611b93565b88878760405160240180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612320578181015183820152602001612308565b50505050905090810190601f16801561234d5780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b03838183161783525050505060405180606001604052806032815260200161319b603291396001600160a01b038816919063ffffffff612a4716565b905060008180602001905160208110156123d157600080fd5b50516001600160e01b031916630a85bd0160e11b1492505050949350505050565b604080516020808201835260008083528351808301879052845180820384018152908501909452835193909101929092206060926124308282612a56565b9050600061243f836001612a56565b9050600061244e846002612a56565b9050600061245d856003612a56565b9050600061246c866004612a56565b9050600061247b876005612a56565b905060008080805b600d60ff8216101561259a5760005b600760ff82161015612591578b60405160200180828152602001915050604051602081830303815290604052805190602001209b506124d28c6027612a7b565b156124e5578a94508993508892506124ef565b8794508693508592505b8b60405160200180828152602001915050604051602081830303815290604052805190602001209b506125238c603d612a7b565b801561253c575061253a8160ff168360ff16612a91565b155b156125895761255a8d6125558787878688600180612b09565b612e39565b9c50600660ff8216101561258957600019600d829003016125858e6125558888888689600180612b09565b9d50505b600101612492565b50600101612483565b506125b38b612555600080600080600060036001612b09565b9a506125cd8b612555600080600080600060016003612b09565b9a506125e78b612555600080600080600a60016003612b09565b9a506126018b612555600080600080600c60036001612b09565b9a5061261c8b6125556000806000600a600060036001612b09565b9a506126368b6125556000806000600c6001806002612b09565b9a506126518b6125556000806000600c600a60016003612b09565b9a5061266c8b6125556000806000600a600c60026001612b09565b9a506126868b612555600080600060036006600180612b09565b9a506126a18b61255560008060006005600660036001612b09565b9a506126bb8b612555600080600060096006600180612b09565b9a506126d68b61255560008060006003600560076001612b09565b9a506126f08b612555600080600060036007806001612b09565b9a5060008d6127005760ff612703565b60005b905061271c8c61255560ff848560046006600180612b09565b9b506127358c61255560ff848560086006600180612b09565b9f9e505050505050505050505050505050565b60009081526001919091016020526040902054151590565b6000818152600183016020526040812054801561281c578354600019808301919081019060009087908390811061279357fe5b90600052602060002001549050808760000184815481106127b057fe5b6000918252602080832090910192909255828152600189810190925260409020908401905586548790806127e057fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610f43565b6000915050610f43565b60006128328383612748565b61286857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610f43565b506000610f43565b6000828152600184016020526040812054806128d557505060408051808201825283815260208082018481528654600181810189556000898152848120955160029093029095019182559151908201558654868452818801909252929091205561189d565b828560000160018303815481106128e857fe5b906000526020600020906002020160010181905550600091505061189d565b6001600160a01b038216612962576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b61296b81611b80565b156129bd576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b6129c960008383610c13565b6001600160a01b03821660009081526001602052604090206129f1908263ffffffff61205516565b50612a046002828463ffffffff61206116565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b60606119e08484600085612ef4565b600080838360ff1660208110612a6857fe5b1a905060c88106601e0191505092915050565b60ff908116606460009390931a92909206161190565b600082158015612aa95750811580612aa95750816001145b15612ab657506001610f43565b826001148015612ace5750811580612ace5750600c82145b15612adb57506001610f43565b82158015612af35750600c821480612af35750600b82145b15612b0057506001610f43565b50600092915050565b6060612b178860ff16613050565b612b238860ff16613050565b612b2f8860ff16613050565b612b3e6004890160ff16613050565b612b4d6004890160ff16613050565b612b598860ff16613050565b612b658860ff16613050565b60405160200180806f078e4cac6e840ccd2d8d87a4ee4cec4560831b81525060100188805190602001908083835b60208310612bb25780518252601f199092019160209182019101612b93565b6001836020036101000a03801982511681845116808217855250505050505090500180600b60fa1b81525060010187805190602001908083835b60208310612c0b5780518252601f199092019160209182019101612bec565b6001836020036101000a03801982511681845116808217855250505050505090500180600b60fa1b81525060010186805190602001908083835b60208310612c645780518252601f199092019160209182019101612c45565b51815160209384036101000a60001901801990921691161790526201493960ed1b9190930190815262783d2760e81b60038201528751600690910192880191508083835b60208310612cc75780518252601f199092019160209182019101612ca8565b51815160209384036101000a6000190180199092169116179052642720793d2760d81b919093019081528651600590910192870191508083835b60208310612d205780518252601f199092019160209182019101612d01565b51815160209384036101000a600019018019909216911617905261013960f51b919093019081526677696474683d2760c81b60028201528551600990910192860191508083835b60208310612d865780518252601f199092019160209182019101612d67565b51815160209384036101000a60001901801990921691161790526927206865696768743d2760b01b919093019081528451600a90910192850191508083835b60208310612de45780518252601f199092019160209182019101612dc5565b6001836020036101000a038019825116818451168082178552505050505050905001806213979f60e91b8152506003019750505050505050506040516020818303038152906040529050979650505050505050565b606082826040516020018083805190602001908083835b60208310612e6f5780518252601f199092019160209182019101612e50565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b60208310612eb75780518252601f199092019160209182019101612e98565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052905092915050565b606082471015612f355760405162461bcd60e51b81526004018080602001828103825260268152602001806132a86026913960400191505060405180910390fd5b612f3e85612a41565b612f8f576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310612fce5780518252601f199092019160209182019101612faf565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613030576040519150601f19603f3d011682016040523d82523d6000602084013e613035565b606091505b5091509150613045828286613112565b979650505050505050565b60608161307557506040805180820190915260018152600360fc1b6020820152610a40565b8160005b811561308d57600101600a82049150613079565b6060816040519080825280601f01601f1916602001820160405280156130ba576020820181803883390190505b509050815b8515611f9d57600019016000600a8704600a028703603001905060008160f81b9050808484815181106130ee57fe5b60200101906001600160f81b031916908160001a905350600a8804975050506130bf565b6060831561312157508161189d565b8251156131315782518084602001fd5b60405162461bcd60e51b81526020600482018181528451602484015284518593919283926044019190850190808383600083156122085781810151838201526020016121f056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734552433732313a207472616e7366657220746f20746865207a65726f20616464726573733c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f73766727206865696768743d27323130272077696474683d27323130272076696577426f783d27302030203231203231272073686170652d72656e646572696e673d2763726973704564676573273e203c726563742077696474683d27323127206865696768743d273231272f3e416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c4552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e43616e6e6f7420637265617465206d6f7265207468616e20313020556e6b6e6f776e7320617420612074696d654552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e64734552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657243616e6e6f742075706461746520556e6b6e6f776e20617420746869732074696d654552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724d696e696d756d206e756d626572206f6620556e6b6e6f776e73206e6f74206d65616e744552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564a2646970667358221220dfa6a39c2ccd4800dfe3d287a04d3417d8956e0240ff21d8f6bbdf13b20dda4164736f6c63430006020033

Deployed Bytecode

0x6080604052600436106101dc5760003560e01c80636352211e11610102578063a22cb46511610095578063e7bb1c0611610064578063e7bb1c061461095c578063e985e9c51461098a578063ea2d0ad7146109c5578063f2fde38b146109ef576101e3565b8063a22cb46514610811578063b88d4fde1461084c578063c87b56dd1461091d578063d4e9329214610947576101e3565b8063715018a6116100d1578063715018a6146107a25780638c1a9092146107b75780638da5cb5b146107e757806395d89b41146107fc576101e3565b80636352211e146106cb578063693c6062146106f55780636c0360eb1461075a57806370a082311461076f576101e3565b806327ea6f2b1161017a5780634f6ccce7116101495780634f6ccce7146105a85780634fafd56b146105d257806356dca48f1461060057806359ee5e141461062a576101e3565b806327ea6f2b146104d85780632f745c591461050257806342842e0e1461053b57806344a0d68a1461057e576101e3565b8063095ea7b3116101b6578063095ea7b31461030057806318160ddd1461033b5780631d713ed11461036257806323b872dd14610495576101e3565b806301ffc9a7146101e857806306fdde0314610230578063081812fc146102ba576101e3565b366101e357005b600080fd5b3480156101f457600080fd5b5061021c6004803603602081101561020b57600080fd5b50356001600160e01b031916610a22565b604080519115158252519081900360200190f35b34801561023c57600080fd5b50610245610a45565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561027f578181015183820152602001610267565b50505050905090810190601f1680156102ac5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102c657600080fd5b506102e4600480360360208110156102dd57600080fd5b5035610adb565b604080516001600160a01b039092168252519081900360200190f35b34801561030c57600080fd5b506103396004803603604081101561032357600080fd5b506001600160a01b038135169060200135610b3d565b005b34801561034757600080fd5b50610350610c18565b60408051918252519081900360200190f35b34801561036e57600080fd5b506103396004803603604081101561038557600080fd5b810190602081018135600160201b81111561039f57600080fd5b8201836020820111156103b157600080fd5b803590602001918460208302840111600160201b831117156103d257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561042157600080fd5b82018360208201111561043357600080fd5b803590602001918460018302840111600160201b8311171561045457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610c29945050505050565b3480156104a157600080fd5b50610339600480360360608110156104b857600080fd5b506001600160a01b03813581169160208101359091169060400135610e5a565b3480156104e457600080fd5b50610339600480360360208110156104fb57600080fd5b5035610eb1565b34801561050e57600080fd5b506103506004803603604081101561052557600080fd5b506001600160a01b038135169060200135610f18565b34801561054757600080fd5b506103396004803603606081101561055e57600080fd5b506001600160a01b03813581169160208101359091169060400135610f49565b34801561058a57600080fd5b50610339600480360360208110156105a157600080fd5b5035610f64565b3480156105b457600080fd5b50610350600480360360208110156105cb57600080fd5b5035610fd1565b3480156105de57600080fd5b50610350600480360360208110156105f557600080fd5b503561ffff16610fed565b34801561060c57600080fd5b506103506004803603602081101561062357600080fd5b5035611079565b6103396004803603602081101561064057600080fd5b810190602081018135600160201b81111561065a57600080fd5b82018360208201111561066c57600080fd5b803590602001918460208302840111600160201b8311171561068d57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611097945050505050565b3480156106d757600080fd5b506102e4600480360360208110156106ee57600080fd5b5035611339565b34801561070157600080fd5b5061070a611367565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561074657818101518382015260200161072e565b505050509050019250505060405180910390f35b34801561076657600080fd5b506102456113be565b34801561077b57600080fd5b506103506004803603602081101561079257600080fd5b50356001600160a01b031661141f565b3480156107ae57600080fd5b50610339611487565b3480156107c357600080fd5b50610339600480360360408110156107da57600080fd5b5080359060200135611533565b3480156107f357600080fd5b506102e46115a0565b34801561080857600080fd5b506102456115af565b34801561081d57600080fd5b506103396004803603604081101561083457600080fd5b506001600160a01b0381351690602001351515611610565b34801561085857600080fd5b506103396004803603608081101561086f57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156108a957600080fd5b8201836020820111156108bb57600080fd5b803590602001918460018302840111600160201b831117156108dc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611715945050505050565b34801561092957600080fd5b506102456004803603602081101561094057600080fd5b5035611773565b34801561095357600080fd5b506103396118a4565b34801561096857600080fd5b506102456004803603602081101561097f57600080fd5b503561ffff16611935565b34801561099657600080fd5b5061021c600480360360408110156109ad57600080fd5b506001600160a01b03813581169160200135166119e8565b3480156109d157600080fd5b50610339600480360360208110156109e857600080fd5b5035611a16565b3480156109fb57600080fd5b5061033960048036036020811015610a1257600080fd5b50356001600160a01b0316611a7d565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ad15780601f10610aa657610100808354040283529160200191610ad1565b820191906000526020600020905b815481529060010190602001808311610ab457829003601f168201915b5050505050905090565b6000610ae682611b80565b610b215760405162461bcd60e51b815260040180806020018281038252602c8152602001806133d4602c913960400191505060405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610b4882611339565b9050806001600160a01b0316836001600160a01b03161415610b9b5760405162461bcd60e51b815260040180806020018281038252602181526020018061349a6021913960400191505060405180910390fd5b806001600160a01b0316610bad611b93565b6001600160a01b03161480610bce5750610bce81610bc9611b93565b6119e8565b610c095760405162461bcd60e51b81526004018080602001828103825260388152602001806133276038913960400191505060405180910390fd5b610c138383611b97565b505050565b6000610c246002611c05565b905090565b600e5482511015610c6b5760405162461bcd60e51b81526004018080602001828103825260248152602001806134bb6024913960400191505060405180910390fd5b60005b8251811015610d6d57610c9833848381518110610c8757fe5b602002602001015161ffff16611c10565b610ce9576040805162461bcd60e51b815260206004820152601d60248201527f4e6f7420746865206f776e6572206f66207468697320556e6b6e6f776e000000604482015290519081900360640190fd5b828181518110610cf557fe5b602002602001015161ffff16600f5411158015610d2a5750828181518110610d1957fe5b602002602001015161ffff16601054115b610d655760405162461bcd60e51b81526004018080602001828103825260228152602001806134206022913960400191505060405180910390fd5b600101610c6e565b50336001600160a01b03167e3b171aa28aef1d42e30a4146d87b4b120099edd76b39c182ec86f4745579b38383604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610dde578181015183820152602001610dc6565b50505050905001838103825284818151815260200191508051906020019080838360005b83811015610e1a578181015183820152602001610e02565b50505050905090810190601f168015610e475780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a25050565b610e6b610e65611b93565b82611c10565b610ea65760405162461bcd60e51b81526004018080602001828103825260318152602001806134df6031913960400191505060405180910390fd5b610c13838383611cac565b610eb9611b93565b6001600160a01b0316610eca6115a0565b6001600160a01b031614610f13576040805162461bcd60e51b81526020600482018190526024820152600080516020613400833981519152604482015290519081900360640190fd5b600d55565b6001600160a01b0382166000908152600160205260408120610f40908363ffffffff611e0a16565b90505b92915050565b610c1383838360405180602001604052806000815250611715565b610f6c611b93565b6001600160a01b0316610f7d6115a0565b6001600160a01b031614610fc6576040805162461bcd60e51b81526020600482018190526024820152600080516020613400833981519152604482015290519081900360640190fd5b633b9aca0002600c55565b600080610fe560028463ffffffff611e1616565b509392505050565b6000610ffc8261ffff16611b80565b611041576040805162461bcd60e51b81526020600482015260116024820152702737b732bc34b9ba32b73a103a37b5b2b760791b604482015290519081900360640190fd5b506040805161ffff8316692ac69dfd722f8dbf9b7a016020808301919091528251808303820181529183019092528051910120919050565b600b818154811061108657fe5b600091825260209091200154905081565b600a815111156110d85760405162461bcd60e51b815260040180806020018281038252602d8152602001806132fa602d913960400191505060405180910390fd5b6110e06115a0565b6001600160a01b0316336001600160a01b03161461115257600c54815102341015611152576040805162461bcd60e51b815260206004820152601c60248201527f556e6b6e6f776e7320636f7374206d6f7265207468616e207468617400000000604482015290519081900360640190fd5b60005b81518161ffff16101561133557600d54828261ffff168151811061117557fe5b602002602001015161ffff16106111d3576040805162461bcd60e51b815260206004820152601f60248201527f4d696e74696e6720556e6b6e6f776e206e6f742079657420616c6c6f77656400604482015290519081900360640190fd5b6000828261ffff16815181106111e557fe5b602002602001015161ffff161015801561121b57506107d0828261ffff168151811061120d57fe5b602002602001015161ffff16105b61125f576040805162461bcd60e51b815260206004820152601060248201526f4e6f207375636820556e6b6e6f776e7360801b604482015290519081900360640190fd5b611283828261ffff168151811061127257fe5b602002602001015161ffff16611b80565b156112ce576040805162461bcd60e51b8152602060048201526016602482015275155b9adb9bdddb88185b1c9958591e481b5a5b9d195960521b604482015290519081900360640190fd5b6112f333838361ffff16815181106112e257fe5b602002602001015161ffff16611e32565b600b828261ffff168151811061130557fe5b60209081029190910181015182546001818101855560009485529290932061ffff90911692019190915501611155565b5050565b6000610f4382604051806060016040528060298152602001613389602991396002919063ffffffff611e4c16565b6060600b805480602002602001604051908101604052809291908181526020018280548015610ad157602002820191906000526020600020905b8154815260200190600101908083116113a1575050505050905090565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ad15780601f10610aa657610100808354040283529160200191610ad1565b60006001600160a01b0382166114665760405162461bcd60e51b815260040180806020018281038252602a81526020018061335f602a913960400191505060405180910390fd5b6001600160a01b0382166000908152600160205260409020610f4390611c05565b61148f611b93565b6001600160a01b03166114a06115a0565b6001600160a01b0316146114e9576040805162461bcd60e51b81526020600482018190526024820152600080516020613400833981519152604482015290519081900360640190fd5b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b61153b611b93565b6001600160a01b031661154c6115a0565b6001600160a01b031614611595576040805162461bcd60e51b81526020600482018190526024820152600080516020613400833981519152604482015290519081900360640190fd5b600f91909155601055565b600a546001600160a01b031690565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ad15780601f10610aa657610100808354040283529160200191610ad1565b611618611b93565b6001600160a01b0316826001600160a01b0316141561167e576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b806005600061168b611b93565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556116cf611b93565b60408051841515815290516001600160a01b0392909216917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a35050565b611726611720611b93565b83611c10565b6117615760405162461bcd60e51b81526004018080602001828103825260318152602001806134df6031913960400191505060405180910390fd5b61176d84848484611e59565b50505050565b606061177e82611b80565b6117b95760405162461bcd60e51b815260040180806020018281038252602f81526020018061346b602f913960400191505060405180910390fd5b60606117c3611eab565b905060008151116117e3576040518060200160405280600081525061189d565b806117ed84611ee2565b6040516020018083805190602001908083835b6020831061181f5780518252601f199092019160209182019101611800565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106118675780518252601f199092019160209182019101611848565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040525b9392505050565b6118ac611b93565b6001600160a01b03166118bd6115a0565b6001600160a01b031614611906576040805162461bcd60e51b81526020600482018190526024820152600080516020613400833981519152604482015290519081900360640190fd5b60405133904780156108fc02916000818181858888f19350505050158015611932573d6000803e3d6000fd5b50565b60606119448261ffff16611b80565b611989576040805162461bcd60e51b81526020600482015260116024820152702737b732bc34b9ba32b73a103a37b5b2b760791b604482015290519081900360640190fd5b600060c88361ffff161061199e5760006119a1565b60015b6040805161ffff8616692ac69dfd722f8dbf9b7a0160208083019190915282518083038201815291830190925280519101209091506119e08183611fa6565b949350505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b611a1e611b93565b6001600160a01b0316611a2f6115a0565b6001600160a01b031614611a78576040805162461bcd60e51b81526020600482018190526024820152600080516020613400833981519152604482015290519081900360640190fd5b600e55565b611a85611b93565b6001600160a01b0316611a966115a0565b6001600160a01b031614611adf576040805162461bcd60e51b81526020600482018190526024820152600080516020613400833981519152604482015290519081900360640190fd5b6001600160a01b038116611b245760405162461bcd60e51b81526004018080602001828103825260268152602001806131cd6026913960400191505060405180910390fd5b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000610f4360028363ffffffff61203916565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611bcc82611339565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610f4382612045565b6000611c1b82611b80565b611c565760405162461bcd60e51b815260040180806020018281038252602c8152602001806132ce602c913960400191505060405180910390fd5b6000611c6183611339565b9050806001600160a01b0316846001600160a01b03161480611c9c5750836001600160a01b0316611c9184610adb565b6001600160a01b0316145b806119e057506119e081856119e8565b826001600160a01b0316611cbf82611339565b6001600160a01b031614611d045760405162461bcd60e51b81526004018080602001828103825260298152602001806134426029913960400191505060405180910390fd5b6001600160a01b038216611d495760405162461bcd60e51b81526004018080602001828103825260248152602001806131f36024913960400191505060405180910390fd5b611d54838383610c13565b611d5f600082611b97565b6001600160a01b0383166000908152600160205260409020611d87908263ffffffff61204916565b506001600160a01b0382166000908152600160205260409020611db0908263ffffffff61205516565b50611dc36002828463ffffffff61206116565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000610f408383612077565b6000808080611e2586866120db565b9097909650945050505050565b611335828260405180602001604052806000815250612156565b60006119e08484846121a8565b611e64848484611cac565b611e7084848484612272565b61176d5760405162461bcd60e51b815260040180806020018281038252603281526020018061319b6032913960400191505060405180910390fd5b60408051808201909152601781527f687474703a2f2f6170702e756b6e2e6172742f6170692f000000000000000000602082015290565b606081611f0757506040805180820190915260018152600360fc1b6020820152610a40565b8160005b8115611f1f57600101600a82049150611f0b565b6060816040519080825280601f01601f191660200182016040528015611f4c576020820181803883390190505b50859350905060001982015b8315611f9d57600a840660300160f81b82828060019003935081518110611f7b57fe5b60200101906001600160f81b031916908160001a905350600a84049350611f58565b50949350505050565b6060611fb283836123f2565b604051602001806091613217823960910182805190602001908083835b60208310611fee5780518252601f199092019160209182019101611fcf565b5181516020939093036101000a6000190180199091169216919091179052651e17b9bb339f60d11b920191825250604080518083036019190181526006909201905295945050505050565b6000610f408383612748565b5490565b6000610f408383612760565b6000610f408383612826565b60006119e084846001600160a01b038516612870565b815460009082106120b95760405162461bcd60e51b81526004018080602001828103825260228152602001806131796022913960400191505060405180910390fd5b8260000182815481106120c857fe5b9060005260206000200154905092915050565b81546000908190831061211f5760405162461bcd60e51b81526004018080602001828103825260228152602001806133b26022913960400191505060405180910390fd5b600084600001848154811061213057fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6121608383612907565b61216d6000848484612272565b610c135760405162461bcd60e51b815260040180806020018281038252603281526020018061319b6032913960400191505060405180910390fd5b600082815260018401602052604081205482816122435760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156122085781810151838201526020016121f0565b50505050905090810190601f1680156122355780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5084600001600182038154811061225657fe5b9060005260206000209060020201600101549150509392505050565b6000612286846001600160a01b0316612a41565b612292575060016119e0565b60606123b8630a85bd0160e11b6122a7611b93565b88878760405160240180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612320578181015183820152602001612308565b50505050905090810190601f16801561234d5780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b03838183161783525050505060405180606001604052806032815260200161319b603291396001600160a01b038816919063ffffffff612a4716565b905060008180602001905160208110156123d157600080fd5b50516001600160e01b031916630a85bd0160e11b1492505050949350505050565b604080516020808201835260008083528351808301879052845180820384018152908501909452835193909101929092206060926124308282612a56565b9050600061243f836001612a56565b9050600061244e846002612a56565b9050600061245d856003612a56565b9050600061246c866004612a56565b9050600061247b876005612a56565b905060008080805b600d60ff8216101561259a5760005b600760ff82161015612591578b60405160200180828152602001915050604051602081830303815290604052805190602001209b506124d28c6027612a7b565b156124e5578a94508993508892506124ef565b8794508693508592505b8b60405160200180828152602001915050604051602081830303815290604052805190602001209b506125238c603d612a7b565b801561253c575061253a8160ff168360ff16612a91565b155b156125895761255a8d6125558787878688600180612b09565b612e39565b9c50600660ff8216101561258957600019600d829003016125858e6125558888888689600180612b09565b9d50505b600101612492565b50600101612483565b506125b38b612555600080600080600060036001612b09565b9a506125cd8b612555600080600080600060016003612b09565b9a506125e78b612555600080600080600a60016003612b09565b9a506126018b612555600080600080600c60036001612b09565b9a5061261c8b6125556000806000600a600060036001612b09565b9a506126368b6125556000806000600c6001806002612b09565b9a506126518b6125556000806000600c600a60016003612b09565b9a5061266c8b6125556000806000600a600c60026001612b09565b9a506126868b612555600080600060036006600180612b09565b9a506126a18b61255560008060006005600660036001612b09565b9a506126bb8b612555600080600060096006600180612b09565b9a506126d68b61255560008060006003600560076001612b09565b9a506126f08b612555600080600060036007806001612b09565b9a5060008d6127005760ff612703565b60005b905061271c8c61255560ff848560046006600180612b09565b9b506127358c61255560ff848560086006600180612b09565b9f9e505050505050505050505050505050565b60009081526001919091016020526040902054151590565b6000818152600183016020526040812054801561281c578354600019808301919081019060009087908390811061279357fe5b90600052602060002001549050808760000184815481106127b057fe5b6000918252602080832090910192909255828152600189810190925260409020908401905586548790806127e057fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610f43565b6000915050610f43565b60006128328383612748565b61286857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610f43565b506000610f43565b6000828152600184016020526040812054806128d557505060408051808201825283815260208082018481528654600181810189556000898152848120955160029093029095019182559151908201558654868452818801909252929091205561189d565b828560000160018303815481106128e857fe5b906000526020600020906002020160010181905550600091505061189d565b6001600160a01b038216612962576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b61296b81611b80565b156129bd576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b6129c960008383610c13565b6001600160a01b03821660009081526001602052604090206129f1908263ffffffff61205516565b50612a046002828463ffffffff61206116565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b60606119e08484600085612ef4565b600080838360ff1660208110612a6857fe5b1a905060c88106601e0191505092915050565b60ff908116606460009390931a92909206161190565b600082158015612aa95750811580612aa95750816001145b15612ab657506001610f43565b826001148015612ace5750811580612ace5750600c82145b15612adb57506001610f43565b82158015612af35750600c821480612af35750600b82145b15612b0057506001610f43565b50600092915050565b6060612b178860ff16613050565b612b238860ff16613050565b612b2f8860ff16613050565b612b3e6004890160ff16613050565b612b4d6004890160ff16613050565b612b598860ff16613050565b612b658860ff16613050565b60405160200180806f078e4cac6e840ccd2d8d87a4ee4cec4560831b81525060100188805190602001908083835b60208310612bb25780518252601f199092019160209182019101612b93565b6001836020036101000a03801982511681845116808217855250505050505090500180600b60fa1b81525060010187805190602001908083835b60208310612c0b5780518252601f199092019160209182019101612bec565b6001836020036101000a03801982511681845116808217855250505050505090500180600b60fa1b81525060010186805190602001908083835b60208310612c645780518252601f199092019160209182019101612c45565b51815160209384036101000a60001901801990921691161790526201493960ed1b9190930190815262783d2760e81b60038201528751600690910192880191508083835b60208310612cc75780518252601f199092019160209182019101612ca8565b51815160209384036101000a6000190180199092169116179052642720793d2760d81b919093019081528651600590910192870191508083835b60208310612d205780518252601f199092019160209182019101612d01565b51815160209384036101000a600019018019909216911617905261013960f51b919093019081526677696474683d2760c81b60028201528551600990910192860191508083835b60208310612d865780518252601f199092019160209182019101612d67565b51815160209384036101000a60001901801990921691161790526927206865696768743d2760b01b919093019081528451600a90910192850191508083835b60208310612de45780518252601f199092019160209182019101612dc5565b6001836020036101000a038019825116818451168082178552505050505050905001806213979f60e91b8152506003019750505050505050506040516020818303038152906040529050979650505050505050565b606082826040516020018083805190602001908083835b60208310612e6f5780518252601f199092019160209182019101612e50565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b60208310612eb75780518252601f199092019160209182019101612e98565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052905092915050565b606082471015612f355760405162461bcd60e51b81526004018080602001828103825260268152602001806132a86026913960400191505060405180910390fd5b612f3e85612a41565b612f8f576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310612fce5780518252601f199092019160209182019101612faf565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613030576040519150601f19603f3d011682016040523d82523d6000602084013e613035565b606091505b5091509150613045828286613112565b979650505050505050565b60608161307557506040805180820190915260018152600360fc1b6020820152610a40565b8160005b811561308d57600101600a82049150613079565b6060816040519080825280601f01601f1916602001820160405280156130ba576020820181803883390190505b509050815b8515611f9d57600019016000600a8704600a028703603001905060008160f81b9050808484815181106130ee57fe5b60200101906001600160f81b031916908160001a905350600a8804975050506130bf565b6060831561312157508161189d565b8251156131315782518084602001fd5b60405162461bcd60e51b81526020600482018181528451602484015284518593919283926044019190850190808383600083156122085781810151838201526020016121f056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734552433732313a207472616e7366657220746f20746865207a65726f20616464726573733c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f73766727206865696768743d27323130272077696474683d27323130272076696577426f783d27302030203231203231272073686170652d72656e646572696e673d2763726973704564676573273e203c726563742077696474683d27323127206865696768743d273231272f3e416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c4552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e43616e6e6f7420637265617465206d6f7265207468616e20313020556e6b6e6f776e7320617420612074696d654552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e64734552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657243616e6e6f742075706461746520556e6b6e6f776e20617420746869732074696d654552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724d696e696d756d206e756d626572206f6620556e6b6e6f776e73206e6f74206d65616e744552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564a2646970667358221220dfa6a39c2ccd4800dfe3d287a04d3417d8956e0240ff21d8f6bbdf13b20dda4164736f6c63430006020033

Deployed Bytecode Sourcemap

73248:3240:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10533:150;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10533:150:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10533:150:0;-1:-1:-1;;;;;;10533:150:0;;:::i;:::-;;;;;;;;;;;;;;;;;;51059:100;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51059:100:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8::-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;51059:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53845:221;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53845:221:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53845:221:0;;:::i;:::-;;;;-1:-1:-1;;;;;53845:221:0;;;;;;;;;;;;;;53375:404;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53375:404:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;53375:404:0;;;;;;;;:::i;:::-;;52853:211;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52853:211:0;;;:::i;:::-;;;;;;;;;;;;;;;;75569:443;;8:9:-1;5:2;;;30:1;27;20:12;5:2;75569:443:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;75569:443:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;75569:443:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;75569:443:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;75569:443:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;75569:443:0;;;;;;;;-1:-1:-1;75569:443:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;75569:443:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;75569:443:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;75569:443:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;75569:443:0;;-1:-1:-1;75569:443:0;;-1:-1:-1;;;;;75569:443:0:i;54735:305::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54735:305:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;54735:305:0;;;;;;;;;;;;;;;;;:::i;73979:77::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;73979:77:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;73979:77:0;;:::i;52615:162::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52615:162:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;52615:162:0;;;;;;;;:::i;55111:151::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55111:151:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;55111:151:0;;;;;;;;;;;;;;;;;:::i;74274:86::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;74274:86:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;74274:86:0;;:::i;53141:172::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53141:172:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53141:172:0;;:::i;74674:179::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;74674:179:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;74674:179:0;;;;:::i;73534:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;73534:23:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;73534:23:0;;:::i;74956:607::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;74956:607:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;74956:607:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;74956:607:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;74956:607:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;74956:607:0;;-1:-1:-1;74956:607:0;;-1:-1:-1;;;;;74956:607:0:i;50815:177::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50815:177:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50815:177:0;;:::i;74859:91::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;74859:91:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;74859:91:0;;;;;;;;;;;;;;;;;52434:97;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52434:97:0;;;:::i;50532:221::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50532:221:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50532:221:0;-1:-1:-1;;;;;50532:221:0;;:::i;65801:148::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65801:148:0;;;:::i;74062:123::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;74062:123:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;74062:123:0;;;;;;;:::i;65150:87::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65150:87:0;;;:::i;51228:104::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51228:104:0;;;:::i;54138:295::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54138:295:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;54138:295:0;;;;;;;;;;:::i;55333:285::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55333:285:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;55333:285:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;55333:285:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;55333:285:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;55333:285:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;55333:285:0;;-1:-1:-1;55333:285:0;;-1:-1:-1;;;;;55333:285:0:i;76135:348::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;76135:348:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;76135:348:0;;:::i;73870:103::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;73870:103:0;;;:::i;74366:302::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;74366:302:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;74366:302:0;;;;:::i;54504:164::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54504:164:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;54504:164:0;;;;;;;;;;:::i;74191:77::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;74191:77:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;74191:77:0;;:::i;66104:244::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66104:244:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;66104:244:0;-1:-1:-1;;;;;66104:244:0;;:::i;10533:150::-;-1:-1:-1;;;;;;10642:33:0;;10618:4;10642:33;;;;;;;;;;;;;10533:150;;;;:::o;51059:100::-;51146:5;51139:12;;;;;;;;-1:-1:-1;;51139:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51113:13;;51139:12;;51146:5;;51139:12;;51146:5;51139:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51059:100;:::o;53845:221::-;53921:7;53949:16;53957:7;53949;:16::i;:::-;53941:73;;;;-1:-1:-1;;;53941:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54034:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;54034:24:0;;53845:221::o;53375:404::-;53456:13;53472:23;53487:7;53472:14;:23::i;:::-;53456:39;;53520:5;-1:-1:-1;;;;;53514:11:0;:2;-1:-1:-1;;;;;53514:11:0;;;53506:57;;;;-1:-1:-1;;;53506:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53600:5;-1:-1:-1;;;;;53584:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;53584:21:0;;:69;;;;53609:44;53633:5;53640:12;:10;:12::i;:::-;53609:23;:44::i;:::-;53576:161;;;;-1:-1:-1;;;53576:161:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53750:21;53759:2;53763:7;53750:8;:21::i;:::-;53375:404;;;:::o;52853:211::-;52914:7;53035:21;:12;:19;:21::i;:::-;53028:28;;52853:211;:::o;75569:443::-;75670:9;;75656:3;:10;:23;;75648:72;;;;-1:-1:-1;;;75648:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75733:6;75729:231;75745:3;:10;75743:1;:12;75729:231;;;75779:38;75798:10;75810:3;75814:1;75810:6;;;;;;;;;;;;;;75779:38;;:18;:38::i;:::-;75771:80;;;;;-1:-1:-1;;;75771:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;75883:3;75887:1;75883:6;;;;;;;;;;;;;;75868:21;;:11;;:21;;:45;;;;;75907:3;75911:1;75907:6;;;;;;;;;;;;;;75893:20;;:11;;:20;75868:45;75860:92;;;;-1:-1:-1;;;75860:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75757:3;;75729:231;;;;75983:10;-1:-1:-1;;;;;75973:33:0;;75995:3;76000:5;75973:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;75973:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;75973:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75569:443;;:::o;54735:305::-;54896:41;54915:12;:10;:12::i;:::-;54929:7;54896:18;:41::i;:::-;54888:103;;;;-1:-1:-1;;;54888:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55004:28;55014:4;55020:2;55024:7;55004:9;:28::i;73979:77::-;65381:12;:10;:12::i;:::-;-1:-1:-1;;;;;65370:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65370:23:0;;65362:68;;;;;-1:-1:-1;;;65362:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;65362:68:0;;;;;;;;;;;;;;;74033:9:::1;:17:::0;73979:77::o;52615:162::-;-1:-1:-1;;;;;52739:20:0;;52712:7;52739:20;;;:13;:20;;;;;:30;;52763:5;52739:30;:23;:30;:::i;:::-;52732:37;;52615:162;;;;;:::o;55111:151::-;55215:39;55232:4;55238:2;55242:7;55215:39;;;;;;;;;;;;:16;:39::i;74274:86::-;65381:12;:10;:12::i;:::-;-1:-1:-1;;;;;65370:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65370:23:0;;65362:68;;;;;-1:-1:-1;;;65362:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;65362:68:0;;;;;;;;;;;;;;;74351:3:::1;74340:14;74330:7;:24:::0;74274:86::o;53141:172::-;53216:7;;53258:22;:12;53274:5;53258:22;:15;:22;:::i;:::-;-1:-1:-1;53236:44:0;53141:172;-1:-1:-1;;;53141:172:0:o;74674:179::-;74728:7;74752:11;74760:2;74752:11;;:7;:11::i;:::-;74744:41;;;;;-1:-1:-1;;;74744:41:0;;;;;;;;;;;;-1:-1:-1;;;74744:41:0;;;;;;;;;;;;;;;-1:-1:-1;74809:37:0;;;74826:19;;;73430:24;74826:19;74809:37;;;;;;;;;;26:21:-1;;;22:32;;6:49;;74809:37:0;;;;;;74799:48;;;;;74674:179;;;:::o;73534:23::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73534:23:0;:::o;74956:607::-;73392:2;75028:3;:10;:23;;75020:81;;;;-1:-1:-1;;;75020:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75127:7;:5;:7::i;:::-;-1:-1:-1;;;;;75113:21:0;:10;-1:-1:-1;;;;;75113:21:0;;75110:108;;75178:7;;75165:3;:10;:20;75152:9;:33;;75144:74;;;;;-1:-1:-1;;;75144:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;75231:8;75227:329;75245:3;:10;75243:1;:12;;;75227:329;;;75290:9;;75281:3;75285:1;75281:6;;;;;;;;;;;;;;;;:18;;;75273:62;;;;;-1:-1:-1;;;75273:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;75364:1;75354:3;75358:1;75354:6;;;;;;;;;;;;;;;;:11;;;;:36;;;;;73321:4;75369:3;75373:1;75369:6;;;;;;;;;;;;;;;;:21;;;75354:36;75346:65;;;;;-1:-1:-1;;;75346:65:0;;;;;;;;;;;;-1:-1:-1;;;75346:65:0;;;;;;;;;;;;;;;75431:15;75439:3;75443:1;75439:6;;;;;;;;;;;;;;;;75431:15;;:7;:15::i;:::-;75430:16;75422:51;;;;;-1:-1:-1;;;75422:51:0;;;;;;;;;;;;-1:-1:-1;;;75422:51:0;;;;;;;;;;;;;;;75484:29;75494:10;75506:3;75510:1;75506:6;;;;;;;;;;;;;;;;75484:29;;:9;:29::i;:::-;75524:9;75539:3;75543:1;75539:6;;;;;;;;;;;;;;;;;;;;;27:10:-1;;39:1;23:18;;;45:23;;-1:-1;75524:22:0;;;;;;;;;;;;;;;;;75257:3;75227:329;;;;74956:607;:::o;50815:177::-;50887:7;50914:70;50931:7;50914:70;;;;;;;;;;;;;;;;;:12;;:70;;:16;:70;:::i;74859:91::-;74906:13;74935:9;74928:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74859:91;:::o;52434:97::-;52515:8;52508:15;;;;;;;;-1:-1:-1;;52508:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52482:13;;52508:15;;52515:8;;52508:15;;52515:8;52508:15;;;;;;;;;;;;;;;;;;;;;;;;50532:221;50604:7;-1:-1:-1;;;;;50632:19:0;;50624:74;;;;-1:-1:-1;;;50624:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50716:20:0;;;;;;:13;:20;;;;;:29;;:27;:29::i;65801:148::-;65381:12;:10;:12::i;:::-;-1:-1:-1;;;;;65370:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65370:23:0;;65362:68;;;;;-1:-1:-1;;;65362:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;65362:68:0;;;;;;;;;;;;;;;65892:6:::1;::::0;65871:40:::1;::::0;65908:1:::1;::::0;-1:-1:-1;;;;;65892:6:0::1;::::0;65871:40:::1;::::0;65908:1;;65871:40:::1;65922:6;:19:::0;;-1:-1:-1;;;;;;65922:19:0::1;::::0;;65801:148::o;74062:123::-;65381:12;:10;:12::i;:::-;-1:-1:-1;;;;;65370:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65370:23:0;;65362:68;;;;;-1:-1:-1;;;65362:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;65362:68:0;;;;;;;;;;;;;;;74134:11:::1;:19:::0;;;;74160:11:::1;:19:::0;74062:123::o;65150:87::-;65223:6;;-1:-1:-1;;;;;65223:6:0;65150:87;:::o;51228:104::-;51317:7;51310:14;;;;;;;;-1:-1:-1;;51310:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51284:13;;51310:14;;51317:7;;51310:14;;51317:7;51310:14;;;;;;;;;;;;;;;;;;;;;;;;54138:295;54253:12;:10;:12::i;:::-;-1:-1:-1;;;;;54241:24:0;:8;-1:-1:-1;;;;;54241:24:0;;;54233:62;;;;;-1:-1:-1;;;54233:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;54353:8;54308:18;:32;54327:12;:10;:12::i;:::-;-1:-1:-1;;;;;54308:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;54308:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;54308:53:0;;;;;;;;;;;54392:12;:10;:12::i;:::-;54377:48;;;;;;;;;;-1:-1:-1;;;;;54377:48:0;;;;;;;;;;;;;;54138:295;;:::o;55333:285::-;55465:41;55484:12;:10;:12::i;:::-;55498:7;55465:18;:41::i;:::-;55457:103;;;;-1:-1:-1;;;55457:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55571:39;55585:4;55591:2;55595:7;55604:5;55571:13;:39::i;:::-;55333:285;;;;:::o;76135:348::-;76208:13;76240:16;76248:7;76240;:16::i;:::-;76232:76;;;;-1:-1:-1;;;76232:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76319:21;76343:10;:8;:10::i;:::-;76319:34;;76393:1;76375:7;76369:21;:25;:108;;;;;;;;;;;;;;;;;76432:7;76441:18;:7;:16;:18::i;:::-;76415:45;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;76415:45:0;;;;;;;;;;-1:-1:-1;76415:45:0;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;76415:45:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;76415:45:0;;;76369:108;76362:115;76135:348;-1:-1:-1;;;76135:348:0:o;73870:103::-;65381:12;:10;:12::i;:::-;-1:-1:-1;;;;;65370:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65370:23:0;;65362:68;;;;;-1:-1:-1;;;65362:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;65362:68:0;;;;;;;;;;;;;;;73916:51:::1;::::0;73924:10:::1;::::0;73945:21:::1;73916:51:::0;::::1;;;::::0;::::1;::::0;;;73945:21;73924:10;73916:51;::::1;;;;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;73916:51:0;73870:103::o:0;74366:302::-;74414:13;74444:11;74452:2;74444:11;;:7;:11::i;:::-;74436:41;;;;;-1:-1:-1;;;74436:41:0;;;;;;;;;;;;-1:-1:-1;;;74436:41:0;;;;;;;;;;;;;;;74484:14;73358:3;74502:2;:16;;;74501:33;;74529:5;74501:33;;;74522:4;74501:33;74568:37;;;74585:19;;;73430:24;74585:19;74568:37;;;;;;;;;;26:21:-1;;;22:32;;6:49;;74568:37:0;;;;;;74558:48;;;;;74484:50;;-1:-1:-1;74633:27:0;74558:48;74484:50;74633:10;:27::i;:::-;74613:49;74366:302;-1:-1:-1;;;;74366:302:0:o;54504:164::-;-1:-1:-1;;;;;54625:25:0;;;54601:4;54625:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;54504:164::o;74191:77::-;65381:12;:10;:12::i;:::-;-1:-1:-1;;;;;65370:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65370:23:0;;65362:68;;;;;-1:-1:-1;;;65362:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;65362:68:0;;;;;;;;;;;;;;;74247:9:::1;:15:::0;74191:77::o;66104:244::-;65381:12;:10;:12::i;:::-;-1:-1:-1;;;;;65370:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65370:23:0;;65362:68;;;;;-1:-1:-1;;;65362:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;65362:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;66193:22:0;::::1;66185:73;;;;-1:-1:-1::0;;;66185:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66295:6;::::0;66274:38:::1;::::0;-1:-1:-1;;;;;66274:38:0;;::::1;::::0;66295:6:::1;::::0;66274:38:::1;::::0;66295:6:::1;::::0;66274:38:::1;66323:6;:17:::0;;-1:-1:-1;;;;;;66323:17:0::1;-1:-1:-1::0;;;;;66323:17:0;;;::::1;::::0;;;::::1;::::0;;66104:244::o;57085:127::-;57150:4;57174:30;:12;57196:7;57174:30;:21;:30;:::i;683:106::-;771:10;683:106;:::o;63103:192::-;63178:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;63178:29:0;-1:-1:-1;;;;;63178:29:0;;;;;;;;:24;;63232:23;63178:24;63232:14;:23::i;:::-;-1:-1:-1;;;;;63223:46:0;;;;;;;;;;;63103:192;;:::o;44764:123::-;44833:7;44860:19;44868:3;44860:7;:19::i;57379:355::-;57472:4;57497:16;57505:7;57497;:16::i;:::-;57489:73;;;;-1:-1:-1;;;57489:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57573:13;57589:23;57604:7;57589:14;:23::i;:::-;57573:39;;57642:5;-1:-1:-1;;;;;57631:16:0;:7;-1:-1:-1;;;;;57631:16:0;;:51;;;;57675:7;-1:-1:-1;;;;;57651:31:0;:20;57663:7;57651:11;:20::i;:::-;-1:-1:-1;;;;;57651:31:0;;57631:51;:94;;;;57686:39;57710:5;57717:7;57686:23;:39::i;60515:599::-;60640:4;-1:-1:-1;;;;;60613:31:0;:23;60628:7;60613:14;:23::i;:::-;-1:-1:-1;;;;;60613:31:0;;60605:85;;;;-1:-1:-1;;;60605:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60727:16:0;;60719:65;;;;-1:-1:-1;;;60719:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60797:39;60818:4;60824:2;60828:7;60797:20;:39::i;:::-;60901:29;60918:1;60922:7;60901:8;:29::i;:::-;-1:-1:-1;;;;;60943:19:0;;;;;;:13;:19;;;;;:35;;60970:7;60943:35;:26;:35;:::i;:::-;-1:-1:-1;;;;;;60989:17:0;;;;;;:13;:17;;;;;:30;;61011:7;60989:30;:21;:30;:::i;:::-;-1:-1:-1;61032:29:0;:12;61049:7;61058:2;61032:29;:16;:29;:::i;:::-;;61098:7;61094:2;-1:-1:-1;;;;;61079:27:0;61088:4;-1:-1:-1;;;;;61079:27:0;;;;;;;;;;;60515:599;;;:::o;36508:137::-;36579:7;36614:22;36618:3;36630:5;36614:3;:22::i;45226:236::-;45306:7;;;;45366:22;45370:3;45382:5;45366:3;:22::i;:::-;45335:53;;;;-1:-1:-1;45226:236:0;-1:-1:-1;;;;;45226:236:0:o;58077:110::-;58153:26;58163:2;58167:7;58153:26;;;;;;;;;;;;:9;:26::i;46512:213::-;46619:7;46670:44;46675:3;46695;46701:12;46670:4;:44::i;56500:272::-;56614:28;56624:4;56630:2;56634:7;56614:9;:28::i;:::-;56661:48;56684:4;56690:2;56694:7;56703:5;56661:22;:48::i;:::-;56653:111;;;;-1:-1:-1;;;56653:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76018;76091:32;;;;;;;;;;;;;;;;;76018:111;:::o;66630:746::-;66686:13;66907:10;66903:53;;-1:-1:-1;66934:10:0;;;;;;;;;;;;-1:-1:-1;;;66934:10:0;;;;;;66903:53;66981:5;66966:12;67022:78;67029:9;;67022:78;;67055:8;;67086:2;67078:10;;;;67022:78;;;67110:19;67142:6;67132:17;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;67132:17:0;87:34:-1;135:17;;-1:-1;67132:17:0;-1:-1:-1;67204:5:0;;-1:-1:-1;67110:39:0;-1:-1:-1;;;67176:10:0;;67220:117;67227:9;;67220:117;;67296:2;67289:4;:9;67284:2;:14;67271:29;;67253:6;67260:7;;;;;;;67253:15;;;;;;;;;;;:47;-1:-1:-1;;;;;67253:47:0;;;;;;;;-1:-1:-1;67323:2:0;67315:10;;;;67220:117;;;-1:-1:-1;67361:6:0;66630:746;-1:-1:-1;;;;66630:746:0:o;68023:384::-;68092:17;68333:25;68342:4;68348:9;68333:8;:25::i;:::-;68144:246;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;;;;365:33;;-1:-1;;;68144:246:0;;;;;-1:-1:-1;68144:246:0;;;26:21:-1;;;-1:-1;;22:32;6:49;;68144:246:0;;;;;;;;-1:-1:-1;;;;;68023:384:0:o;44525:151::-;44609:4;44633:35;44643:3;44663;44633:9;:35::i;41343:110::-;41426:19;;41343:110::o;35595:137::-;35665:4;35689:35;35697:3;35717:5;35689:7;:35::i;35288:131::-;35355:4;35379:32;35384:3;35404:5;35379:4;:32::i;43948:185::-;44037:4;44061:64;44066:3;44086;-1:-1:-1;;;;;44100:23:0;;44061:4;:64::i;31546:204::-;31641:18;;31613:7;;31641:26;-1:-1:-1;31633:73:0;;;;-1:-1:-1;;;31633:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31724:3;:11;;31736:5;31724:18;;;;;;;;;;;;;;;;31717:25;;31546:204;;;;:::o;41808:279::-;41912:19;;41875:7;;;;41912:27;-1:-1:-1;41904:74:0;;;;-1:-1:-1;;;41904:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41991:22;42016:3;:12;;42029:5;42016:19;;;;;;;;;;;;;;;;;;41991:44;;42054:5;:10;;;42066:5;:12;;;42046:33;;;;;41808:279;;;;;:::o;58414:250::-;58510:18;58516:2;58520:7;58510:5;:18::i;:::-;58547:54;58578:1;58582:2;58586:7;58595:5;58547:22;:54::i;:::-;58539:117;;;;-1:-1:-1;;;58539:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43305:319;43399:7;43438:17;;;:12;;;:17;;;;;;43489:12;43474:13;43466:36;;;;-1:-1:-1;;;43466:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43466:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43556:3;:12;;43580:1;43569:8;:12;43556:26;;;;;;;;;;;;;;;;;;:33;;;43549:40;;;43305:319;;;;;:::o;62380:604::-;62501:4;62528:15;:2;-1:-1:-1;;;;;62528:13:0;;:15::i;:::-;62523:60;;-1:-1:-1;62567:4:0;62560:11;;62523:60;62593:23;62619:252;-1:-1:-1;;;62732:12:0;:10;:12::i;:::-;62759:4;62778:7;62800:5;62635:181;;;;;;-1:-1:-1;;;;;62635:181:0;-1:-1:-1;;;;;62635:181:0;;;;;;-1:-1:-1;;;;;62635:181:0;-1:-1:-1;;;;;62635:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;62635:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;62635:181:0;;;;-1:-1:-1;;;;;62635:181:0;;38:4:-1;29:7;25:18;67:10;61:17;-1:-1;;;;;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;62635:181:0;62619:252;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;62619:15:0;;;:252;;:15;:252;:::i;:::-;62593:278;;62882:13;62909:10;62898:32;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;62898:32:0;-1:-1:-1;;;;;;62949:26:0;-1:-1:-1;;;62949:26:0;;-1:-1:-1;;;62380:604:0;;;;;;:::o;68937:2419::-;69038:25;;;;;;;;;-1:-1:-1;69038:25:0;;;69103:22;;;;;;;;;;26:21:-1;;;22:32;;6:49;;69103:22:0;;;;;;69093:33;;;;;;;;;;69008:19;;69146:22;69093:33;-1:-1:-1;69146:8:0;:22::i;:::-;69135:33;;69177:8;69188:22;69197:8;67899:1;69188:8;:22::i;:::-;69177:33;;69219:8;69230:22;69239:8;67927:1;69230:8;:22::i;:::-;69219:33;;69261:8;69272:22;69281:8;67955:1;69272:8;:22::i;:::-;69261:33;;69303:8;69314:22;69323:8;67983:1;69314:8;:22::i;:::-;69303:33;;69345:8;69356:22;69365:8;68011:1;69356:8;:22::i;:::-;69345:33;-1:-1:-1;69387:7:0;;;;69423:735;67842:2;69438:7;;;;69423:735;;;69467:7;69463:685;67811:1;69478:7;;;;69463:685;;;69545:8;69528:26;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;69528:26:0;;;69518:37;;;;;;69507:48;;69571:31;69580:8;67747:2;69571:8;:31::i;:::-;69568:144;;;69623:2;69619:6;;69631:2;69627:6;;69639:2;69635:6;;69568:144;;;69680:2;69676:6;;69688:2;69684:6;;69696:2;69692:6;;69568:144;69762:8;69745:26;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;69745:26:0;;;69735:37;;;;;;69724:48;;69788:31;69797:8;67709:2;69788:8;:31::i;:::-;:50;;;;;69824:14;69833:1;69824:14;;69836:1;69824:14;;:8;:14::i;:::-;69823:15;69788:50;69785:338;;;69878:51;69888:6;69896:32;69907:1;69910;69913;69916;69919;69922;69925;69896:10;:32::i;:::-;69878:9;:51::i;:::-;69869:60;-1:-1:-1;69953:9:0;69949:13;;;;69946:164;;;-1:-1:-1;;67842:2:0;69997:9;;;:13;70037:57;70047:6;70055:38;70066:1;70069;70072;69997:13;70084:1;70009;;70055:10;:38::i;70037:57::-;70028:66;;69946:164;;69487:3;;69463:685;;;-1:-1:-1;69447:3:0;;69423:735;;;;70200:50;70210:6;70218:31;70229:1;70232;70235;70238;70241;70244;70247;70218:10;:31::i;70200:50::-;70191:59;;70268:50;70278:6;70286:31;70297:1;70300;70303;70306;70309;70312;70315;70286:10;:31::i;70268:50::-;70259:59;;70338:51;70348:6;70356:32;70367:1;70370;70373;70376;70379:2;70383:1;70386;70356:10;:32::i;70338:51::-;70329:60;;70407:51;70417:6;70425:32;70436:1;70439;70442;70445;70448:2;70452:1;70455;70425:10;:32::i;70407:51::-;70398:60;;70478:51;70488:6;70496:32;70507:1;70510;70513;70516:2;70520:1;70523;70526;70496:10;:32::i;70478:51::-;70469:60;;70547:51;70557:6;70565:32;70576:1;70579;70582;70585:2;70589:1;70592;70595;70565:10;:32::i;70547:51::-;70538:60;;70618:52;70628:6;70636:33;70647:1;70650;70653;70656:2;70660;70664:1;70667;70636:10;:33::i;70618:52::-;70609:61;;70688:52;70698:6;70706:33;70717:1;70720;70723;70726:2;70730;70734:1;70737;70706:10;:33::i;70688:52::-;70679:61;;70781:50;70791:6;70799:31;70810:1;70813;70816;70819;70822;70825;70828;70799:10;:31::i;70781:50::-;70772:59;;70849:50;70859:6;70867:31;70878:1;70881;70884;70887;70890;70893;70896;70867:10;:31::i;70849:50::-;70840:59;;70917:50;70927:6;70935:31;70946:1;70949;70952;70955;70958;70961;70964;70935:10;:31::i;70917:50::-;70908:59;;70987:50;70997:6;71005:31;71016:1;71019;71022;71025;71028;71031;71034;71005:10;:31::i;70987:50::-;70978:59;;71055:50;71065:6;71073:31;71084:1;71087;71090;71093;71096;71099;71102;71073:10;:31::i;71055:50::-;71046:59;;71133:9;71146;71145:21;;71163:3;71145:21;;;71159:1;71145:21;71133:33;;71186:56;71196:6;71204:37;71215:3;71220;71225;71230:1;71233;71236;71239;71204:10;:37::i;71186:56::-;71177:65;;71260:56;71270:6;71278:37;71289:3;71294;71299;71304:1;71307;71310;71313;71278:10;:37::i;71260:56::-;71251:65;68937:2419;-1:-1:-1;;;;;;;;;;;;;;;68937:2419:0:o;41123:125::-;41194:4;41218:17;;;:12;;;;;:17;;;;;;:22;;;41123:125::o;29248:1544::-;29314:4;29453:19;;;:12;;;:19;;;;;;29489:15;;29485:1300;;29924:18;;-1:-1:-1;;29875:14:0;;;;29924:22;;;;29851:21;;29924:3;;:22;;30211;;;;;;;;;;;;;;30191:42;;30357:9;30328:3;:11;;30340:13;30328:26;;;;;;;;;;;;;;;;;;;:38;;;;30434:23;;;30476:1;30434:12;;;:23;;;;;;30460:17;;;30434:43;;30586:17;;30434:3;;30586:17;;;;;;;;;;;;;;;;;;;;;;30681:3;:12;;:19;30694:5;30681:19;;;;;;;;;;;30674:26;;;30724:4;30717:11;;;;;;;;29485:1300;30768:5;30761:12;;;;;28658:414;28721:4;28743:21;28753:3;28758:5;28743:9;:21::i;:::-;28738:327;;-1:-1:-1;27:10;;39:1;23:18;;;45:23;;28781:11:0;:23;;;;;;;;;;;;;28964:18;;28942:19;;;:12;;;:19;;;;;;:40;;;;28997:11;;28738:327;-1:-1:-1;29048:5:0;29041:12;;38623:692;38699:4;38834:17;;;:12;;;:17;;;;;;38868:13;38864:444;;-1:-1:-1;;38953:38:0;;;;;;;;;;;;;;;;;;27:10:-1;;39:1;23:18;;;45:23;;38935:12:0;:57;;;;;;;;;;;;;;;;;;;;;;;;39150:19;;39130:17;;;:12;;;:17;;;;;;;:39;39184:11;;38864:444;39264:5;39228:3;:12;;39252:1;39241:8;:12;39228:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;39291:5;39284:12;;;;;59000:404;-1:-1:-1;;;;;59080:16:0;;59072:61;;;;;-1:-1:-1;;;59072:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59153:16;59161:7;59153;:16::i;:::-;59152:17;59144:58;;;;;-1:-1:-1;;;59144:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;59215:45;59244:1;59248:2;59252:7;59215:20;:45::i;:::-;-1:-1:-1;;;;;59273:17:0;;;;;;:13;:17;;;;;:30;;59295:7;59273:30;:21;:30;:::i;:::-;-1:-1:-1;59316:29:0;:12;59333:7;59342:2;59316:29;:16;:29;:::i;:::-;-1:-1:-1;59363:33:0;;59388:7;;-1:-1:-1;;;;;59363:33:0;;;59380:1;;59363:33;;59380:1;;59363:33;59000:404;;:::o;19630:422::-;19997:20;20036:8;;;19630:422::o;22548:195::-;22651:12;22683:52;22705:6;22713:4;22719:1;22722:12;22683:21;:52::i;71989:174::-;72057:5;72073:11;72093:4;72098:5;72093:11;;;;;;;;;;;-1:-1:-1;67594:3:0;72093:11;72136:18;67557:2;72121:34;72114:41;;;71989:174;;;;:::o;71819:162::-;71916:14;71946:27;;;67670:3;71887:4;71922:7;;;;71947:17;;;;71946:27;;;71819:162::o;68415:343::-;68472:4;68491:6;;:28;;;;-1:-1:-1;68502:6:0;;;:16;;;68512:1;68517;68512:6;68502:16;68487:66;;;-1:-1:-1;68539:4:0;68532:11;;68487:66;68567:1;68572;68567:6;:36;;;;-1:-1:-1;68578:6:0;;;:24;;-1:-1:-1;68593:9:0;68588:14;;68578:24;68563:74;;;-1:-1:-1;68623:4:0;68616:11;;68563:74;68650:6;;:44;;;;-1:-1:-1;68666:9:0;68661:14;;;:32;;-1:-1:-1;68684:9:0;68679:14;;68661:32;68647:81;;;-1:-1:-1;68714:4:0;68707:11;;68647:81;-1:-1:-1;68745:5:0;68415:343;;;;:::o;71376:435::-;71491:13;71577:11;71586:1;71577:11;;:8;:11::i;:::-;71597;71606:1;71597:11;;:8;:11::i;:::-;71617;71626:1;71617:11;;:8;:11::i;:::-;71655:20;67780:1;71664;:10;71655:20;;:8;:20::i;:::-;71688;67780:1;71697;:10;71688:20;;:8;:20::i;:::-;71737:15;71746:5;71737:15;;:8;:15::i;:::-;71768:16;71777:6;71768:16;;:8;:16::i;:::-;71529:271;;;;;;-1:-1:-1;;;71529:271:0;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;71529:271:0;;;;;;;-1:-1:-1;;;71529:271:0;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;71529:271:0;;;;;;;-1:-1:-1;;;71529:271:0;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;-1:-1;;;71529:271:0;;;;;;;-1:-1:-1;;;71529:271:0;;;;;;;;;;;;;;-1:-1:-1;71529:271:0;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;-1:-1;;;71529:271:0;;;;;;;;;;;;;;;;;-1:-1:-1;71529:271:0;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;-1:-1;;;71529:271:0;;;;;;;-1:-1:-1;;;71529:271:0;;;;;;;;;;;;;;-1:-1:-1;71529:271:0;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;-1:-1;;;71529:271:0;;;;;;;;;;;;;;;;;-1:-1:-1;71529:271:0;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;71529:271:0;;;;;;;-1:-1:-1;;;71529:271:0;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;71529:271:0;;;71515:286;;71376:435;;;;;;;;;:::o;72371:188::-;72455:13;72520:6;72537:4;72493:57;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;72493:57:0;;;;;;;;;;-1:-1:-1;72493:57:0;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;72493:57:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;72493:57:0;;;72479:72;;72371:188;;;;:::o;23600:530::-;23727:12;23785:5;23760:21;:30;;23752:81;;;;-1:-1:-1;;;23752:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23852:18;23863:6;23852:10;:18::i;:::-;23844:60;;;;;-1:-1:-1;;;23844:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23978:12;23992:23;24019:6;-1:-1:-1;;;;;24019:11:0;24039:5;24047:4;24019:33;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;24019:33:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;23977:75:0;;;;24070:52;24088:7;24097:10;24109:12;24070:17;:52::i;:::-;24063:59;23600:530;-1:-1:-1;;;;;;;23600:530:0:o;72567:573::-;72617:27;72661:7;72657:50;;-1:-1:-1;72685:10:0;;;;;;;;;;;;-1:-1:-1;;;72685:10:0;;;;;;72657:50;72726:2;72717:6;72758:69;72765:6;;72758:69;;72788:5;;72813:2;72808:7;;;;72758:69;;;72837:17;72867:3;72857:14;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;72857:14:0;87:34:-1;135:17;;-1:-1;72857:14:0;-1:-1:-1;72837:34:0;-1:-1:-1;72891:3:0;72905:198;72912:7;;72905:198;;-1:-1:-1;;72940:3:0;72958:10;72993:2;72988;:7;72998:2;72988:12;72983:2;:17;72972:2;:29;72958:44;;73017:9;73036:4;73029:12;;73017:24;;73066:2;73056:4;73061:1;73056:7;;;;;;;;;;;:12;-1:-1:-1;;;;;73056:12:0;;;;;;;;-1:-1:-1;73089:2:0;73083:8;;;;72905:198;;;;26140:742;26255:12;26284:7;26280:595;;;-1:-1:-1;26315:10:0;26308:17;;26280:595;26429:17;;:21;26425:439;;26692:10;26686:17;26753:15;26740:10;26736:2;26732:19;26725:44;26640:148;26828:20;;-1:-1:-1;;;26828:20:0;;;;;;;;;;;;;;;;;26835:12;;26828:20;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;

Swarm Source

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