ETH Price: $2,442.11 (-1.32%)
 

Overview

Max Total Supply

0 WOOSH

Holders

4,436

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
loquats.eth
Balance
1 WOOSH
0x48468948b968D3d84781fd3B32AC30D676F8d995
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Deep in the Metaverse, on the Island of Gor, live a species of creatures called Wooshi on a quest to explore the evocative artistry of gaming. Wooshi grant access to immersive community-driven experiences through a metaverse, meta-companions, community events, activations IRL and an expansive saga.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
WooshiNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol



pragma solidity ^0.8.0;

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Context.sol



pragma solidity ^0.8.0;

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721Receiver.sol



pragma solidity ^0.8.0;

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol



pragma solidity ^0.8.0;

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/ERC165.sol



pragma solidity ^0.8.0;


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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/IERC721Metadata.sol



pragma solidity ^0.8.0;


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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol



pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

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

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

// File: WooshiNFT.sol


//RMTPSH
pragma solidity ^0.8.0;




contract WooshiNFT is ERC721{
    address minter;
    string public baseTokenURI;
    mapping(address => bool) public whitelist;

    constructor ()
        ERC721("WOOSHI WORLD", "WOOSH")
        public
    {
        _transferOwnership(_msgSender());
        minter=msg.sender;
        whitelist[msg.sender]=true;
    }
    //calls
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        return string(abi.encodePacked(baseTokenURI, uint2str(tokenId)));
        
        //return urilist[tokenId];
    }
    //admin
    function editWhitelist(address payable user, bool whitelisted) external{
        require(msg.sender==minter, "User is not minter");
        whitelist[user]=whitelisted;
    }
    function editMinter(address payable user) external{
        require(msg.sender==minter, "User is not minter");
        minter=user;
    }
    function setTokenURI(string memory _tokenURI) public virtual {
        require(whitelist[msg.sender]==true, "User is not whitelisted");
        baseTokenURI=_tokenURI;
    }
    function mint(uint tokenID, address user) external{
        require(whitelist[msg.sender]==true, "User is not whitelisted");
        _mint(user, tokenID);
    }
    
    //utils
     function uint2str(
      uint256 _i
    )
      internal
      pure
      returns (string memory str)
    {
        if (_i == 0)
        {
        return "0";
        }
        uint256 j = _i;
        uint256 length;
        while (j != 0)
        {
        length++;
        j /= 10;
        }
        bytes memory bstr = new bytes(length);
        uint256 k = length;
        j = _i;
        while (j != 0)
        {
        bstr[--k] = bytes1(uint8(48 + j % 10));
        j /= 10;
        }
        str = string(bstr);
    }
    
    address private _owner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"user","type":"address"}],"name":"editMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"user","type":"address"},{"internalType":"bool","name":"whitelisted","type":"bool"}],"name":"editWhitelist","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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600c81526020017f574f4f53484920574f524c4400000000000000000000000000000000000000008152506040518060400160405280600581526020017f574f4f53480000000000000000000000000000000000000000000000000000008152508160009080519060200190620000969291906200023f565b508060019080519060200190620000af9291906200023f565b505050620000d2620000c66200017160201b60201c565b6200017960201b60201c565b33600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000354565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200024d90620002ef565b90600052602060002090601f016020900481019282620002715760008555620002bd565b82601f106200028c57805160ff1916838001178555620002bd565b82800160010185558215620002bd579182015b82811115620002bc5782518255916020019190600101906200029f565b5b509050620002cc9190620002d0565b5090565b5b80821115620002eb576000816000905550600101620002d1565b5090565b600060028204905060018216806200030857607f821691505b602082108114156200031f576200031e62000325565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6132e280620003646000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c8063936c5e9b116100b8578063b88d4fde1161007c578063b88d4fde1461035f578063c87b56dd1461037b578063d547cfb7146103ab578063e0df5b6f146103c9578063e985e9c5146103e5578063f2fde38b1461041557610142565b8063936c5e9b146102bd57806394bf804d146102d957806395d89b41146102f55780639b19251a14610313578063a22cb4651461034357610142565b806342842e0e1161010a57806342842e0e146101fd5780636352211e1461021957806370a0823114610249578063715018a61461027957806388cb214e146102835780638da5cb5b1461029f57610142565b806301ffc9a71461014757806306fdde0314610177578063081812fc14610195578063095ea7b3146101c557806323b872dd146101e1575b600080fd5b610161600480360381019061015c919061211e565b610431565b60405161016e919061267e565b60405180910390f35b61017f610513565b60405161018c9190612699565b60405180910390f35b6101af60048036038101906101aa91906121c1565b6105a5565b6040516101bc9190612617565b60405180910390f35b6101df60048036038101906101da91906120de565b61062a565b005b6101fb60048036038101906101f69190611fc8565b610742565b005b61021760048036038101906102129190611fc8565b6107a2565b005b610233600480360381019061022e91906121c1565b6107c2565b6040516102409190612617565b60405180910390f35b610263600480360381019061025e9190611eee565b610874565b60405161027091906128fb565b60405180910390f35b61028161092c565b005b61029d60048036038101906102989190611f48565b6109b4565b005b6102a7610a9f565b6040516102b49190612617565b60405180910390f35b6102d760048036038101906102d29190611f1b565b610ac9565b005b6102f360048036038101906102ee91906121ee565b610b9d565b005b6102fd610c3e565b60405161030a9190612699565b60405180910390f35b61032d60048036038101906103289190611eee565b610cd0565b60405161033a919061267e565b60405180910390f35b61035d6004803603810190610358919061209e565b610cf0565b005b6103796004803603810190610374919061201b565b610e71565b005b610395600480360381019061039091906121c1565b610ed3565b6040516103a29190612699565b60405180910390f35b6103b3610f4f565b6040516103c09190612699565b60405180910390f35b6103e360048036038101906103de9190612178565b610fdd565b005b6103ff60048036038101906103fa9190611f88565b61108a565b60405161040c919061267e565b60405180910390f35b61042f600480360381019061042a9190611eee565b61111e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104fc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061050c575061050b82611216565b5b9050919050565b60606000805461052290612ba2565b80601f016020809104026020016040519081016040528092919081815260200182805461054e90612ba2565b801561059b5780601f106105705761010080835404028352916020019161059b565b820191906000526020600020905b81548152906001019060200180831161057e57829003601f168201915b5050505050905090565b60006105b082611280565b6105ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e69061281b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610635826107c2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069d9061289b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106c56112ec565b73ffffffffffffffffffffffffffffffffffffffff1614806106f457506106f3816106ee6112ec565b61108a565b5b610733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072a9061279b565b60405180910390fd5b61073d83836112f4565b505050565b61075361074d6112ec565b826113ad565b610792576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610789906128bb565b60405180910390fd5b61079d83838361148b565b505050565b6107bd83838360405180602001604052806000815250610e71565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561086b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610862906127db565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156108e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108dc906127bb565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6109346112ec565b73ffffffffffffffffffffffffffffffffffffffff16610952610a9f565b73ffffffffffffffffffffffffffffffffffffffff16146109a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099f9061283b565b60405180910390fd5b6109b260006116e7565b565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3b906128db565b60405180910390fd5b80600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b50906128db565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60011515600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c279061277b565b60405180910390fd5b610c3a81836117ad565b5050565b606060018054610c4d90612ba2565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7990612ba2565b8015610cc65780601f10610c9b57610100808354040283529160200191610cc6565b820191906000526020600020905b815481529060010190602001808311610ca957829003601f168201915b5050505050905090565b60086020528060005260406000206000915054906101000a900460ff1681565b610cf86112ec565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5d9061273b565b60405180910390fd5b8060056000610d736112ec565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610e206112ec565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e65919061267e565b60405180910390a35050565b610e82610e7c6112ec565b836113ad565b610ec1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb8906128bb565b60405180910390fd5b610ecd8484848461197b565b50505050565b6060610ede82611280565b610f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f149061287b565b60405180910390fd5b6007610f28836119d7565b604051602001610f399291906125f3565b6040516020818303038152906040529050919050565b60078054610f5c90612ba2565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8890612ba2565b8015610fd55780601f10610faa57610100808354040283529160200191610fd5565b820191906000526020600020905b815481529060010190602001808311610fb857829003601f168201915b505050505081565b60011515600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611070576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110679061277b565b60405180910390fd5b8060079080519060200190611086929190611ced565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111266112ec565b73ffffffffffffffffffffffffffffffffffffffff16611144610a9f565b73ffffffffffffffffffffffffffffffffffffffff161461119a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111919061283b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561120a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611201906126db565b60405180910390fd5b611213816116e7565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611367836107c2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006113b882611280565b6113f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ee9061275b565b60405180910390fd5b6000611402836107c2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061147157508373ffffffffffffffffffffffffffffffffffffffff16611459846105a5565b73ffffffffffffffffffffffffffffffffffffffff16145b806114825750611481818561108a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166114ab826107c2565b73ffffffffffffffffffffffffffffffffffffffff1614611501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f89061285b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611571576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115689061271b565b60405180910390fd5b61157c838383611b3e565b6115876000826112f4565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115d79190612a7c565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461162e91906129f5565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561181d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611814906127fb565b60405180910390fd5b61182681611280565b15611866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185d906126fb565b60405180910390fd5b61187260008383611b3e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118c291906129f5565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61198684848461148b565b61199284848484611b43565b6119d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c8906126bb565b60405180910390fd5b50505050565b60606000821415611a1f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611b39565b600082905060005b60008214611a51578080611a3a90612c05565b915050600a82611a4a9190612a4b565b9150611a27565b60008167ffffffffffffffff811115611a6d57611a6c612d3b565b5b6040519080825280601f01601f191660200182016040528015611a9f5781602001600182028036833780820191505090505b50905060008290508593505b60008414611b3157600a84611ac09190612c4e565b6030611acc91906129f5565b60f81b8282611ada90612b78565b92508281518110611aee57611aed612d0c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84611b2a9190612a4b565b9350611aab565b819450505050505b919050565b505050565b6000611b648473ffffffffffffffffffffffffffffffffffffffff16611cda565b15611ccd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b8d6112ec565b8786866040518563ffffffff1660e01b8152600401611baf9493929190612632565b602060405180830381600087803b158015611bc957600080fd5b505af1925050508015611bfa57506040513d601f19601f82011682018060405250810190611bf7919061214b565b60015b611c7d573d8060008114611c2a576040519150601f19603f3d011682016040523d82523d6000602084013e611c2f565b606091505b50600081511415611c75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6c906126bb565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611cd2565b600190505b949350505050565b600080823b905060008111915050919050565b828054611cf990612ba2565b90600052602060002090601f016020900481019282611d1b5760008555611d62565b82601f10611d3457805160ff1916838001178555611d62565b82800160010185558215611d62579182015b82811115611d61578251825591602001919060010190611d46565b5b509050611d6f9190611d73565b5090565b5b80821115611d8c576000816000905550600101611d74565b5090565b6000611da3611d9e8461293b565b612916565b905082815260208101848484011115611dbf57611dbe612d6f565b5b611dca848285612b36565b509392505050565b6000611de5611de08461296c565b612916565b905082815260208101848484011115611e0157611e00612d6f565b5b611e0c848285612b36565b509392505050565b600081359050611e2381613239565b92915050565b600081359050611e3881613250565b92915050565b600081359050611e4d81613267565b92915050565b600081359050611e628161327e565b92915050565b600081519050611e778161327e565b92915050565b600082601f830112611e9257611e91612d6a565b5b8135611ea2848260208601611d90565b91505092915050565b600082601f830112611ec057611ebf612d6a565b5b8135611ed0848260208601611dd2565b91505092915050565b600081359050611ee881613295565b92915050565b600060208284031215611f0457611f03612d79565b5b6000611f1284828501611e14565b91505092915050565b600060208284031215611f3157611f30612d79565b5b6000611f3f84828501611e29565b91505092915050565b60008060408385031215611f5f57611f5e612d79565b5b6000611f6d85828601611e29565b9250506020611f7e85828601611e3e565b9150509250929050565b60008060408385031215611f9f57611f9e612d79565b5b6000611fad85828601611e14565b9250506020611fbe85828601611e14565b9150509250929050565b600080600060608486031215611fe157611fe0612d79565b5b6000611fef86828701611e14565b935050602061200086828701611e14565b925050604061201186828701611ed9565b9150509250925092565b6000806000806080858703121561203557612034612d79565b5b600061204387828801611e14565b945050602061205487828801611e14565b935050604061206587828801611ed9565b925050606085013567ffffffffffffffff81111561208657612085612d74565b5b61209287828801611e7d565b91505092959194509250565b600080604083850312156120b5576120b4612d79565b5b60006120c385828601611e14565b92505060206120d485828601611e3e565b9150509250929050565b600080604083850312156120f5576120f4612d79565b5b600061210385828601611e14565b925050602061211485828601611ed9565b9150509250929050565b60006020828403121561213457612133612d79565b5b600061214284828501611e53565b91505092915050565b60006020828403121561216157612160612d79565b5b600061216f84828501611e68565b91505092915050565b60006020828403121561218e5761218d612d79565b5b600082013567ffffffffffffffff8111156121ac576121ab612d74565b5b6121b884828501611eab565b91505092915050565b6000602082840312156121d7576121d6612d79565b5b60006121e584828501611ed9565b91505092915050565b6000806040838503121561220557612204612d79565b5b600061221385828601611ed9565b925050602061222485828601611e14565b9150509250929050565b61223781612ab0565b82525050565b61224681612ad4565b82525050565b6000612257826129b2565b61226181856129c8565b9350612271818560208601612b45565b61227a81612d7e565b840191505092915050565b6000612290826129bd565b61229a81856129d9565b93506122aa818560208601612b45565b6122b381612d7e565b840191505092915050565b60006122c9826129bd565b6122d381856129ea565b93506122e3818560208601612b45565b80840191505092915050565b600081546122fc81612ba2565b61230681866129ea565b94506001821660008114612321576001811461233257612365565b60ff19831686528186019350612365565b61233b8561299d565b60005b8381101561235d5781548189015260018201915060208101905061233e565b838801955050505b50505092915050565b600061237b6032836129d9565b915061238682612d8f565b604082019050919050565b600061239e6026836129d9565b91506123a982612dde565b604082019050919050565b60006123c1601c836129d9565b91506123cc82612e2d565b602082019050919050565b60006123e46024836129d9565b91506123ef82612e56565b604082019050919050565b60006124076019836129d9565b915061241282612ea5565b602082019050919050565b600061242a602c836129d9565b915061243582612ece565b604082019050919050565b600061244d6017836129d9565b915061245882612f1d565b602082019050919050565b60006124706038836129d9565b915061247b82612f46565b604082019050919050565b6000612493602a836129d9565b915061249e82612f95565b604082019050919050565b60006124b66029836129d9565b91506124c182612fe4565b604082019050919050565b60006124d96020836129d9565b91506124e482613033565b602082019050919050565b60006124fc602c836129d9565b91506125078261305c565b604082019050919050565b600061251f6020836129d9565b915061252a826130ab565b602082019050919050565b60006125426029836129d9565b915061254d826130d4565b604082019050919050565b6000612565602f836129d9565b915061257082613123565b604082019050919050565b60006125886021836129d9565b915061259382613172565b604082019050919050565b60006125ab6031836129d9565b91506125b6826131c1565b604082019050919050565b60006125ce6012836129d9565b91506125d982613210565b602082019050919050565b6125ed81612b2c565b82525050565b60006125ff82856122ef565b915061260b82846122be565b91508190509392505050565b600060208201905061262c600083018461222e565b92915050565b6000608082019050612647600083018761222e565b612654602083018661222e565b61266160408301856125e4565b8181036060830152612673818461224c565b905095945050505050565b6000602082019050612693600083018461223d565b92915050565b600060208201905081810360008301526126b38184612285565b905092915050565b600060208201905081810360008301526126d48161236e565b9050919050565b600060208201905081810360008301526126f481612391565b9050919050565b60006020820190508181036000830152612714816123b4565b9050919050565b60006020820190508181036000830152612734816123d7565b9050919050565b60006020820190508181036000830152612754816123fa565b9050919050565b600060208201905081810360008301526127748161241d565b9050919050565b6000602082019050818103600083015261279481612440565b9050919050565b600060208201905081810360008301526127b481612463565b9050919050565b600060208201905081810360008301526127d481612486565b9050919050565b600060208201905081810360008301526127f4816124a9565b9050919050565b60006020820190508181036000830152612814816124cc565b9050919050565b60006020820190508181036000830152612834816124ef565b9050919050565b6000602082019050818103600083015261285481612512565b9050919050565b6000602082019050818103600083015261287481612535565b9050919050565b6000602082019050818103600083015261289481612558565b9050919050565b600060208201905081810360008301526128b48161257b565b9050919050565b600060208201905081810360008301526128d48161259e565b9050919050565b600060208201905081810360008301526128f4816125c1565b9050919050565b600060208201905061291060008301846125e4565b92915050565b6000612920612931565b905061292c8282612bd4565b919050565b6000604051905090565b600067ffffffffffffffff82111561295657612955612d3b565b5b61295f82612d7e565b9050602081019050919050565b600067ffffffffffffffff82111561298757612986612d3b565b5b61299082612d7e565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612a0082612b2c565b9150612a0b83612b2c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612a4057612a3f612c7f565b5b828201905092915050565b6000612a5682612b2c565b9150612a6183612b2c565b925082612a7157612a70612cae565b5b828204905092915050565b6000612a8782612b2c565b9150612a9283612b2c565b925082821015612aa557612aa4612c7f565b5b828203905092915050565b6000612abb82612b0c565b9050919050565b6000612acd82612b0c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612b63578082015181840152602081019050612b48565b83811115612b72576000848401525b50505050565b6000612b8382612b2c565b91506000821415612b9757612b96612c7f565b5b600182039050919050565b60006002820490506001821680612bba57607f821691505b60208210811415612bce57612bcd612cdd565b5b50919050565b612bdd82612d7e565b810181811067ffffffffffffffff82111715612bfc57612bfb612d3b565b5b80604052505050565b6000612c1082612b2c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612c4357612c42612c7f565b5b600182019050919050565b6000612c5982612b2c565b9150612c6483612b2c565b925082612c7457612c73612cae565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f55736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f55736572206973206e6f74206d696e7465720000000000000000000000000000600082015250565b61324281612ab0565b811461324d57600080fd5b50565b61325981612ac2565b811461326457600080fd5b50565b61327081612ad4565b811461327b57600080fd5b50565b61328781612ae0565b811461329257600080fd5b50565b61329e81612b2c565b81146132a957600080fd5b5056fea264697066735822122071808787bf3525846b456dc6c5397f44d8dae33d66f59f7e983fec8cbccbe5d764736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101425760003560e01c8063936c5e9b116100b8578063b88d4fde1161007c578063b88d4fde1461035f578063c87b56dd1461037b578063d547cfb7146103ab578063e0df5b6f146103c9578063e985e9c5146103e5578063f2fde38b1461041557610142565b8063936c5e9b146102bd57806394bf804d146102d957806395d89b41146102f55780639b19251a14610313578063a22cb4651461034357610142565b806342842e0e1161010a57806342842e0e146101fd5780636352211e1461021957806370a0823114610249578063715018a61461027957806388cb214e146102835780638da5cb5b1461029f57610142565b806301ffc9a71461014757806306fdde0314610177578063081812fc14610195578063095ea7b3146101c557806323b872dd146101e1575b600080fd5b610161600480360381019061015c919061211e565b610431565b60405161016e919061267e565b60405180910390f35b61017f610513565b60405161018c9190612699565b60405180910390f35b6101af60048036038101906101aa91906121c1565b6105a5565b6040516101bc9190612617565b60405180910390f35b6101df60048036038101906101da91906120de565b61062a565b005b6101fb60048036038101906101f69190611fc8565b610742565b005b61021760048036038101906102129190611fc8565b6107a2565b005b610233600480360381019061022e91906121c1565b6107c2565b6040516102409190612617565b60405180910390f35b610263600480360381019061025e9190611eee565b610874565b60405161027091906128fb565b60405180910390f35b61028161092c565b005b61029d60048036038101906102989190611f48565b6109b4565b005b6102a7610a9f565b6040516102b49190612617565b60405180910390f35b6102d760048036038101906102d29190611f1b565b610ac9565b005b6102f360048036038101906102ee91906121ee565b610b9d565b005b6102fd610c3e565b60405161030a9190612699565b60405180910390f35b61032d60048036038101906103289190611eee565b610cd0565b60405161033a919061267e565b60405180910390f35b61035d6004803603810190610358919061209e565b610cf0565b005b6103796004803603810190610374919061201b565b610e71565b005b610395600480360381019061039091906121c1565b610ed3565b6040516103a29190612699565b60405180910390f35b6103b3610f4f565b6040516103c09190612699565b60405180910390f35b6103e360048036038101906103de9190612178565b610fdd565b005b6103ff60048036038101906103fa9190611f88565b61108a565b60405161040c919061267e565b60405180910390f35b61042f600480360381019061042a9190611eee565b61111e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104fc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061050c575061050b82611216565b5b9050919050565b60606000805461052290612ba2565b80601f016020809104026020016040519081016040528092919081815260200182805461054e90612ba2565b801561059b5780601f106105705761010080835404028352916020019161059b565b820191906000526020600020905b81548152906001019060200180831161057e57829003601f168201915b5050505050905090565b60006105b082611280565b6105ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e69061281b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610635826107c2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069d9061289b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106c56112ec565b73ffffffffffffffffffffffffffffffffffffffff1614806106f457506106f3816106ee6112ec565b61108a565b5b610733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072a9061279b565b60405180910390fd5b61073d83836112f4565b505050565b61075361074d6112ec565b826113ad565b610792576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610789906128bb565b60405180910390fd5b61079d83838361148b565b505050565b6107bd83838360405180602001604052806000815250610e71565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561086b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610862906127db565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156108e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108dc906127bb565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6109346112ec565b73ffffffffffffffffffffffffffffffffffffffff16610952610a9f565b73ffffffffffffffffffffffffffffffffffffffff16146109a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099f9061283b565b60405180910390fd5b6109b260006116e7565b565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3b906128db565b60405180910390fd5b80600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b50906128db565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60011515600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c279061277b565b60405180910390fd5b610c3a81836117ad565b5050565b606060018054610c4d90612ba2565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7990612ba2565b8015610cc65780601f10610c9b57610100808354040283529160200191610cc6565b820191906000526020600020905b815481529060010190602001808311610ca957829003601f168201915b5050505050905090565b60086020528060005260406000206000915054906101000a900460ff1681565b610cf86112ec565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5d9061273b565b60405180910390fd5b8060056000610d736112ec565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610e206112ec565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e65919061267e565b60405180910390a35050565b610e82610e7c6112ec565b836113ad565b610ec1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb8906128bb565b60405180910390fd5b610ecd8484848461197b565b50505050565b6060610ede82611280565b610f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f149061287b565b60405180910390fd5b6007610f28836119d7565b604051602001610f399291906125f3565b6040516020818303038152906040529050919050565b60078054610f5c90612ba2565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8890612ba2565b8015610fd55780601f10610faa57610100808354040283529160200191610fd5565b820191906000526020600020905b815481529060010190602001808311610fb857829003601f168201915b505050505081565b60011515600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611070576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110679061277b565b60405180910390fd5b8060079080519060200190611086929190611ced565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111266112ec565b73ffffffffffffffffffffffffffffffffffffffff16611144610a9f565b73ffffffffffffffffffffffffffffffffffffffff161461119a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111919061283b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561120a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611201906126db565b60405180910390fd5b611213816116e7565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611367836107c2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006113b882611280565b6113f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ee9061275b565b60405180910390fd5b6000611402836107c2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061147157508373ffffffffffffffffffffffffffffffffffffffff16611459846105a5565b73ffffffffffffffffffffffffffffffffffffffff16145b806114825750611481818561108a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166114ab826107c2565b73ffffffffffffffffffffffffffffffffffffffff1614611501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f89061285b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611571576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115689061271b565b60405180910390fd5b61157c838383611b3e565b6115876000826112f4565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115d79190612a7c565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461162e91906129f5565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561181d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611814906127fb565b60405180910390fd5b61182681611280565b15611866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185d906126fb565b60405180910390fd5b61187260008383611b3e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118c291906129f5565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61198684848461148b565b61199284848484611b43565b6119d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c8906126bb565b60405180910390fd5b50505050565b60606000821415611a1f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611b39565b600082905060005b60008214611a51578080611a3a90612c05565b915050600a82611a4a9190612a4b565b9150611a27565b60008167ffffffffffffffff811115611a6d57611a6c612d3b565b5b6040519080825280601f01601f191660200182016040528015611a9f5781602001600182028036833780820191505090505b50905060008290508593505b60008414611b3157600a84611ac09190612c4e565b6030611acc91906129f5565b60f81b8282611ada90612b78565b92508281518110611aee57611aed612d0c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84611b2a9190612a4b565b9350611aab565b819450505050505b919050565b505050565b6000611b648473ffffffffffffffffffffffffffffffffffffffff16611cda565b15611ccd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b8d6112ec565b8786866040518563ffffffff1660e01b8152600401611baf9493929190612632565b602060405180830381600087803b158015611bc957600080fd5b505af1925050508015611bfa57506040513d601f19601f82011682018060405250810190611bf7919061214b565b60015b611c7d573d8060008114611c2a576040519150601f19603f3d011682016040523d82523d6000602084013e611c2f565b606091505b50600081511415611c75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6c906126bb565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611cd2565b600190505b949350505050565b600080823b905060008111915050919050565b828054611cf990612ba2565b90600052602060002090601f016020900481019282611d1b5760008555611d62565b82601f10611d3457805160ff1916838001178555611d62565b82800160010185558215611d62579182015b82811115611d61578251825591602001919060010190611d46565b5b509050611d6f9190611d73565b5090565b5b80821115611d8c576000816000905550600101611d74565b5090565b6000611da3611d9e8461293b565b612916565b905082815260208101848484011115611dbf57611dbe612d6f565b5b611dca848285612b36565b509392505050565b6000611de5611de08461296c565b612916565b905082815260208101848484011115611e0157611e00612d6f565b5b611e0c848285612b36565b509392505050565b600081359050611e2381613239565b92915050565b600081359050611e3881613250565b92915050565b600081359050611e4d81613267565b92915050565b600081359050611e628161327e565b92915050565b600081519050611e778161327e565b92915050565b600082601f830112611e9257611e91612d6a565b5b8135611ea2848260208601611d90565b91505092915050565b600082601f830112611ec057611ebf612d6a565b5b8135611ed0848260208601611dd2565b91505092915050565b600081359050611ee881613295565b92915050565b600060208284031215611f0457611f03612d79565b5b6000611f1284828501611e14565b91505092915050565b600060208284031215611f3157611f30612d79565b5b6000611f3f84828501611e29565b91505092915050565b60008060408385031215611f5f57611f5e612d79565b5b6000611f6d85828601611e29565b9250506020611f7e85828601611e3e565b9150509250929050565b60008060408385031215611f9f57611f9e612d79565b5b6000611fad85828601611e14565b9250506020611fbe85828601611e14565b9150509250929050565b600080600060608486031215611fe157611fe0612d79565b5b6000611fef86828701611e14565b935050602061200086828701611e14565b925050604061201186828701611ed9565b9150509250925092565b6000806000806080858703121561203557612034612d79565b5b600061204387828801611e14565b945050602061205487828801611e14565b935050604061206587828801611ed9565b925050606085013567ffffffffffffffff81111561208657612085612d74565b5b61209287828801611e7d565b91505092959194509250565b600080604083850312156120b5576120b4612d79565b5b60006120c385828601611e14565b92505060206120d485828601611e3e565b9150509250929050565b600080604083850312156120f5576120f4612d79565b5b600061210385828601611e14565b925050602061211485828601611ed9565b9150509250929050565b60006020828403121561213457612133612d79565b5b600061214284828501611e53565b91505092915050565b60006020828403121561216157612160612d79565b5b600061216f84828501611e68565b91505092915050565b60006020828403121561218e5761218d612d79565b5b600082013567ffffffffffffffff8111156121ac576121ab612d74565b5b6121b884828501611eab565b91505092915050565b6000602082840312156121d7576121d6612d79565b5b60006121e584828501611ed9565b91505092915050565b6000806040838503121561220557612204612d79565b5b600061221385828601611ed9565b925050602061222485828601611e14565b9150509250929050565b61223781612ab0565b82525050565b61224681612ad4565b82525050565b6000612257826129b2565b61226181856129c8565b9350612271818560208601612b45565b61227a81612d7e565b840191505092915050565b6000612290826129bd565b61229a81856129d9565b93506122aa818560208601612b45565b6122b381612d7e565b840191505092915050565b60006122c9826129bd565b6122d381856129ea565b93506122e3818560208601612b45565b80840191505092915050565b600081546122fc81612ba2565b61230681866129ea565b94506001821660008114612321576001811461233257612365565b60ff19831686528186019350612365565b61233b8561299d565b60005b8381101561235d5781548189015260018201915060208101905061233e565b838801955050505b50505092915050565b600061237b6032836129d9565b915061238682612d8f565b604082019050919050565b600061239e6026836129d9565b91506123a982612dde565b604082019050919050565b60006123c1601c836129d9565b91506123cc82612e2d565b602082019050919050565b60006123e46024836129d9565b91506123ef82612e56565b604082019050919050565b60006124076019836129d9565b915061241282612ea5565b602082019050919050565b600061242a602c836129d9565b915061243582612ece565b604082019050919050565b600061244d6017836129d9565b915061245882612f1d565b602082019050919050565b60006124706038836129d9565b915061247b82612f46565b604082019050919050565b6000612493602a836129d9565b915061249e82612f95565b604082019050919050565b60006124b66029836129d9565b91506124c182612fe4565b604082019050919050565b60006124d96020836129d9565b91506124e482613033565b602082019050919050565b60006124fc602c836129d9565b91506125078261305c565b604082019050919050565b600061251f6020836129d9565b915061252a826130ab565b602082019050919050565b60006125426029836129d9565b915061254d826130d4565b604082019050919050565b6000612565602f836129d9565b915061257082613123565b604082019050919050565b60006125886021836129d9565b915061259382613172565b604082019050919050565b60006125ab6031836129d9565b91506125b6826131c1565b604082019050919050565b60006125ce6012836129d9565b91506125d982613210565b602082019050919050565b6125ed81612b2c565b82525050565b60006125ff82856122ef565b915061260b82846122be565b91508190509392505050565b600060208201905061262c600083018461222e565b92915050565b6000608082019050612647600083018761222e565b612654602083018661222e565b61266160408301856125e4565b8181036060830152612673818461224c565b905095945050505050565b6000602082019050612693600083018461223d565b92915050565b600060208201905081810360008301526126b38184612285565b905092915050565b600060208201905081810360008301526126d48161236e565b9050919050565b600060208201905081810360008301526126f481612391565b9050919050565b60006020820190508181036000830152612714816123b4565b9050919050565b60006020820190508181036000830152612734816123d7565b9050919050565b60006020820190508181036000830152612754816123fa565b9050919050565b600060208201905081810360008301526127748161241d565b9050919050565b6000602082019050818103600083015261279481612440565b9050919050565b600060208201905081810360008301526127b481612463565b9050919050565b600060208201905081810360008301526127d481612486565b9050919050565b600060208201905081810360008301526127f4816124a9565b9050919050565b60006020820190508181036000830152612814816124cc565b9050919050565b60006020820190508181036000830152612834816124ef565b9050919050565b6000602082019050818103600083015261285481612512565b9050919050565b6000602082019050818103600083015261287481612535565b9050919050565b6000602082019050818103600083015261289481612558565b9050919050565b600060208201905081810360008301526128b48161257b565b9050919050565b600060208201905081810360008301526128d48161259e565b9050919050565b600060208201905081810360008301526128f4816125c1565b9050919050565b600060208201905061291060008301846125e4565b92915050565b6000612920612931565b905061292c8282612bd4565b919050565b6000604051905090565b600067ffffffffffffffff82111561295657612955612d3b565b5b61295f82612d7e565b9050602081019050919050565b600067ffffffffffffffff82111561298757612986612d3b565b5b61299082612d7e565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612a0082612b2c565b9150612a0b83612b2c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612a4057612a3f612c7f565b5b828201905092915050565b6000612a5682612b2c565b9150612a6183612b2c565b925082612a7157612a70612cae565b5b828204905092915050565b6000612a8782612b2c565b9150612a9283612b2c565b925082821015612aa557612aa4612c7f565b5b828203905092915050565b6000612abb82612b0c565b9050919050565b6000612acd82612b0c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612b63578082015181840152602081019050612b48565b83811115612b72576000848401525b50505050565b6000612b8382612b2c565b91506000821415612b9757612b96612c7f565b5b600182039050919050565b60006002820490506001821680612bba57607f821691505b60208210811415612bce57612bcd612cdd565b5b50919050565b612bdd82612d7e565b810181811067ffffffffffffffff82111715612bfc57612bfb612d3b565b5b80604052505050565b6000612c1082612b2c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612c4357612c42612c7f565b5b600182019050919050565b6000612c5982612b2c565b9150612c6483612b2c565b925082612c7457612c73612cae565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f55736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f55736572206973206e6f74206d696e7465720000000000000000000000000000600082015250565b61324281612ab0565b811461324d57600080fd5b50565b61325981612ac2565b811461326457600080fd5b50565b61327081612ad4565b811461327b57600080fd5b50565b61328781612ae0565b811461329257600080fd5b50565b61329e81612b2c565b81146132a957600080fd5b5056fea264697066735822122071808787bf3525846b456dc6c5397f44d8dae33d66f59f7e983fec8cbccbe5d764736f6c63430008070033

Deployed Bytecode Sourcemap

33316:3600:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21122:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22067:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23626:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23149:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24516:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24926:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21761:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21491:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36103:103;;;:::i;:::-;;33992:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35452:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34175:140;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34503:163;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22236:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33405:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23919:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25182:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33667:306;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33372:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34321:176;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24285:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36361:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21122:305;21224:4;21276:25;21261:40;;;:11;:40;;;;:105;;;;21333:33;21318:48;;;:11;:48;;;;21261:105;:158;;;;21383:36;21407:11;21383:23;:36::i;:::-;21261:158;21241:178;;21122:305;;;:::o;22067:100::-;22121:13;22154:5;22147:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22067:100;:::o;23626:221::-;23702:7;23730:16;23738:7;23730;:16::i;:::-;23722:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23815:15;:24;23831:7;23815:24;;;;;;;;;;;;;;;;;;;;;23808:31;;23626:221;;;:::o;23149:411::-;23230:13;23246:23;23261:7;23246:14;:23::i;:::-;23230:39;;23294:5;23288:11;;:2;:11;;;;23280:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23388:5;23372:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23397:37;23414:5;23421:12;:10;:12::i;:::-;23397:16;:37::i;:::-;23372:62;23350:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23531:21;23540:2;23544:7;23531:8;:21::i;:::-;23219:341;23149:411;;:::o;24516:339::-;24711:41;24730:12;:10;:12::i;:::-;24744:7;24711:18;:41::i;:::-;24703:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24819:28;24829:4;24835:2;24839:7;24819:9;:28::i;:::-;24516:339;;;:::o;24926:185::-;25064:39;25081:4;25087:2;25091:7;25064:39;;;;;;;;;;;;:16;:39::i;:::-;24926:185;;;:::o;21761:239::-;21833:7;21853:13;21869:7;:16;21877:7;21869:16;;;;;;;;;;;;;;;;;;;;;21853:32;;21921:1;21904:19;;:5;:19;;;;21896:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21987:5;21980:12;;;21761:239;;;:::o;21491:208::-;21563:7;21608:1;21591:19;;:5;:19;;;;21583:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21675:9;:16;21685:5;21675:16;;;;;;;;;;;;;;;;21668:23;;21491:208;;;:::o;36103:103::-;35683:12;:10;:12::i;:::-;35672:23;;:7;:5;:7::i;:::-;:23;;;35664:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36168:30:::1;36195:1;36168:18;:30::i;:::-;36103:103::o:0;33992:177::-;34094:6;;;;;;;;;;;34082:18;;:10;:18;;;34074:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;34150:11;34134:9;:15;34144:4;34134:15;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;33992:177;;:::o;35452:87::-;35498:7;35525:6;;;;;;;;;;;35518:13;;35452:87;:::o;34175:140::-;34256:6;;;;;;;;;;;34244:18;;:10;:18;;;34236:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;34303:4;34296:6;;:11;;;;;;;;;;;;;;;;;;34175:140;:::o;34503:163::-;34595:4;34572:27;;:9;:21;34582:10;34572:21;;;;;;;;;;;;;;;;;;;;;;;;;:27;;;34564:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;34638:20;34644:4;34650:7;34638:5;:20::i;:::-;34503:163;;:::o;22236:104::-;22292:13;22325:7;22318:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22236:104;:::o;33405:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;23919:295::-;24034:12;:10;:12::i;:::-;24022:24;;:8;:24;;;;24014:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;24134:8;24089:18;:32;24108:12;:10;:12::i;:::-;24089:32;;;;;;;;;;;;;;;:42;24122:8;24089:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;24187:8;24158:48;;24173:12;:10;:12::i;:::-;24158:48;;;24197:8;24158:48;;;;;;:::i;:::-;;;;;;;;23919:295;;:::o;25182:328::-;25357:41;25376:12;:10;:12::i;:::-;25390:7;25357:18;:41::i;:::-;25349:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25463:39;25477:4;25483:2;25487:7;25496:5;25463:13;:39::i;:::-;25182:328;;;;:::o;33667:306::-;33740:13;33774:16;33782:7;33774;:16::i;:::-;33766:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;33886:12;33900:17;33909:7;33900:8;:17::i;:::-;33869:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33855:64;;33667:306;;;:::o;33372:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34321:176::-;34424:4;34401:27;;:9;:21;34411:10;34401:21;;;;;;;;;;;;;;;;;;;;;;;;;:27;;;34393:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;34480:9;34467:12;:22;;;;;;;;;;;;:::i;:::-;;34321:176;:::o;24285:164::-;24382:4;24406:18;:25;24425:5;24406:25;;;;;;;;;;;;;;;:35;24432:8;24406:35;;;;;;;;;;;;;;;;;;;;;;;;;24399:42;;24285:164;;;;:::o;36361:201::-;35683:12;:10;:12::i;:::-;35672:23;;:7;:5;:7::i;:::-;:23;;;35664:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36470:1:::1;36450:22;;:8;:22;;;;36442:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36526:28;36545:8;36526:18;:28::i;:::-;36361:201:::0;:::o;13933:157::-;14018:4;14057:25;14042:40;;;:11;:40;;;;14035:47;;13933:157;;;:::o;27020:127::-;27085:4;27137:1;27109:30;;:7;:16;27117:7;27109:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27102:37;;27020:127;;;:::o;2801:98::-;2854:7;2881:10;2874:17;;2801:98;:::o;31002:174::-;31104:2;31077:15;:24;31093:7;31077:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31160:7;31156:2;31122:46;;31131:23;31146:7;31131:14;:23::i;:::-;31122:46;;;;;;;;;;;;31002:174;;:::o;27314:348::-;27407:4;27432:16;27440:7;27432;:16::i;:::-;27424:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27508:13;27524:23;27539:7;27524:14;:23::i;:::-;27508:39;;27577:5;27566:16;;:7;:16;;;:51;;;;27610:7;27586:31;;:20;27598:7;27586:11;:20::i;:::-;:31;;;27566:51;:87;;;;27621:32;27638:5;27645:7;27621:16;:32::i;:::-;27566:87;27558:96;;;27314:348;;;;:::o;30306:578::-;30465:4;30438:31;;:23;30453:7;30438:14;:23::i;:::-;:31;;;30430:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30548:1;30534:16;;:2;:16;;;;30526:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30604:39;30625:4;30631:2;30635:7;30604:20;:39::i;:::-;30708:29;30725:1;30729:7;30708:8;:29::i;:::-;30769:1;30750:9;:15;30760:4;30750:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30798:1;30781:9;:13;30791:2;30781:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30829:2;30810:7;:16;30818:7;30810:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30868:7;30864:2;30849:27;;30858:4;30849:27;;;;;;;;;;;;30306:578;;;:::o;36722:191::-;36796:16;36815:6;;;;;;;;;;;36796:25;;36841:8;36832:6;;:17;;;;;;;;;;;;;;;;;;36896:8;36865:40;;36886:8;36865:40;;;;;;;;;;;;36785:128;36722:191;:::o;28998:382::-;29092:1;29078:16;;:2;:16;;;;29070:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29151:16;29159:7;29151;:16::i;:::-;29150:17;29142:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29213:45;29242:1;29246:2;29250:7;29213:20;:45::i;:::-;29288:1;29271:9;:13;29281:2;29271:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29319:2;29300:7;:16;29308:7;29300:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29364:7;29360:2;29339:33;;29356:1;29339:33;;;;;;;;;;;;28998:382;;:::o;26392:315::-;26549:28;26559:4;26565:2;26569:7;26549:9;:28::i;:::-;26596:48;26619:4;26625:2;26629:7;26638:5;26596:22;:48::i;:::-;26588:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26392:315;;;;:::o;34692:554::-;34780:17;34825:1;34819:2;:7;34815:55;;;34848:10;;;;;;;;;;;;;;;;;;;;;34815:55;34880:9;34892:2;34880:14;;34905;34930:73;34942:1;34937;:6;34930:73;;34965:8;;;;;:::i;:::-;;;;34989:2;34984:7;;;;;:::i;:::-;;;34930:73;;;35013:17;35043:6;35033:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35013:37;;35061:9;35073:6;35061:18;;35094:2;35090:6;;35107:103;35119:1;35114;:6;35107:103;;35176:2;35172:1;:6;;;;:::i;:::-;35167:2;:11;;;;:::i;:::-;35154:26;;35142:4;35147:3;;;;:::i;:::-;;;;35142:9;;;;;;;;:::i;:::-;;;;;:38;;;;;;;;;;;35196:2;35191:7;;;;;:::i;:::-;;;35107:103;;;35233:4;35220:18;;34804:442;;;;34692:554;;;;:::o;33112:126::-;;;;:::o;31741:799::-;31896:4;31917:15;:2;:13;;;:15::i;:::-;31913:620;;;31969:2;31953:36;;;31990:12;:10;:12::i;:::-;32004:4;32010:7;32019:5;31953:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31949:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32212:1;32195:6;:13;:18;32191:272;;;32238:60;;;;;;;;;;:::i;:::-;;;;;;;;32191:272;32413:6;32407:13;32398:6;32394:2;32390:15;32383:38;31949:529;32086:41;;;32076:51;;;:6;:51;;;;32069:58;;;;;31913:620;32517:4;32510:11;;31741:799;;;;;;;:::o;3834:387::-;3894:4;4102:12;4169:7;4157:20;4149:28;;4212:1;4205:4;:8;4198:15;;;3834:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:155::-;1040:5;1078:6;1065:20;1056:29;;1094:41;1129:5;1094:41;:::i;:::-;986:155;;;;:::o;1147:133::-;1190:5;1228:6;1215:20;1206:29;;1244:30;1268:5;1244:30;:::i;:::-;1147:133;;;;:::o;1286:137::-;1331:5;1369:6;1356:20;1347:29;;1385:32;1411:5;1385:32;:::i;:::-;1286:137;;;;:::o;1429:141::-;1485:5;1516:6;1510:13;1501:22;;1532:32;1558:5;1532:32;:::i;:::-;1429:141;;;;:::o;1589:338::-;1644:5;1693:3;1686:4;1678:6;1674:17;1670:27;1660:122;;1701:79;;:::i;:::-;1660:122;1818:6;1805:20;1843:78;1917:3;1909:6;1902:4;1894:6;1890:17;1843:78;:::i;:::-;1834:87;;1650:277;1589:338;;;;:::o;1947:340::-;2003:5;2052:3;2045:4;2037:6;2033:17;2029:27;2019:122;;2060:79;;:::i;:::-;2019:122;2177:6;2164:20;2202:79;2277:3;2269:6;2262:4;2254:6;2250:17;2202:79;:::i;:::-;2193:88;;2009:278;1947:340;;;;:::o;2293:139::-;2339:5;2377:6;2364:20;2355:29;;2393:33;2420:5;2393:33;:::i;:::-;2293:139;;;;:::o;2438:329::-;2497:6;2546:2;2534:9;2525:7;2521:23;2517:32;2514:119;;;2552:79;;:::i;:::-;2514:119;2672:1;2697:53;2742:7;2733:6;2722:9;2718:22;2697:53;:::i;:::-;2687:63;;2643:117;2438:329;;;;:::o;2773:345::-;2840:6;2889:2;2877:9;2868:7;2864:23;2860:32;2857:119;;;2895:79;;:::i;:::-;2857:119;3015:1;3040:61;3093:7;3084:6;3073:9;3069:22;3040:61;:::i;:::-;3030:71;;2986:125;2773:345;;;;:::o;3124:484::-;3197:6;3205;3254:2;3242:9;3233:7;3229:23;3225:32;3222:119;;;3260:79;;:::i;:::-;3222:119;3380:1;3405:61;3458:7;3449:6;3438:9;3434:22;3405:61;:::i;:::-;3395:71;;3351:125;3515:2;3541:50;3583:7;3574:6;3563:9;3559:22;3541:50;:::i;:::-;3531:60;;3486:115;3124:484;;;;;:::o;3614:474::-;3682:6;3690;3739:2;3727:9;3718:7;3714:23;3710:32;3707:119;;;3745:79;;:::i;:::-;3707:119;3865:1;3890:53;3935:7;3926:6;3915:9;3911:22;3890:53;:::i;:::-;3880:63;;3836:117;3992:2;4018:53;4063:7;4054:6;4043:9;4039:22;4018:53;:::i;:::-;4008:63;;3963:118;3614:474;;;;;:::o;4094:619::-;4171:6;4179;4187;4236:2;4224:9;4215:7;4211:23;4207:32;4204:119;;;4242:79;;:::i;:::-;4204:119;4362:1;4387:53;4432:7;4423:6;4412:9;4408:22;4387:53;:::i;:::-;4377:63;;4333:117;4489:2;4515:53;4560:7;4551:6;4540:9;4536:22;4515:53;:::i;:::-;4505:63;;4460:118;4617:2;4643:53;4688:7;4679:6;4668:9;4664:22;4643:53;:::i;:::-;4633:63;;4588:118;4094:619;;;;;:::o;4719:943::-;4814:6;4822;4830;4838;4887:3;4875:9;4866:7;4862:23;4858:33;4855:120;;;4894:79;;:::i;:::-;4855:120;5014:1;5039:53;5084:7;5075:6;5064:9;5060:22;5039:53;:::i;:::-;5029:63;;4985:117;5141:2;5167:53;5212:7;5203:6;5192:9;5188:22;5167:53;:::i;:::-;5157:63;;5112:118;5269:2;5295:53;5340:7;5331:6;5320:9;5316:22;5295:53;:::i;:::-;5285:63;;5240:118;5425:2;5414:9;5410:18;5397:32;5456:18;5448:6;5445:30;5442:117;;;5478:79;;:::i;:::-;5442:117;5583:62;5637:7;5628:6;5617:9;5613:22;5583:62;:::i;:::-;5573:72;;5368:287;4719:943;;;;;;;:::o;5668:468::-;5733:6;5741;5790:2;5778:9;5769:7;5765:23;5761:32;5758:119;;;5796:79;;:::i;:::-;5758:119;5916:1;5941:53;5986:7;5977:6;5966:9;5962:22;5941:53;:::i;:::-;5931:63;;5887:117;6043:2;6069:50;6111:7;6102:6;6091:9;6087:22;6069:50;:::i;:::-;6059:60;;6014:115;5668:468;;;;;:::o;6142:474::-;6210:6;6218;6267:2;6255:9;6246:7;6242:23;6238:32;6235:119;;;6273:79;;:::i;:::-;6235:119;6393:1;6418:53;6463:7;6454:6;6443:9;6439:22;6418:53;:::i;:::-;6408:63;;6364:117;6520:2;6546:53;6591:7;6582:6;6571:9;6567:22;6546:53;:::i;:::-;6536:63;;6491:118;6142:474;;;;;:::o;6622:327::-;6680:6;6729:2;6717:9;6708:7;6704:23;6700:32;6697:119;;;6735:79;;:::i;:::-;6697:119;6855:1;6880:52;6924:7;6915:6;6904:9;6900:22;6880:52;:::i;:::-;6870:62;;6826:116;6622:327;;;;:::o;6955:349::-;7024:6;7073:2;7061:9;7052:7;7048:23;7044:32;7041:119;;;7079:79;;:::i;:::-;7041:119;7199:1;7224:63;7279:7;7270:6;7259:9;7255:22;7224:63;:::i;:::-;7214:73;;7170:127;6955:349;;;;:::o;7310:509::-;7379:6;7428:2;7416:9;7407:7;7403:23;7399:32;7396:119;;;7434:79;;:::i;:::-;7396:119;7582:1;7571:9;7567:17;7554:31;7612:18;7604:6;7601:30;7598:117;;;7634:79;;:::i;:::-;7598:117;7739:63;7794:7;7785:6;7774:9;7770:22;7739:63;:::i;:::-;7729:73;;7525:287;7310:509;;;;:::o;7825:329::-;7884:6;7933:2;7921:9;7912:7;7908:23;7904:32;7901:119;;;7939:79;;:::i;:::-;7901:119;8059:1;8084:53;8129:7;8120:6;8109:9;8105:22;8084:53;:::i;:::-;8074:63;;8030:117;7825:329;;;;:::o;8160:474::-;8228:6;8236;8285:2;8273:9;8264:7;8260:23;8256:32;8253:119;;;8291:79;;:::i;:::-;8253:119;8411:1;8436:53;8481:7;8472:6;8461:9;8457:22;8436:53;:::i;:::-;8426:63;;8382:117;8538:2;8564:53;8609:7;8600:6;8589:9;8585:22;8564:53;:::i;:::-;8554:63;;8509:118;8160:474;;;;;:::o;8640:118::-;8727:24;8745:5;8727:24;:::i;:::-;8722:3;8715:37;8640:118;;:::o;8764:109::-;8845:21;8860:5;8845:21;:::i;:::-;8840:3;8833:34;8764:109;;:::o;8879:360::-;8965:3;8993:38;9025:5;8993:38;:::i;:::-;9047:70;9110:6;9105:3;9047:70;:::i;:::-;9040:77;;9126:52;9171:6;9166:3;9159:4;9152:5;9148:16;9126:52;:::i;:::-;9203:29;9225:6;9203:29;:::i;:::-;9198:3;9194:39;9187:46;;8969:270;8879:360;;;;:::o;9245:364::-;9333:3;9361:39;9394:5;9361:39;:::i;:::-;9416:71;9480:6;9475:3;9416:71;:::i;:::-;9409:78;;9496:52;9541:6;9536:3;9529:4;9522:5;9518:16;9496:52;:::i;:::-;9573:29;9595:6;9573:29;:::i;:::-;9568:3;9564:39;9557:46;;9337:272;9245:364;;;;:::o;9615:377::-;9721:3;9749:39;9782:5;9749:39;:::i;:::-;9804:89;9886:6;9881:3;9804:89;:::i;:::-;9797:96;;9902:52;9947:6;9942:3;9935:4;9928:5;9924:16;9902:52;:::i;:::-;9979:6;9974:3;9970:16;9963:23;;9725:267;9615:377;;;;:::o;10022:845::-;10125:3;10162:5;10156:12;10191:36;10217:9;10191:36;:::i;:::-;10243:89;10325:6;10320:3;10243:89;:::i;:::-;10236:96;;10363:1;10352:9;10348:17;10379:1;10374:137;;;;10525:1;10520:341;;;;10341:520;;10374:137;10458:4;10454:9;10443;10439:25;10434:3;10427:38;10494:6;10489:3;10485:16;10478:23;;10374:137;;10520:341;10587:38;10619:5;10587:38;:::i;:::-;10647:1;10661:154;10675:6;10672:1;10669:13;10661:154;;;10749:7;10743:14;10739:1;10734:3;10730:11;10723:35;10799:1;10790:7;10786:15;10775:26;;10697:4;10694:1;10690:12;10685:17;;10661:154;;;10844:6;10839:3;10835:16;10828:23;;10527:334;;10341:520;;10129:738;;10022:845;;;;:::o;10873:366::-;11015:3;11036:67;11100:2;11095:3;11036:67;:::i;:::-;11029:74;;11112:93;11201:3;11112:93;:::i;:::-;11230:2;11225:3;11221:12;11214:19;;10873:366;;;:::o;11245:::-;11387:3;11408:67;11472:2;11467:3;11408:67;:::i;:::-;11401:74;;11484:93;11573:3;11484:93;:::i;:::-;11602:2;11597:3;11593:12;11586:19;;11245:366;;;:::o;11617:::-;11759:3;11780:67;11844:2;11839:3;11780:67;:::i;:::-;11773:74;;11856:93;11945:3;11856:93;:::i;:::-;11974:2;11969:3;11965:12;11958:19;;11617:366;;;:::o;11989:::-;12131:3;12152:67;12216:2;12211:3;12152:67;:::i;:::-;12145:74;;12228:93;12317:3;12228:93;:::i;:::-;12346:2;12341:3;12337:12;12330:19;;11989:366;;;:::o;12361:::-;12503:3;12524:67;12588:2;12583:3;12524:67;:::i;:::-;12517:74;;12600:93;12689:3;12600:93;:::i;:::-;12718:2;12713:3;12709:12;12702:19;;12361:366;;;:::o;12733:::-;12875:3;12896:67;12960:2;12955:3;12896:67;:::i;:::-;12889:74;;12972:93;13061:3;12972:93;:::i;:::-;13090:2;13085:3;13081:12;13074:19;;12733:366;;;:::o;13105:::-;13247:3;13268:67;13332:2;13327:3;13268:67;:::i;:::-;13261:74;;13344:93;13433:3;13344:93;:::i;:::-;13462:2;13457:3;13453:12;13446:19;;13105:366;;;:::o;13477:::-;13619:3;13640:67;13704:2;13699:3;13640:67;:::i;:::-;13633:74;;13716:93;13805:3;13716:93;:::i;:::-;13834:2;13829:3;13825:12;13818:19;;13477:366;;;:::o;13849:::-;13991:3;14012:67;14076:2;14071:3;14012:67;:::i;:::-;14005:74;;14088:93;14177:3;14088:93;:::i;:::-;14206:2;14201:3;14197:12;14190:19;;13849:366;;;:::o;14221:::-;14363:3;14384:67;14448:2;14443:3;14384:67;:::i;:::-;14377:74;;14460:93;14549:3;14460:93;:::i;:::-;14578:2;14573:3;14569:12;14562:19;;14221:366;;;:::o;14593:::-;14735:3;14756:67;14820:2;14815:3;14756:67;:::i;:::-;14749:74;;14832:93;14921:3;14832:93;:::i;:::-;14950:2;14945:3;14941:12;14934:19;;14593:366;;;:::o;14965:::-;15107:3;15128:67;15192:2;15187:3;15128:67;:::i;:::-;15121:74;;15204:93;15293:3;15204:93;:::i;:::-;15322:2;15317:3;15313:12;15306:19;;14965:366;;;:::o;15337:::-;15479:3;15500:67;15564:2;15559:3;15500:67;:::i;:::-;15493:74;;15576:93;15665:3;15576:93;:::i;:::-;15694:2;15689:3;15685:12;15678:19;;15337:366;;;:::o;15709:::-;15851:3;15872:67;15936:2;15931:3;15872:67;:::i;:::-;15865:74;;15948:93;16037:3;15948:93;:::i;:::-;16066:2;16061:3;16057:12;16050:19;;15709:366;;;:::o;16081:::-;16223:3;16244:67;16308:2;16303:3;16244:67;:::i;:::-;16237:74;;16320:93;16409:3;16320:93;:::i;:::-;16438:2;16433:3;16429:12;16422:19;;16081:366;;;:::o;16453:::-;16595:3;16616:67;16680:2;16675:3;16616:67;:::i;:::-;16609:74;;16692:93;16781:3;16692:93;:::i;:::-;16810:2;16805:3;16801:12;16794:19;;16453:366;;;:::o;16825:::-;16967:3;16988:67;17052:2;17047:3;16988:67;:::i;:::-;16981:74;;17064:93;17153:3;17064:93;:::i;:::-;17182:2;17177:3;17173:12;17166:19;;16825:366;;;:::o;17197:::-;17339:3;17360:67;17424:2;17419:3;17360:67;:::i;:::-;17353:74;;17436:93;17525:3;17436:93;:::i;:::-;17554:2;17549:3;17545:12;17538:19;;17197:366;;;:::o;17569:118::-;17656:24;17674:5;17656:24;:::i;:::-;17651:3;17644:37;17569:118;;:::o;17693:429::-;17870:3;17892:92;17980:3;17971:6;17892:92;:::i;:::-;17885:99;;18001:95;18092:3;18083:6;18001:95;:::i;:::-;17994:102;;18113:3;18106:10;;17693:429;;;;;:::o;18128:222::-;18221:4;18259:2;18248:9;18244:18;18236:26;;18272:71;18340:1;18329:9;18325:17;18316:6;18272:71;:::i;:::-;18128:222;;;;:::o;18356:640::-;18551:4;18589:3;18578:9;18574:19;18566:27;;18603:71;18671:1;18660:9;18656:17;18647:6;18603:71;:::i;:::-;18684:72;18752:2;18741:9;18737:18;18728:6;18684:72;:::i;:::-;18766;18834:2;18823:9;18819:18;18810:6;18766:72;:::i;:::-;18885:9;18879:4;18875:20;18870:2;18859:9;18855:18;18848:48;18913:76;18984:4;18975:6;18913:76;:::i;:::-;18905:84;;18356:640;;;;;;;:::o;19002:210::-;19089:4;19127:2;19116:9;19112:18;19104:26;;19140:65;19202:1;19191:9;19187:17;19178:6;19140:65;:::i;:::-;19002:210;;;;:::o;19218:313::-;19331:4;19369:2;19358:9;19354:18;19346:26;;19418:9;19412:4;19408:20;19404:1;19393:9;19389:17;19382:47;19446:78;19519:4;19510:6;19446:78;:::i;:::-;19438:86;;19218:313;;;;:::o;19537:419::-;19703:4;19741:2;19730:9;19726:18;19718:26;;19790:9;19784:4;19780:20;19776:1;19765:9;19761:17;19754:47;19818:131;19944:4;19818:131;:::i;:::-;19810:139;;19537:419;;;:::o;19962:::-;20128:4;20166:2;20155:9;20151:18;20143:26;;20215:9;20209:4;20205:20;20201:1;20190:9;20186:17;20179:47;20243:131;20369:4;20243:131;:::i;:::-;20235:139;;19962:419;;;:::o;20387:::-;20553:4;20591:2;20580:9;20576:18;20568:26;;20640:9;20634:4;20630:20;20626:1;20615:9;20611:17;20604:47;20668:131;20794:4;20668:131;:::i;:::-;20660:139;;20387:419;;;:::o;20812:::-;20978:4;21016:2;21005:9;21001:18;20993:26;;21065:9;21059:4;21055:20;21051:1;21040:9;21036:17;21029:47;21093:131;21219:4;21093:131;:::i;:::-;21085:139;;20812:419;;;:::o;21237:::-;21403:4;21441:2;21430:9;21426:18;21418:26;;21490:9;21484:4;21480:20;21476:1;21465:9;21461:17;21454:47;21518:131;21644:4;21518:131;:::i;:::-;21510:139;;21237:419;;;:::o;21662:::-;21828:4;21866:2;21855:9;21851:18;21843:26;;21915:9;21909:4;21905:20;21901:1;21890:9;21886:17;21879:47;21943:131;22069:4;21943:131;:::i;:::-;21935:139;;21662:419;;;:::o;22087:::-;22253:4;22291:2;22280:9;22276:18;22268:26;;22340:9;22334:4;22330:20;22326:1;22315:9;22311:17;22304:47;22368:131;22494:4;22368:131;:::i;:::-;22360:139;;22087:419;;;:::o;22512:::-;22678:4;22716:2;22705:9;22701:18;22693:26;;22765:9;22759:4;22755:20;22751:1;22740:9;22736:17;22729:47;22793:131;22919:4;22793:131;:::i;:::-;22785:139;;22512:419;;;:::o;22937:::-;23103:4;23141:2;23130:9;23126:18;23118:26;;23190:9;23184:4;23180:20;23176:1;23165:9;23161:17;23154:47;23218:131;23344:4;23218:131;:::i;:::-;23210:139;;22937:419;;;:::o;23362:::-;23528:4;23566:2;23555:9;23551:18;23543:26;;23615:9;23609:4;23605:20;23601:1;23590:9;23586:17;23579:47;23643:131;23769:4;23643:131;:::i;:::-;23635:139;;23362:419;;;:::o;23787:::-;23953:4;23991:2;23980:9;23976:18;23968:26;;24040:9;24034:4;24030:20;24026:1;24015:9;24011:17;24004:47;24068:131;24194:4;24068:131;:::i;:::-;24060:139;;23787:419;;;:::o;24212:::-;24378:4;24416:2;24405:9;24401:18;24393:26;;24465:9;24459:4;24455:20;24451:1;24440:9;24436:17;24429:47;24493:131;24619:4;24493:131;:::i;:::-;24485:139;;24212:419;;;:::o;24637:::-;24803:4;24841:2;24830:9;24826:18;24818:26;;24890:9;24884:4;24880:20;24876:1;24865:9;24861:17;24854:47;24918:131;25044:4;24918:131;:::i;:::-;24910:139;;24637:419;;;:::o;25062:::-;25228:4;25266:2;25255:9;25251:18;25243:26;;25315:9;25309:4;25305:20;25301:1;25290:9;25286:17;25279:47;25343:131;25469:4;25343:131;:::i;:::-;25335:139;;25062:419;;;:::o;25487:::-;25653:4;25691:2;25680:9;25676:18;25668:26;;25740:9;25734:4;25730:20;25726:1;25715:9;25711:17;25704:47;25768:131;25894:4;25768:131;:::i;:::-;25760:139;;25487:419;;;:::o;25912:::-;26078:4;26116:2;26105:9;26101:18;26093:26;;26165:9;26159:4;26155:20;26151:1;26140:9;26136:17;26129:47;26193:131;26319:4;26193:131;:::i;:::-;26185:139;;25912:419;;;:::o;26337:::-;26503:4;26541:2;26530:9;26526:18;26518:26;;26590:9;26584:4;26580:20;26576:1;26565:9;26561:17;26554:47;26618:131;26744:4;26618:131;:::i;:::-;26610:139;;26337:419;;;:::o;26762:::-;26928:4;26966:2;26955:9;26951:18;26943:26;;27015:9;27009:4;27005:20;27001:1;26990:9;26986:17;26979:47;27043:131;27169:4;27043:131;:::i;:::-;27035:139;;26762:419;;;:::o;27187:222::-;27280:4;27318:2;27307:9;27303:18;27295:26;;27331:71;27399:1;27388:9;27384:17;27375:6;27331:71;:::i;:::-;27187:222;;;;:::o;27415:129::-;27449:6;27476:20;;:::i;:::-;27466:30;;27505:33;27533:4;27525:6;27505:33;:::i;:::-;27415:129;;;:::o;27550:75::-;27583:6;27616:2;27610:9;27600:19;;27550:75;:::o;27631:307::-;27692:4;27782:18;27774:6;27771:30;27768:56;;;27804:18;;:::i;:::-;27768:56;27842:29;27864:6;27842:29;:::i;:::-;27834:37;;27926:4;27920;27916:15;27908:23;;27631:307;;;:::o;27944:308::-;28006:4;28096:18;28088:6;28085:30;28082:56;;;28118:18;;:::i;:::-;28082:56;28156:29;28178:6;28156:29;:::i;:::-;28148:37;;28240:4;28234;28230:15;28222:23;;27944:308;;;:::o;28258:141::-;28307:4;28330:3;28322:11;;28353:3;28350:1;28343:14;28387:4;28384:1;28374:18;28366:26;;28258:141;;;:::o;28405:98::-;28456:6;28490:5;28484:12;28474:22;;28405:98;;;:::o;28509:99::-;28561:6;28595:5;28589:12;28579:22;;28509:99;;;:::o;28614:168::-;28697:11;28731:6;28726:3;28719:19;28771:4;28766:3;28762:14;28747:29;;28614:168;;;;:::o;28788:169::-;28872:11;28906:6;28901:3;28894:19;28946:4;28941:3;28937:14;28922:29;;28788:169;;;;:::o;28963:148::-;29065:11;29102:3;29087:18;;28963:148;;;;:::o;29117:305::-;29157:3;29176:20;29194:1;29176:20;:::i;:::-;29171:25;;29210:20;29228:1;29210:20;:::i;:::-;29205:25;;29364:1;29296:66;29292:74;29289:1;29286:81;29283:107;;;29370:18;;:::i;:::-;29283:107;29414:1;29411;29407:9;29400:16;;29117:305;;;;:::o;29428:185::-;29468:1;29485:20;29503:1;29485:20;:::i;:::-;29480:25;;29519:20;29537:1;29519:20;:::i;:::-;29514:25;;29558:1;29548:35;;29563:18;;:::i;:::-;29548:35;29605:1;29602;29598:9;29593:14;;29428:185;;;;:::o;29619:191::-;29659:4;29679:20;29697:1;29679:20;:::i;:::-;29674:25;;29713:20;29731:1;29713:20;:::i;:::-;29708:25;;29752:1;29749;29746:8;29743:34;;;29757:18;;:::i;:::-;29743:34;29802:1;29799;29795:9;29787:17;;29619:191;;;;:::o;29816:96::-;29853:7;29882:24;29900:5;29882:24;:::i;:::-;29871:35;;29816:96;;;:::o;29918:104::-;29963:7;29992:24;30010:5;29992:24;:::i;:::-;29981:35;;29918:104;;;:::o;30028:90::-;30062:7;30105:5;30098:13;30091:21;30080:32;;30028:90;;;:::o;30124:149::-;30160:7;30200:66;30193:5;30189:78;30178:89;;30124:149;;;:::o;30279:126::-;30316:7;30356:42;30349:5;30345:54;30334:65;;30279:126;;;:::o;30411:77::-;30448:7;30477:5;30466:16;;30411:77;;;:::o;30494:154::-;30578:6;30573:3;30568;30555:30;30640:1;30631:6;30626:3;30622:16;30615:27;30494:154;;;:::o;30654:307::-;30722:1;30732:113;30746:6;30743:1;30740:13;30732:113;;;30831:1;30826:3;30822:11;30816:18;30812:1;30807:3;30803:11;30796:39;30768:2;30765:1;30761:10;30756:15;;30732:113;;;30863:6;30860:1;30857:13;30854:101;;;30943:1;30934:6;30929:3;30925:16;30918:27;30854:101;30703:258;30654:307;;;:::o;30967:171::-;31006:3;31029:24;31047:5;31029:24;:::i;:::-;31020:33;;31075:4;31068:5;31065:15;31062:41;;;31083:18;;:::i;:::-;31062:41;31130:1;31123:5;31119:13;31112:20;;30967:171;;;:::o;31144:320::-;31188:6;31225:1;31219:4;31215:12;31205:22;;31272:1;31266:4;31262:12;31293:18;31283:81;;31349:4;31341:6;31337:17;31327:27;;31283:81;31411:2;31403:6;31400:14;31380:18;31377:38;31374:84;;;31430:18;;:::i;:::-;31374:84;31195:269;31144:320;;;:::o;31470:281::-;31553:27;31575:4;31553:27;:::i;:::-;31545:6;31541:40;31683:6;31671:10;31668:22;31647:18;31635:10;31632:34;31629:62;31626:88;;;31694:18;;:::i;:::-;31626:88;31734:10;31730:2;31723:22;31513:238;31470:281;;:::o;31757:233::-;31796:3;31819:24;31837:5;31819:24;:::i;:::-;31810:33;;31865:66;31858:5;31855:77;31852:103;;;31935:18;;:::i;:::-;31852:103;31982:1;31975:5;31971:13;31964:20;;31757:233;;;:::o;31996:176::-;32028:1;32045:20;32063:1;32045:20;:::i;:::-;32040:25;;32079:20;32097:1;32079:20;:::i;:::-;32074:25;;32118:1;32108:35;;32123:18;;:::i;:::-;32108:35;32164:1;32161;32157:9;32152:14;;31996:176;;;;:::o;32178:180::-;32226:77;32223:1;32216:88;32323:4;32320:1;32313:15;32347:4;32344:1;32337:15;32364:180;32412:77;32409:1;32402:88;32509:4;32506:1;32499:15;32533:4;32530:1;32523:15;32550:180;32598:77;32595:1;32588:88;32695:4;32692:1;32685:15;32719:4;32716:1;32709:15;32736:180;32784:77;32781:1;32774:88;32881:4;32878:1;32871:15;32905:4;32902:1;32895:15;32922:180;32970:77;32967:1;32960:88;33067:4;33064:1;33057:15;33091:4;33088:1;33081:15;33108:117;33217:1;33214;33207:12;33231:117;33340:1;33337;33330:12;33354:117;33463:1;33460;33453:12;33477:117;33586:1;33583;33576:12;33600:102;33641:6;33692:2;33688:7;33683:2;33676:5;33672:14;33668:28;33658:38;;33600:102;;;:::o;33708:237::-;33848:34;33844:1;33836:6;33832:14;33825:58;33917:20;33912:2;33904:6;33900:15;33893:45;33708:237;:::o;33951:225::-;34091:34;34087:1;34079:6;34075:14;34068:58;34160:8;34155:2;34147:6;34143:15;34136:33;33951:225;:::o;34182:178::-;34322:30;34318:1;34310:6;34306:14;34299:54;34182:178;:::o;34366:223::-;34506:34;34502:1;34494:6;34490:14;34483:58;34575:6;34570:2;34562:6;34558:15;34551:31;34366:223;:::o;34595:175::-;34735:27;34731:1;34723:6;34719:14;34712:51;34595:175;:::o;34776:231::-;34916:34;34912:1;34904:6;34900:14;34893:58;34985:14;34980:2;34972:6;34968:15;34961:39;34776:231;:::o;35013:173::-;35153:25;35149:1;35141:6;35137:14;35130:49;35013:173;:::o;35192:243::-;35332:34;35328:1;35320:6;35316:14;35309:58;35401:26;35396:2;35388:6;35384:15;35377:51;35192:243;:::o;35441:229::-;35581:34;35577:1;35569:6;35565:14;35558:58;35650:12;35645:2;35637:6;35633:15;35626:37;35441:229;:::o;35676:228::-;35816:34;35812:1;35804:6;35800:14;35793:58;35885:11;35880:2;35872:6;35868:15;35861:36;35676:228;:::o;35910:182::-;36050:34;36046:1;36038:6;36034:14;36027:58;35910:182;:::o;36098:231::-;36238:34;36234:1;36226:6;36222:14;36215:58;36307:14;36302:2;36294:6;36290:15;36283:39;36098:231;:::o;36335:182::-;36475:34;36471:1;36463:6;36459:14;36452:58;36335:182;:::o;36523:228::-;36663:34;36659:1;36651:6;36647:14;36640:58;36732:11;36727:2;36719:6;36715:15;36708:36;36523:228;:::o;36757:234::-;36897:34;36893:1;36885:6;36881:14;36874:58;36966:17;36961:2;36953:6;36949:15;36942:42;36757:234;:::o;36997:220::-;37137:34;37133:1;37125:6;37121:14;37114:58;37206:3;37201:2;37193:6;37189:15;37182:28;36997:220;:::o;37223:236::-;37363:34;37359:1;37351:6;37347:14;37340:58;37432:19;37427:2;37419:6;37415:15;37408:44;37223:236;:::o;37465:168::-;37605:20;37601:1;37593:6;37589:14;37582:44;37465:168;:::o;37639:122::-;37712:24;37730:5;37712:24;:::i;:::-;37705:5;37702:35;37692:63;;37751:1;37748;37741:12;37692:63;37639:122;:::o;37767:138::-;37848:32;37874:5;37848:32;:::i;:::-;37841:5;37838:43;37828:71;;37895:1;37892;37885:12;37828:71;37767:138;:::o;37911:116::-;37981:21;37996:5;37981:21;:::i;:::-;37974:5;37971:32;37961:60;;38017:1;38014;38007:12;37961:60;37911:116;:::o;38033:120::-;38105:23;38122:5;38105:23;:::i;:::-;38098:5;38095:34;38085:62;;38143:1;38140;38133:12;38085:62;38033:120;:::o;38159:122::-;38232:24;38250:5;38232:24;:::i;:::-;38225:5;38222:35;38212:63;;38271:1;38268;38261:12;38212:63;38159:122;:::o

Swarm Source

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