ETH Price: $3,438.21 (-1.32%)
Gas: 5.46 Gwei

Token

Moon Skull (MoonSkull)
 

Overview

Max Total Supply

0 MoonSkull

Holders

343

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
6 MoonSkull
0x6f734938a9bad38e2e15488ac0738bff06fabcf6
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
MoonSkull

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-19
*/

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


// OpenZeppelin Contracts v4.4.1 (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: @openzeppelin/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (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: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts v4.4.1 (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: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: 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 {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

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

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

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

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

        _afterTokenTransfer(owner, address(0), tokenId);
    }

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

// File: contracts/moonskull/moonskull.sol


pragma solidity ^0.8.13;



contract MoonSkull is ERC721, Ownable {
    string internal baseURI;
    uint256 price = 0.005 ether;

    uint256 private nextTokenId = 0;
    uint256 totalSupply = 10000;

    constructor() ERC721("Moon Skull", "MoonSkull") {
        baseURI = "https://d1gl57kvcwn26t.cloudfront.net/";
    }

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

    function mint(uint8 quantity) public payable {
        require(balanceOf(msg.sender) + quantity < 4, "Max mint amount exceeded");
        require(nextTokenId + quantity < totalSupply, "Total supply exceeded");

        if (nextTokenId + quantity > 1000) {
            require(quantity * price <= msg.value, "Value sent is too low");
        }

        for (uint256 i = 0; i < quantity; i++) {
            _safeMint(msg.sender, nextTokenId, "");
            nextTokenId++;
        }
    }

    function withdraw(uint256 amount) external onlyOwner {
        (bool sent, ) = payable(owner()).call{value: amount}("");
        require(sent, "Failed to withdraw funds");
    }
}

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":[{"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":"uint8","name":"quantity","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","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":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526611c37937e080006008556000600955612710600a553480156200002757600080fd5b506040518060400160405280600a81526020017f4d6f6f6e20536b756c6c000000000000000000000000000000000000000000008152506040518060400160405280600981526020017f4d6f6f6e536b756c6c00000000000000000000000000000000000000000000008152508160009080519060200190620000ac929190620001ee565b508060019080519060200190620000c5929190620001ee565b505050620000e8620000dc6200012060201b60201c565b6200012860201b60201c565b604051806060016040528060268152602001620034cc602691396007908051906020019062000119929190620001ee565b5062000302565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001fc90620002cd565b90600052602060002090601f0160209004810192826200022057600085556200026c565b82601f106200023b57805160ff19168380011785556200026c565b828001600101855582156200026c579182015b828111156200026b5782518255916020019190600101906200024e565b5b5090506200027b91906200027f565b5090565b5b808211156200029a57600081600090555060010162000280565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002e657607f821691505b602082108103620002fc57620002fb6200029e565b5b50919050565b6131ba80620003126000396000f3fe6080604052600436106101095760003560e01c806370a0823111610095578063a22cb46511610064578063a22cb4651461035a578063b88d4fde14610383578063c87b56dd146103ac578063e985e9c5146103e9578063f2fde38b1461042657610109565b806370a08231146102b0578063715018a6146102ed5780638da5cb5b1461030457806395d89b411461032f57610109565b806323b872dd116100dc57806323b872dd146101dc5780632e1a7d4d1461020557806342842e0e1461022e5780636352211e146102575780636ecd23061461029457610109565b806301ffc9a71461010e57806306fdde031461014b578063081812fc14610176578063095ea7b3146101b3575b600080fd5b34801561011a57600080fd5b5061013560048036038101906101309190611d8b565b61044f565b6040516101429190611dd3565b60405180910390f35b34801561015757600080fd5b50610160610531565b60405161016d9190611e87565b60405180910390f35b34801561018257600080fd5b5061019d60048036038101906101989190611edf565b6105c3565b6040516101aa9190611f4d565b60405180910390f35b3480156101bf57600080fd5b506101da60048036038101906101d59190611f94565b610648565b005b3480156101e857600080fd5b5061020360048036038101906101fe9190611fd4565b61075f565b005b34801561021157600080fd5b5061022c60048036038101906102279190611edf565b6107bf565b005b34801561023a57600080fd5b5061025560048036038101906102509190611fd4565b6108f2565b005b34801561026357600080fd5b5061027e60048036038101906102799190611edf565b610912565b60405161028b9190611f4d565b60405180910390f35b6102ae60048036038101906102a99190612060565b6109c3565b005b3480156102bc57600080fd5b506102d760048036038101906102d2919061208d565b610b37565b6040516102e491906120c9565b60405180910390f35b3480156102f957600080fd5b50610302610bee565b005b34801561031057600080fd5b50610319610c76565b6040516103269190611f4d565b60405180910390f35b34801561033b57600080fd5b50610344610ca0565b6040516103519190611e87565b60405180910390f35b34801561036657600080fd5b50610381600480360381019061037c9190612110565b610d32565b005b34801561038f57600080fd5b506103aa60048036038101906103a59190612285565b610d48565b005b3480156103b857600080fd5b506103d360048036038101906103ce9190611edf565b610daa565b6040516103e09190611e87565b60405180910390f35b3480156103f557600080fd5b50610410600480360381019061040b9190612308565b610e51565b60405161041d9190611dd3565b60405180910390f35b34801561043257600080fd5b5061044d6004803603810190610448919061208d565b610ee5565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061051a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061052a575061052982610fdc565b5b9050919050565b60606000805461054090612377565b80601f016020809104026020016040519081016040528092919081815260200182805461056c90612377565b80156105b95780601f1061058e576101008083540402835291602001916105b9565b820191906000526020600020905b81548152906001019060200180831161059c57829003601f168201915b5050505050905090565b60006105ce82611046565b61060d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106049061241a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061065382610912565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ba906124ac565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106e26110b2565b73ffffffffffffffffffffffffffffffffffffffff16148061071157506107108161070b6110b2565b610e51565b5b610750576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107479061253e565b60405180910390fd5b61075a83836110ba565b505050565b61077061076a6110b2565b82611173565b6107af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a6906125d0565b60405180910390fd5b6107ba838383611251565b505050565b6107c76110b2565b73ffffffffffffffffffffffffffffffffffffffff166107e5610c76565b73ffffffffffffffffffffffffffffffffffffffff161461083b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108329061263c565b60405180910390fd5b6000610845610c76565b73ffffffffffffffffffffffffffffffffffffffff16826040516108689061268d565b60006040518083038185875af1925050503d80600081146108a5576040519150601f19603f3d011682016040523d82523d6000602084013e6108aa565b606091505b50509050806108ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e5906126ee565b60405180910390fd5b5050565b61090d83838360405180602001604052806000815250610d48565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036109ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b190612780565b60405180910390fd5b80915050919050565b60048160ff166109d233610b37565b6109dc91906127cf565b10610a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1390612871565b60405180910390fd5b600a548160ff16600954610a3091906127cf565b10610a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a67906128dd565b60405180910390fd5b6103e88160ff16600954610a8491906127cf565b1115610ade57346008548260ff16610a9c91906128fd565b1115610add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad4906129a3565b60405180910390fd5b5b60005b8160ff16811015610b3357610b0833600954604051806020016040528060008152506114b7565b60096000815480929190610b1b906129c3565b91905055508080610b2b906129c3565b915050610ae1565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9e90612a7d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610bf66110b2565b73ffffffffffffffffffffffffffffffffffffffff16610c14610c76565b73ffffffffffffffffffffffffffffffffffffffff1614610c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c619061263c565b60405180910390fd5b610c746000611512565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610caf90612377565b80601f0160208091040260200160405190810160405280929190818152602001828054610cdb90612377565b8015610d285780601f10610cfd57610100808354040283529160200191610d28565b820191906000526020600020905b815481529060010190602001808311610d0b57829003601f168201915b5050505050905090565b610d44610d3d6110b2565b83836115d8565b5050565b610d59610d536110b2565b83611173565b610d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8f906125d0565b60405180910390fd5b610da484848484611744565b50505050565b6060610db582611046565b610df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610deb90612b0f565b60405180910390fd5b6000610dfe6117a0565b90506000815111610e1e5760405180602001604052806000815250610e49565b80610e2884611832565b604051602001610e39929190612b6b565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610eed6110b2565b73ffffffffffffffffffffffffffffffffffffffff16610f0b610c76565b73ffffffffffffffffffffffffffffffffffffffff1614610f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f589061263c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc790612c01565b60405180910390fd5b610fd981611512565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661112d83610912565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061117e82611046565b6111bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b490612c93565b60405180910390fd5b60006111c883610912565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061123757508373ffffffffffffffffffffffffffffffffffffffff1661121f846105c3565b73ffffffffffffffffffffffffffffffffffffffff16145b8061124857506112478185610e51565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661127182610912565b73ffffffffffffffffffffffffffffffffffffffff16146112c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112be90612d25565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611336576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132d90612db7565b60405180910390fd5b611341838383611992565b61134c6000826110ba565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461139c9190612dd7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113f391906127cf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46114b2838383611997565b505050565b6114c1838361199c565b6114ce6000848484611b75565b61150d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150490612e7d565b60405180910390fd5b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163d90612ee9565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117379190611dd3565b60405180910390a3505050565b61174f848484611251565b61175b84848484611b75565b61179a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179190612e7d565b60405180910390fd5b50505050565b6060600780546117af90612377565b80601f01602080910402602001604051908101604052809291908181526020018280546117db90612377565b80156118285780601f106117fd57610100808354040283529160200191611828565b820191906000526020600020905b81548152906001019060200180831161180b57829003601f168201915b5050505050905090565b606060008203611879576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061198d565b600082905060005b600082146118ab578080611894906129c3565b915050600a826118a49190612f38565b9150611881565b60008167ffffffffffffffff8111156118c7576118c661215a565b5b6040519080825280601f01601f1916602001820160405280156118f95781602001600182028036833780820191505090505b5090505b60008514611986576001826119129190612dd7565b9150600a856119219190612f69565b603061192d91906127cf565b60f81b81838151811061194357611942612f9a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561197f9190612f38565b94506118fd565b8093505050505b919050565b505050565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0290613015565b60405180910390fd5b611a1481611046565b15611a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4b90613081565b60405180910390fd5b611a6060008383611992565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ab091906127cf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b7160008383611997565b5050565b6000611b968473ffffffffffffffffffffffffffffffffffffffff16611cfc565b15611cef578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611bbf6110b2565b8786866040518563ffffffff1660e01b8152600401611be194939291906130f6565b6020604051808303816000875af1925050508015611c1d57506040513d601f19601f82011682018060405250810190611c1a9190613157565b60015b611c9f573d8060008114611c4d576040519150601f19603f3d011682016040523d82523d6000602084013e611c52565b606091505b506000815103611c97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8e90612e7d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611cf4565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611d6881611d33565b8114611d7357600080fd5b50565b600081359050611d8581611d5f565b92915050565b600060208284031215611da157611da0611d29565b5b6000611daf84828501611d76565b91505092915050565b60008115159050919050565b611dcd81611db8565b82525050565b6000602082019050611de86000830184611dc4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611e28578082015181840152602081019050611e0d565b83811115611e37576000848401525b50505050565b6000601f19601f8301169050919050565b6000611e5982611dee565b611e638185611df9565b9350611e73818560208601611e0a565b611e7c81611e3d565b840191505092915050565b60006020820190508181036000830152611ea18184611e4e565b905092915050565b6000819050919050565b611ebc81611ea9565b8114611ec757600080fd5b50565b600081359050611ed981611eb3565b92915050565b600060208284031215611ef557611ef4611d29565b5b6000611f0384828501611eca565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611f3782611f0c565b9050919050565b611f4781611f2c565b82525050565b6000602082019050611f626000830184611f3e565b92915050565b611f7181611f2c565b8114611f7c57600080fd5b50565b600081359050611f8e81611f68565b92915050565b60008060408385031215611fab57611faa611d29565b5b6000611fb985828601611f7f565b9250506020611fca85828601611eca565b9150509250929050565b600080600060608486031215611fed57611fec611d29565b5b6000611ffb86828701611f7f565b935050602061200c86828701611f7f565b925050604061201d86828701611eca565b9150509250925092565b600060ff82169050919050565b61203d81612027565b811461204857600080fd5b50565b60008135905061205a81612034565b92915050565b60006020828403121561207657612075611d29565b5b60006120848482850161204b565b91505092915050565b6000602082840312156120a3576120a2611d29565b5b60006120b184828501611f7f565b91505092915050565b6120c381611ea9565b82525050565b60006020820190506120de60008301846120ba565b92915050565b6120ed81611db8565b81146120f857600080fd5b50565b60008135905061210a816120e4565b92915050565b6000806040838503121561212757612126611d29565b5b600061213585828601611f7f565b9250506020612146858286016120fb565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61219282611e3d565b810181811067ffffffffffffffff821117156121b1576121b061215a565b5b80604052505050565b60006121c4611d1f565b90506121d08282612189565b919050565b600067ffffffffffffffff8211156121f0576121ef61215a565b5b6121f982611e3d565b9050602081019050919050565b82818337600083830152505050565b6000612228612223846121d5565b6121ba565b90508281526020810184848401111561224457612243612155565b5b61224f848285612206565b509392505050565b600082601f83011261226c5761226b612150565b5b813561227c848260208601612215565b91505092915050565b6000806000806080858703121561229f5761229e611d29565b5b60006122ad87828801611f7f565b94505060206122be87828801611f7f565b93505060406122cf87828801611eca565b925050606085013567ffffffffffffffff8111156122f0576122ef611d2e565b5b6122fc87828801612257565b91505092959194509250565b6000806040838503121561231f5761231e611d29565b5b600061232d85828601611f7f565b925050602061233e85828601611f7f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061238f57607f821691505b6020821081036123a2576123a1612348565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612404602c83611df9565b915061240f826123a8565b604082019050919050565b60006020820190508181036000830152612433816123f7565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612496602183611df9565b91506124a18261243a565b604082019050919050565b600060208201905081810360008301526124c581612489565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612528603883611df9565b9150612533826124cc565b604082019050919050565b600060208201905081810360008301526125578161251b565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006125ba603183611df9565b91506125c58261255e565b604082019050919050565b600060208201905081810360008301526125e9816125ad565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612626602083611df9565b9150612631826125f0565b602082019050919050565b6000602082019050818103600083015261265581612619565b9050919050565b600081905092915050565b50565b600061267760008361265c565b915061268282612667565b600082019050919050565b60006126988261266a565b9150819050919050565b7f4661696c656420746f2077697468647261772066756e64730000000000000000600082015250565b60006126d8601883611df9565b91506126e3826126a2565b602082019050919050565b60006020820190508181036000830152612707816126cb565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061276a602983611df9565b91506127758261270e565b604082019050919050565b600060208201905081810360008301526127998161275d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006127da82611ea9565b91506127e583611ea9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561281a576128196127a0565b5b828201905092915050565b7f4d6178206d696e7420616d6f756e742065786365656465640000000000000000600082015250565b600061285b601883611df9565b915061286682612825565b602082019050919050565b6000602082019050818103600083015261288a8161284e565b9050919050565b7f546f74616c20737570706c792065786365656465640000000000000000000000600082015250565b60006128c7601583611df9565b91506128d282612891565b602082019050919050565b600060208201905081810360008301526128f6816128ba565b9050919050565b600061290882611ea9565b915061291383611ea9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561294c5761294b6127a0565b5b828202905092915050565b7f56616c75652073656e7420697320746f6f206c6f770000000000000000000000600082015250565b600061298d601583611df9565b915061299882612957565b602082019050919050565b600060208201905081810360008301526129bc81612980565b9050919050565b60006129ce82611ea9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612a00576129ff6127a0565b5b600182019050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000612a67602a83611df9565b9150612a7282612a0b565b604082019050919050565b60006020820190508181036000830152612a9681612a5a565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000612af9602f83611df9565b9150612b0482612a9d565b604082019050919050565b60006020820190508181036000830152612b2881612aec565b9050919050565b600081905092915050565b6000612b4582611dee565b612b4f8185612b2f565b9350612b5f818560208601611e0a565b80840191505092915050565b6000612b778285612b3a565b9150612b838284612b3a565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612beb602683611df9565b9150612bf682612b8f565b604082019050919050565b60006020820190508181036000830152612c1a81612bde565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612c7d602c83611df9565b9150612c8882612c21565b604082019050919050565b60006020820190508181036000830152612cac81612c70565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612d0f602583611df9565b9150612d1a82612cb3565b604082019050919050565b60006020820190508181036000830152612d3e81612d02565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612da1602483611df9565b9150612dac82612d45565b604082019050919050565b60006020820190508181036000830152612dd081612d94565b9050919050565b6000612de282611ea9565b9150612ded83611ea9565b925082821015612e0057612dff6127a0565b5b828203905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000612e67603283611df9565b9150612e7282612e0b565b604082019050919050565b60006020820190508181036000830152612e9681612e5a565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612ed3601983611df9565b9150612ede82612e9d565b602082019050919050565b60006020820190508181036000830152612f0281612ec6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612f4382611ea9565b9150612f4e83611ea9565b925082612f5e57612f5d612f09565b5b828204905092915050565b6000612f7482611ea9565b9150612f7f83611ea9565b925082612f8f57612f8e612f09565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612fff602083611df9565b915061300a82612fc9565b602082019050919050565b6000602082019050818103600083015261302e81612ff2565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061306b601c83611df9565b915061307682613035565b602082019050919050565b6000602082019050818103600083015261309a8161305e565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006130c8826130a1565b6130d281856130ac565b93506130e2818560208601611e0a565b6130eb81611e3d565b840191505092915050565b600060808201905061310b6000830187611f3e565b6131186020830186611f3e565b61312560408301856120ba565b818103606083015261313781846130bd565b905095945050505050565b60008151905061315181611d5f565b92915050565b60006020828403121561316d5761316c611d29565b5b600061317b84828501613142565b9150509291505056fea2646970667358221220632734f2824e4bd09875030ea21a44fe11e92f73a7147044c95595ae5df311dc64736f6c634300080d003368747470733a2f2f6431676c35376b7663776e3236742e636c6f756466726f6e742e6e65742f

Deployed Bytecode

0x6080604052600436106101095760003560e01c806370a0823111610095578063a22cb46511610064578063a22cb4651461035a578063b88d4fde14610383578063c87b56dd146103ac578063e985e9c5146103e9578063f2fde38b1461042657610109565b806370a08231146102b0578063715018a6146102ed5780638da5cb5b1461030457806395d89b411461032f57610109565b806323b872dd116100dc57806323b872dd146101dc5780632e1a7d4d1461020557806342842e0e1461022e5780636352211e146102575780636ecd23061461029457610109565b806301ffc9a71461010e57806306fdde031461014b578063081812fc14610176578063095ea7b3146101b3575b600080fd5b34801561011a57600080fd5b5061013560048036038101906101309190611d8b565b61044f565b6040516101429190611dd3565b60405180910390f35b34801561015757600080fd5b50610160610531565b60405161016d9190611e87565b60405180910390f35b34801561018257600080fd5b5061019d60048036038101906101989190611edf565b6105c3565b6040516101aa9190611f4d565b60405180910390f35b3480156101bf57600080fd5b506101da60048036038101906101d59190611f94565b610648565b005b3480156101e857600080fd5b5061020360048036038101906101fe9190611fd4565b61075f565b005b34801561021157600080fd5b5061022c60048036038101906102279190611edf565b6107bf565b005b34801561023a57600080fd5b5061025560048036038101906102509190611fd4565b6108f2565b005b34801561026357600080fd5b5061027e60048036038101906102799190611edf565b610912565b60405161028b9190611f4d565b60405180910390f35b6102ae60048036038101906102a99190612060565b6109c3565b005b3480156102bc57600080fd5b506102d760048036038101906102d2919061208d565b610b37565b6040516102e491906120c9565b60405180910390f35b3480156102f957600080fd5b50610302610bee565b005b34801561031057600080fd5b50610319610c76565b6040516103269190611f4d565b60405180910390f35b34801561033b57600080fd5b50610344610ca0565b6040516103519190611e87565b60405180910390f35b34801561036657600080fd5b50610381600480360381019061037c9190612110565b610d32565b005b34801561038f57600080fd5b506103aa60048036038101906103a59190612285565b610d48565b005b3480156103b857600080fd5b506103d360048036038101906103ce9190611edf565b610daa565b6040516103e09190611e87565b60405180910390f35b3480156103f557600080fd5b50610410600480360381019061040b9190612308565b610e51565b60405161041d9190611dd3565b60405180910390f35b34801561043257600080fd5b5061044d6004803603810190610448919061208d565b610ee5565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061051a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061052a575061052982610fdc565b5b9050919050565b60606000805461054090612377565b80601f016020809104026020016040519081016040528092919081815260200182805461056c90612377565b80156105b95780601f1061058e576101008083540402835291602001916105b9565b820191906000526020600020905b81548152906001019060200180831161059c57829003601f168201915b5050505050905090565b60006105ce82611046565b61060d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106049061241a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061065382610912565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ba906124ac565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106e26110b2565b73ffffffffffffffffffffffffffffffffffffffff16148061071157506107108161070b6110b2565b610e51565b5b610750576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107479061253e565b60405180910390fd5b61075a83836110ba565b505050565b61077061076a6110b2565b82611173565b6107af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a6906125d0565b60405180910390fd5b6107ba838383611251565b505050565b6107c76110b2565b73ffffffffffffffffffffffffffffffffffffffff166107e5610c76565b73ffffffffffffffffffffffffffffffffffffffff161461083b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108329061263c565b60405180910390fd5b6000610845610c76565b73ffffffffffffffffffffffffffffffffffffffff16826040516108689061268d565b60006040518083038185875af1925050503d80600081146108a5576040519150601f19603f3d011682016040523d82523d6000602084013e6108aa565b606091505b50509050806108ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e5906126ee565b60405180910390fd5b5050565b61090d83838360405180602001604052806000815250610d48565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036109ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b190612780565b60405180910390fd5b80915050919050565b60048160ff166109d233610b37565b6109dc91906127cf565b10610a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1390612871565b60405180910390fd5b600a548160ff16600954610a3091906127cf565b10610a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a67906128dd565b60405180910390fd5b6103e88160ff16600954610a8491906127cf565b1115610ade57346008548260ff16610a9c91906128fd565b1115610add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad4906129a3565b60405180910390fd5b5b60005b8160ff16811015610b3357610b0833600954604051806020016040528060008152506114b7565b60096000815480929190610b1b906129c3565b91905055508080610b2b906129c3565b915050610ae1565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9e90612a7d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610bf66110b2565b73ffffffffffffffffffffffffffffffffffffffff16610c14610c76565b73ffffffffffffffffffffffffffffffffffffffff1614610c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c619061263c565b60405180910390fd5b610c746000611512565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610caf90612377565b80601f0160208091040260200160405190810160405280929190818152602001828054610cdb90612377565b8015610d285780601f10610cfd57610100808354040283529160200191610d28565b820191906000526020600020905b815481529060010190602001808311610d0b57829003601f168201915b5050505050905090565b610d44610d3d6110b2565b83836115d8565b5050565b610d59610d536110b2565b83611173565b610d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8f906125d0565b60405180910390fd5b610da484848484611744565b50505050565b6060610db582611046565b610df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610deb90612b0f565b60405180910390fd5b6000610dfe6117a0565b90506000815111610e1e5760405180602001604052806000815250610e49565b80610e2884611832565b604051602001610e39929190612b6b565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610eed6110b2565b73ffffffffffffffffffffffffffffffffffffffff16610f0b610c76565b73ffffffffffffffffffffffffffffffffffffffff1614610f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f589061263c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc790612c01565b60405180910390fd5b610fd981611512565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661112d83610912565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061117e82611046565b6111bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b490612c93565b60405180910390fd5b60006111c883610912565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061123757508373ffffffffffffffffffffffffffffffffffffffff1661121f846105c3565b73ffffffffffffffffffffffffffffffffffffffff16145b8061124857506112478185610e51565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661127182610912565b73ffffffffffffffffffffffffffffffffffffffff16146112c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112be90612d25565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611336576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132d90612db7565b60405180910390fd5b611341838383611992565b61134c6000826110ba565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461139c9190612dd7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113f391906127cf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46114b2838383611997565b505050565b6114c1838361199c565b6114ce6000848484611b75565b61150d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150490612e7d565b60405180910390fd5b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163d90612ee9565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117379190611dd3565b60405180910390a3505050565b61174f848484611251565b61175b84848484611b75565b61179a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179190612e7d565b60405180910390fd5b50505050565b6060600780546117af90612377565b80601f01602080910402602001604051908101604052809291908181526020018280546117db90612377565b80156118285780601f106117fd57610100808354040283529160200191611828565b820191906000526020600020905b81548152906001019060200180831161180b57829003601f168201915b5050505050905090565b606060008203611879576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061198d565b600082905060005b600082146118ab578080611894906129c3565b915050600a826118a49190612f38565b9150611881565b60008167ffffffffffffffff8111156118c7576118c661215a565b5b6040519080825280601f01601f1916602001820160405280156118f95781602001600182028036833780820191505090505b5090505b60008514611986576001826119129190612dd7565b9150600a856119219190612f69565b603061192d91906127cf565b60f81b81838151811061194357611942612f9a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561197f9190612f38565b94506118fd565b8093505050505b919050565b505050565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0290613015565b60405180910390fd5b611a1481611046565b15611a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4b90613081565b60405180910390fd5b611a6060008383611992565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ab091906127cf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b7160008383611997565b5050565b6000611b968473ffffffffffffffffffffffffffffffffffffffff16611cfc565b15611cef578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611bbf6110b2565b8786866040518563ffffffff1660e01b8152600401611be194939291906130f6565b6020604051808303816000875af1925050508015611c1d57506040513d601f19601f82011682018060405250810190611c1a9190613157565b60015b611c9f573d8060008114611c4d576040519150601f19603f3d011682016040523d82523d6000602084013e611c52565b606091505b506000815103611c97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8e90612e7d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611cf4565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611d6881611d33565b8114611d7357600080fd5b50565b600081359050611d8581611d5f565b92915050565b600060208284031215611da157611da0611d29565b5b6000611daf84828501611d76565b91505092915050565b60008115159050919050565b611dcd81611db8565b82525050565b6000602082019050611de86000830184611dc4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611e28578082015181840152602081019050611e0d565b83811115611e37576000848401525b50505050565b6000601f19601f8301169050919050565b6000611e5982611dee565b611e638185611df9565b9350611e73818560208601611e0a565b611e7c81611e3d565b840191505092915050565b60006020820190508181036000830152611ea18184611e4e565b905092915050565b6000819050919050565b611ebc81611ea9565b8114611ec757600080fd5b50565b600081359050611ed981611eb3565b92915050565b600060208284031215611ef557611ef4611d29565b5b6000611f0384828501611eca565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611f3782611f0c565b9050919050565b611f4781611f2c565b82525050565b6000602082019050611f626000830184611f3e565b92915050565b611f7181611f2c565b8114611f7c57600080fd5b50565b600081359050611f8e81611f68565b92915050565b60008060408385031215611fab57611faa611d29565b5b6000611fb985828601611f7f565b9250506020611fca85828601611eca565b9150509250929050565b600080600060608486031215611fed57611fec611d29565b5b6000611ffb86828701611f7f565b935050602061200c86828701611f7f565b925050604061201d86828701611eca565b9150509250925092565b600060ff82169050919050565b61203d81612027565b811461204857600080fd5b50565b60008135905061205a81612034565b92915050565b60006020828403121561207657612075611d29565b5b60006120848482850161204b565b91505092915050565b6000602082840312156120a3576120a2611d29565b5b60006120b184828501611f7f565b91505092915050565b6120c381611ea9565b82525050565b60006020820190506120de60008301846120ba565b92915050565b6120ed81611db8565b81146120f857600080fd5b50565b60008135905061210a816120e4565b92915050565b6000806040838503121561212757612126611d29565b5b600061213585828601611f7f565b9250506020612146858286016120fb565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61219282611e3d565b810181811067ffffffffffffffff821117156121b1576121b061215a565b5b80604052505050565b60006121c4611d1f565b90506121d08282612189565b919050565b600067ffffffffffffffff8211156121f0576121ef61215a565b5b6121f982611e3d565b9050602081019050919050565b82818337600083830152505050565b6000612228612223846121d5565b6121ba565b90508281526020810184848401111561224457612243612155565b5b61224f848285612206565b509392505050565b600082601f83011261226c5761226b612150565b5b813561227c848260208601612215565b91505092915050565b6000806000806080858703121561229f5761229e611d29565b5b60006122ad87828801611f7f565b94505060206122be87828801611f7f565b93505060406122cf87828801611eca565b925050606085013567ffffffffffffffff8111156122f0576122ef611d2e565b5b6122fc87828801612257565b91505092959194509250565b6000806040838503121561231f5761231e611d29565b5b600061232d85828601611f7f565b925050602061233e85828601611f7f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061238f57607f821691505b6020821081036123a2576123a1612348565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612404602c83611df9565b915061240f826123a8565b604082019050919050565b60006020820190508181036000830152612433816123f7565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612496602183611df9565b91506124a18261243a565b604082019050919050565b600060208201905081810360008301526124c581612489565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612528603883611df9565b9150612533826124cc565b604082019050919050565b600060208201905081810360008301526125578161251b565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006125ba603183611df9565b91506125c58261255e565b604082019050919050565b600060208201905081810360008301526125e9816125ad565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612626602083611df9565b9150612631826125f0565b602082019050919050565b6000602082019050818103600083015261265581612619565b9050919050565b600081905092915050565b50565b600061267760008361265c565b915061268282612667565b600082019050919050565b60006126988261266a565b9150819050919050565b7f4661696c656420746f2077697468647261772066756e64730000000000000000600082015250565b60006126d8601883611df9565b91506126e3826126a2565b602082019050919050565b60006020820190508181036000830152612707816126cb565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061276a602983611df9565b91506127758261270e565b604082019050919050565b600060208201905081810360008301526127998161275d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006127da82611ea9565b91506127e583611ea9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561281a576128196127a0565b5b828201905092915050565b7f4d6178206d696e7420616d6f756e742065786365656465640000000000000000600082015250565b600061285b601883611df9565b915061286682612825565b602082019050919050565b6000602082019050818103600083015261288a8161284e565b9050919050565b7f546f74616c20737570706c792065786365656465640000000000000000000000600082015250565b60006128c7601583611df9565b91506128d282612891565b602082019050919050565b600060208201905081810360008301526128f6816128ba565b9050919050565b600061290882611ea9565b915061291383611ea9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561294c5761294b6127a0565b5b828202905092915050565b7f56616c75652073656e7420697320746f6f206c6f770000000000000000000000600082015250565b600061298d601583611df9565b915061299882612957565b602082019050919050565b600060208201905081810360008301526129bc81612980565b9050919050565b60006129ce82611ea9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612a00576129ff6127a0565b5b600182019050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000612a67602a83611df9565b9150612a7282612a0b565b604082019050919050565b60006020820190508181036000830152612a9681612a5a565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000612af9602f83611df9565b9150612b0482612a9d565b604082019050919050565b60006020820190508181036000830152612b2881612aec565b9050919050565b600081905092915050565b6000612b4582611dee565b612b4f8185612b2f565b9350612b5f818560208601611e0a565b80840191505092915050565b6000612b778285612b3a565b9150612b838284612b3a565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612beb602683611df9565b9150612bf682612b8f565b604082019050919050565b60006020820190508181036000830152612c1a81612bde565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612c7d602c83611df9565b9150612c8882612c21565b604082019050919050565b60006020820190508181036000830152612cac81612c70565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612d0f602583611df9565b9150612d1a82612cb3565b604082019050919050565b60006020820190508181036000830152612d3e81612d02565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612da1602483611df9565b9150612dac82612d45565b604082019050919050565b60006020820190508181036000830152612dd081612d94565b9050919050565b6000612de282611ea9565b9150612ded83611ea9565b925082821015612e0057612dff6127a0565b5b828203905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000612e67603283611df9565b9150612e7282612e0b565b604082019050919050565b60006020820190508181036000830152612e9681612e5a565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612ed3601983611df9565b9150612ede82612e9d565b602082019050919050565b60006020820190508181036000830152612f0281612ec6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612f4382611ea9565b9150612f4e83611ea9565b925082612f5e57612f5d612f09565b5b828204905092915050565b6000612f7482611ea9565b9150612f7f83611ea9565b925082612f8f57612f8e612f09565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612fff602083611df9565b915061300a82612fc9565b602082019050919050565b6000602082019050818103600083015261302e81612ff2565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061306b601c83611df9565b915061307682613035565b602082019050919050565b6000602082019050818103600083015261309a8161305e565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006130c8826130a1565b6130d281856130ac565b93506130e2818560208601611e0a565b6130eb81611e3d565b840191505092915050565b600060808201905061310b6000830187611f3e565b6131186020830186611f3e565b61312560408301856120ba565b818103606083015261313781846130bd565b905095945050505050565b60008151905061315181611d5f565b92915050565b60006020828403121561316d5761316c611d29565b5b600061317b84828501613142565b9150509291505056fea2646970667358221220632734f2824e4bd09875030ea21a44fe11e92f73a7147044c95595ae5df311dc64736f6c634300080d0033

Deployed Bytecode Sourcemap

37303:1108:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24109:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25054:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26613:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26136:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27363:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38228:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27773:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24748:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37721:499;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24478:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4730:103;;;;;;;;;;;;;:::i;:::-;;4079:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25223:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26906:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28029:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25398:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27132:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4988:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24109:305;24211:4;24263:25;24248:40;;;:11;:40;;;;:105;;;;24320:33;24305:48;;;:11;:48;;;;24248:105;:158;;;;24370:36;24394:11;24370:23;:36::i;:::-;24248:158;24228:178;;24109:305;;;:::o;25054:100::-;25108:13;25141:5;25134:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25054:100;:::o;26613:221::-;26689:7;26717:16;26725:7;26717;:16::i;:::-;26709:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26802:15;:24;26818:7;26802:24;;;;;;;;;;;;;;;;;;;;;26795:31;;26613:221;;;:::o;26136:411::-;26217:13;26233:23;26248:7;26233:14;:23::i;:::-;26217:39;;26281:5;26275:11;;:2;:11;;;26267:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26375:5;26359:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26384:37;26401:5;26408:12;:10;:12::i;:::-;26384:16;:37::i;:::-;26359:62;26337:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26518:21;26527:2;26531:7;26518:8;:21::i;:::-;26206:341;26136:411;;:::o;27363:339::-;27558:41;27577:12;:10;:12::i;:::-;27591:7;27558:18;:41::i;:::-;27550:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27666:28;27676:4;27682:2;27686:7;27666:9;:28::i;:::-;27363:339;;;:::o;38228:180::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38293:9:::1;38316:7;:5;:7::i;:::-;38308:21;;38337:6;38308:40;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38292:56;;;38367:4;38359:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;38281:127;38228:180:::0;:::o;27773:185::-;27911:39;27928:4;27934:2;27938:7;27911:39;;;;;;;;;;;;:16;:39::i;:::-;27773:185;;;:::o;24748:239::-;24820:7;24840:13;24856:7;:16;24864:7;24856:16;;;;;;;;;;;;;;;;;;;;;24840:32;;24908:1;24891:19;;:5;:19;;;24883:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24974:5;24967:12;;;24748:239;;;:::o;37721:499::-;37820:1;37809:8;37785:32;;:21;37795:10;37785:9;:21::i;:::-;:32;;;;:::i;:::-;:36;37777:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37894:11;;37883:8;37869:22;;:11;;:22;;;;:::i;:::-;:36;37861:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;37973:4;37962:8;37948:22;;:11;;:22;;;;:::i;:::-;:29;37944:125;;;38022:9;38013:5;;38002:8;:16;;;;;;:::i;:::-;:29;;37994:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;37944:125;38086:9;38081:132;38105:8;38101:12;;:1;:12;38081:132;;;38135:38;38145:10;38157:11;;38135:38;;;;;;;;;;;;:9;:38::i;:::-;38188:11;;:13;;;;;;;;;:::i;:::-;;;;;;38115:3;;;;;:::i;:::-;;;;38081:132;;;;37721:499;:::o;24478:208::-;24550:7;24595:1;24578:19;;:5;:19;;;24570:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;24662:9;:16;24672:5;24662:16;;;;;;;;;;;;;;;;24655:23;;24478:208;;;:::o;4730:103::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4795:30:::1;4822:1;4795:18;:30::i;:::-;4730:103::o:0;4079:87::-;4125:7;4152:6;;;;;;;;;;;4145:13;;4079:87;:::o;25223:104::-;25279:13;25312:7;25305:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25223:104;:::o;26906:155::-;27001:52;27020:12;:10;:12::i;:::-;27034:8;27044;27001:18;:52::i;:::-;26906:155;;:::o;28029:328::-;28204:41;28223:12;:10;:12::i;:::-;28237:7;28204:18;:41::i;:::-;28196:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28310:39;28324:4;28330:2;28334:7;28343:5;28310:13;:39::i;:::-;28029:328;;;;:::o;25398:334::-;25471:13;25505:16;25513:7;25505;:16::i;:::-;25497:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;25586:21;25610:10;:8;:10::i;:::-;25586:34;;25662:1;25644:7;25638:21;:25;:86;;;;;;;;;;;;;;;;;25690:7;25699:18;:7;:16;:18::i;:::-;25673:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25638:86;25631:93;;;25398:334;;;:::o;27132:164::-;27229:4;27253:18;:25;27272:5;27253:25;;;;;;;;;;;;;;;:35;27279:8;27253:35;;;;;;;;;;;;;;;;;;;;;;;;;27246:42;;27132:164;;;;:::o;4988:201::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5097:1:::1;5077:22;;:8;:22;;::::0;5069:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;5153:28;5172:8;5153:18;:28::i;:::-;4988:201:::0;:::o;16863:157::-;16948:4;16987:25;16972:40;;;:11;:40;;;;16965:47;;16863:157;;;:::o;29867:127::-;29932:4;29984:1;29956:30;;:7;:16;29964:7;29956:16;;;;;;;;;;;;;;;;;;;;;:30;;;;29949:37;;29867:127;;;:::o;2803:98::-;2856:7;2883:10;2876:17;;2803:98;:::o;34013:174::-;34115:2;34088:15;:24;34104:7;34088:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34171:7;34167:2;34133:46;;34142:23;34157:7;34142:14;:23::i;:::-;34133:46;;;;;;;;;;;;34013:174;;:::o;30161:348::-;30254:4;30279:16;30287:7;30279;:16::i;:::-;30271:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30355:13;30371:23;30386:7;30371:14;:23::i;:::-;30355:39;;30424:5;30413:16;;:7;:16;;;:51;;;;30457:7;30433:31;;:20;30445:7;30433:11;:20::i;:::-;:31;;;30413:51;:87;;;;30468:32;30485:5;30492:7;30468:16;:32::i;:::-;30413:87;30405:96;;;30161:348;;;;:::o;33270:625::-;33429:4;33402:31;;:23;33417:7;33402:14;:23::i;:::-;:31;;;33394:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;33508:1;33494:16;;:2;:16;;;33486:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33564:39;33585:4;33591:2;33595:7;33564:20;:39::i;:::-;33668:29;33685:1;33689:7;33668:8;:29::i;:::-;33729:1;33710:9;:15;33720:4;33710:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;33758:1;33741:9;:13;33751:2;33741:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33789:2;33770:7;:16;33778:7;33770:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33828:7;33824:2;33809:27;;33818:4;33809:27;;;;;;;;;;;;33849:38;33869:4;33875:2;33879:7;33849:19;:38::i;:::-;33270:625;;;:::o;31188:321::-;31318:18;31324:2;31328:7;31318:5;:18::i;:::-;31369:54;31400:1;31404:2;31408:7;31417:5;31369:22;:54::i;:::-;31347:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31188:321;;;:::o;5349:191::-;5423:16;5442:6;;;;;;;;;;;5423:25;;5468:8;5459:6;;:17;;;;;;;;;;;;;;;;;;5523:8;5492:40;;5513:8;5492:40;;;;;;;;;;;;5412:128;5349:191;:::o;34329:315::-;34484:8;34475:17;;:5;:17;;;34467:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;34571:8;34533:18;:25;34552:5;34533:25;;;;;;;;;;;;;;;:35;34559:8;34533:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;34617:8;34595:41;;34610:5;34595:41;;;34627:8;34595:41;;;;;;:::i;:::-;;;;;;;;34329:315;;;:::o;29239:::-;29396:28;29406:4;29412:2;29416:7;29396:9;:28::i;:::-;29443:48;29466:4;29472:2;29476:7;29485:5;29443:22;:48::i;:::-;29435:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29239:315;;;;:::o;37613:100::-;37665:13;37698:7;37691:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37613:100;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;36580:126::-;;;;:::o;37091:125::-;;;;:::o;31845:439::-;31939:1;31925:16;;:2;:16;;;31917:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;31998:16;32006:7;31998;:16::i;:::-;31997:17;31989:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32060:45;32089:1;32093:2;32097:7;32060:20;:45::i;:::-;32135:1;32118:9;:13;32128:2;32118:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32166:2;32147:7;:16;32155:7;32147:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32211:7;32207:2;32186:33;;32203:1;32186:33;;;;;;;;;;;;32232:44;32260:1;32264:2;32268:7;32232:19;:44::i;:::-;31845:439;;:::o;35209:799::-;35364:4;35385:15;:2;:13;;;:15::i;:::-;35381:620;;;35437:2;35421:36;;;35458:12;:10;:12::i;:::-;35472:4;35478:7;35487:5;35421:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35417:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35680:1;35663:6;:13;:18;35659:272;;35706:60;;;;;;;;;;:::i;:::-;;;;;;;;35659:272;35881:6;35875:13;35866:6;35862:2;35858:15;35851:38;35417:529;35554:41;;;35544:51;;;:6;:51;;;;35537:58;;;;;35381:620;35985:4;35978:11;;35209:799;;;;;;;:::o;6780:326::-;6840:4;7097:1;7075:7;:19;;;:23;7068:30;;6780:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:619::-;5015:6;5023;5031;5080:2;5068:9;5059:7;5055:23;5051:32;5048:119;;;5086:79;;:::i;:::-;5048:119;5206:1;5231:53;5276:7;5267:6;5256:9;5252:22;5231:53;:::i;:::-;5221:63;;5177:117;5333:2;5359:53;5404:7;5395:6;5384:9;5380:22;5359:53;:::i;:::-;5349:63;;5304:118;5461:2;5487:53;5532:7;5523:6;5512:9;5508:22;5487:53;:::i;:::-;5477:63;;5432:118;4938:619;;;;;:::o;5563:86::-;5598:7;5638:4;5631:5;5627:16;5616:27;;5563:86;;;:::o;5655:118::-;5726:22;5742:5;5726:22;:::i;:::-;5719:5;5716:33;5706:61;;5763:1;5760;5753:12;5706:61;5655:118;:::o;5779:135::-;5823:5;5861:6;5848:20;5839:29;;5877:31;5902:5;5877:31;:::i;:::-;5779:135;;;;:::o;5920:325::-;5977:6;6026:2;6014:9;6005:7;6001:23;5997:32;5994:119;;;6032:79;;:::i;:::-;5994:119;6152:1;6177:51;6220:7;6211:6;6200:9;6196:22;6177:51;:::i;:::-;6167:61;;6123:115;5920:325;;;;:::o;6251:329::-;6310:6;6359:2;6347:9;6338:7;6334:23;6330:32;6327:119;;;6365:79;;:::i;:::-;6327:119;6485:1;6510:53;6555:7;6546:6;6535:9;6531:22;6510:53;:::i;:::-;6500:63;;6456:117;6251:329;;;;:::o;6586:118::-;6673:24;6691:5;6673:24;:::i;:::-;6668:3;6661:37;6586:118;;:::o;6710:222::-;6803:4;6841:2;6830:9;6826:18;6818:26;;6854:71;6922:1;6911:9;6907:17;6898:6;6854:71;:::i;:::-;6710:222;;;;:::o;6938:116::-;7008:21;7023:5;7008:21;:::i;:::-;7001:5;6998:32;6988:60;;7044:1;7041;7034:12;6988:60;6938:116;:::o;7060:133::-;7103:5;7141:6;7128:20;7119:29;;7157:30;7181:5;7157:30;:::i;:::-;7060:133;;;;:::o;7199:468::-;7264:6;7272;7321:2;7309:9;7300:7;7296:23;7292:32;7289:119;;;7327:79;;:::i;:::-;7289:119;7447:1;7472:53;7517:7;7508:6;7497:9;7493:22;7472:53;:::i;:::-;7462:63;;7418:117;7574:2;7600:50;7642:7;7633:6;7622:9;7618:22;7600:50;:::i;:::-;7590:60;;7545:115;7199:468;;;;;:::o;7673:117::-;7782:1;7779;7772:12;7796:117;7905:1;7902;7895:12;7919:180;7967:77;7964:1;7957:88;8064:4;8061:1;8054:15;8088:4;8085:1;8078:15;8105:281;8188:27;8210:4;8188:27;:::i;:::-;8180:6;8176:40;8318:6;8306:10;8303:22;8282:18;8270:10;8267:34;8264:62;8261:88;;;8329:18;;:::i;:::-;8261:88;8369:10;8365:2;8358:22;8148:238;8105:281;;:::o;8392:129::-;8426:6;8453:20;;:::i;:::-;8443:30;;8482:33;8510:4;8502:6;8482:33;:::i;:::-;8392:129;;;:::o;8527:307::-;8588:4;8678:18;8670:6;8667:30;8664:56;;;8700:18;;:::i;:::-;8664:56;8738:29;8760:6;8738:29;:::i;:::-;8730:37;;8822:4;8816;8812:15;8804:23;;8527:307;;;:::o;8840:154::-;8924:6;8919:3;8914;8901:30;8986:1;8977:6;8972:3;8968:16;8961:27;8840:154;;;:::o;9000:410::-;9077:5;9102:65;9118:48;9159:6;9118:48;:::i;:::-;9102:65;:::i;:::-;9093:74;;9190:6;9183:5;9176:21;9228:4;9221:5;9217:16;9266:3;9257:6;9252:3;9248:16;9245:25;9242:112;;;9273:79;;:::i;:::-;9242:112;9363:41;9397:6;9392:3;9387;9363:41;:::i;:::-;9083:327;9000:410;;;;;:::o;9429:338::-;9484:5;9533:3;9526:4;9518:6;9514:17;9510:27;9500:122;;9541:79;;:::i;:::-;9500:122;9658:6;9645:20;9683:78;9757:3;9749:6;9742:4;9734:6;9730:17;9683:78;:::i;:::-;9674:87;;9490:277;9429:338;;;;:::o;9773:943::-;9868:6;9876;9884;9892;9941:3;9929:9;9920:7;9916:23;9912:33;9909:120;;;9948:79;;:::i;:::-;9909:120;10068:1;10093:53;10138:7;10129:6;10118:9;10114:22;10093:53;:::i;:::-;10083:63;;10039:117;10195:2;10221:53;10266:7;10257:6;10246:9;10242:22;10221:53;:::i;:::-;10211:63;;10166:118;10323:2;10349:53;10394:7;10385:6;10374:9;10370:22;10349:53;:::i;:::-;10339:63;;10294:118;10479:2;10468:9;10464:18;10451:32;10510:18;10502:6;10499:30;10496:117;;;10532:79;;:::i;:::-;10496:117;10637:62;10691:7;10682:6;10671:9;10667:22;10637:62;:::i;:::-;10627:72;;10422:287;9773:943;;;;;;;:::o;10722:474::-;10790:6;10798;10847:2;10835:9;10826:7;10822:23;10818:32;10815:119;;;10853:79;;:::i;:::-;10815:119;10973:1;10998:53;11043:7;11034:6;11023:9;11019:22;10998:53;:::i;:::-;10988:63;;10944:117;11100:2;11126:53;11171:7;11162:6;11151:9;11147:22;11126:53;:::i;:::-;11116:63;;11071:118;10722:474;;;;;:::o;11202:180::-;11250:77;11247:1;11240:88;11347:4;11344:1;11337:15;11371:4;11368:1;11361:15;11388:320;11432:6;11469:1;11463:4;11459:12;11449:22;;11516:1;11510:4;11506:12;11537:18;11527:81;;11593:4;11585:6;11581:17;11571:27;;11527:81;11655:2;11647:6;11644:14;11624:18;11621:38;11618:84;;11674:18;;:::i;:::-;11618:84;11439:269;11388:320;;;:::o;11714:231::-;11854:34;11850:1;11842:6;11838:14;11831:58;11923:14;11918:2;11910:6;11906:15;11899:39;11714:231;:::o;11951:366::-;12093:3;12114:67;12178:2;12173:3;12114:67;:::i;:::-;12107:74;;12190:93;12279:3;12190:93;:::i;:::-;12308:2;12303:3;12299:12;12292:19;;11951:366;;;:::o;12323:419::-;12489:4;12527:2;12516:9;12512:18;12504:26;;12576:9;12570:4;12566:20;12562:1;12551:9;12547:17;12540:47;12604:131;12730:4;12604:131;:::i;:::-;12596:139;;12323:419;;;:::o;12748:220::-;12888:34;12884:1;12876:6;12872:14;12865:58;12957:3;12952:2;12944:6;12940:15;12933:28;12748:220;:::o;12974:366::-;13116:3;13137:67;13201:2;13196:3;13137:67;:::i;:::-;13130:74;;13213:93;13302:3;13213:93;:::i;:::-;13331:2;13326:3;13322:12;13315:19;;12974:366;;;:::o;13346:419::-;13512:4;13550:2;13539:9;13535:18;13527:26;;13599:9;13593:4;13589:20;13585:1;13574:9;13570:17;13563:47;13627:131;13753:4;13627:131;:::i;:::-;13619:139;;13346:419;;;:::o;13771:243::-;13911:34;13907:1;13899:6;13895:14;13888:58;13980:26;13975:2;13967:6;13963:15;13956:51;13771:243;:::o;14020:366::-;14162:3;14183:67;14247:2;14242:3;14183:67;:::i;:::-;14176:74;;14259:93;14348:3;14259:93;:::i;:::-;14377:2;14372:3;14368:12;14361:19;;14020:366;;;:::o;14392:419::-;14558:4;14596:2;14585:9;14581:18;14573:26;;14645:9;14639:4;14635:20;14631:1;14620:9;14616:17;14609:47;14673:131;14799:4;14673:131;:::i;:::-;14665:139;;14392:419;;;:::o;14817:236::-;14957:34;14953:1;14945:6;14941:14;14934:58;15026:19;15021:2;15013:6;15009:15;15002:44;14817:236;:::o;15059:366::-;15201:3;15222:67;15286:2;15281:3;15222:67;:::i;:::-;15215:74;;15298:93;15387:3;15298:93;:::i;:::-;15416:2;15411:3;15407:12;15400:19;;15059:366;;;:::o;15431:419::-;15597:4;15635:2;15624:9;15620:18;15612:26;;15684:9;15678:4;15674:20;15670:1;15659:9;15655:17;15648:47;15712:131;15838:4;15712:131;:::i;:::-;15704:139;;15431:419;;;:::o;15856:182::-;15996:34;15992:1;15984:6;15980:14;15973:58;15856:182;:::o;16044:366::-;16186:3;16207:67;16271:2;16266:3;16207:67;:::i;:::-;16200:74;;16283:93;16372:3;16283:93;:::i;:::-;16401:2;16396:3;16392:12;16385:19;;16044:366;;;:::o;16416:419::-;16582:4;16620:2;16609:9;16605:18;16597:26;;16669:9;16663:4;16659:20;16655:1;16644:9;16640:17;16633:47;16697:131;16823:4;16697:131;:::i;:::-;16689:139;;16416:419;;;:::o;16841:147::-;16942:11;16979:3;16964:18;;16841:147;;;;:::o;16994:114::-;;:::o;17114:398::-;17273:3;17294:83;17375:1;17370:3;17294:83;:::i;:::-;17287:90;;17386:93;17475:3;17386:93;:::i;:::-;17504:1;17499:3;17495:11;17488:18;;17114:398;;;:::o;17518:379::-;17702:3;17724:147;17867:3;17724:147;:::i;:::-;17717:154;;17888:3;17881:10;;17518:379;;;:::o;17903:174::-;18043:26;18039:1;18031:6;18027:14;18020:50;17903:174;:::o;18083:366::-;18225:3;18246:67;18310:2;18305:3;18246:67;:::i;:::-;18239:74;;18322:93;18411:3;18322:93;:::i;:::-;18440:2;18435:3;18431:12;18424:19;;18083:366;;;:::o;18455:419::-;18621:4;18659:2;18648:9;18644:18;18636:26;;18708:9;18702:4;18698:20;18694:1;18683:9;18679:17;18672:47;18736:131;18862:4;18736:131;:::i;:::-;18728:139;;18455:419;;;:::o;18880:228::-;19020:34;19016:1;19008:6;19004:14;18997:58;19089:11;19084:2;19076:6;19072:15;19065:36;18880:228;:::o;19114:366::-;19256:3;19277:67;19341:2;19336:3;19277:67;:::i;:::-;19270:74;;19353:93;19442:3;19353:93;:::i;:::-;19471:2;19466:3;19462:12;19455:19;;19114:366;;;:::o;19486:419::-;19652:4;19690:2;19679:9;19675:18;19667:26;;19739:9;19733:4;19729:20;19725:1;19714:9;19710:17;19703:47;19767:131;19893:4;19767:131;:::i;:::-;19759:139;;19486:419;;;:::o;19911:180::-;19959:77;19956:1;19949:88;20056:4;20053:1;20046:15;20080:4;20077:1;20070:15;20097:305;20137:3;20156:20;20174:1;20156:20;:::i;:::-;20151:25;;20190:20;20208:1;20190:20;:::i;:::-;20185:25;;20344:1;20276:66;20272:74;20269:1;20266:81;20263:107;;;20350:18;;:::i;:::-;20263:107;20394:1;20391;20387:9;20380:16;;20097:305;;;;:::o;20408:174::-;20548:26;20544:1;20536:6;20532:14;20525:50;20408:174;:::o;20588:366::-;20730:3;20751:67;20815:2;20810:3;20751:67;:::i;:::-;20744:74;;20827:93;20916:3;20827:93;:::i;:::-;20945:2;20940:3;20936:12;20929:19;;20588:366;;;:::o;20960:419::-;21126:4;21164:2;21153:9;21149:18;21141:26;;21213:9;21207:4;21203:20;21199:1;21188:9;21184:17;21177:47;21241:131;21367:4;21241:131;:::i;:::-;21233:139;;20960:419;;;:::o;21385:171::-;21525:23;21521:1;21513:6;21509:14;21502:47;21385:171;:::o;21562:366::-;21704:3;21725:67;21789:2;21784:3;21725:67;:::i;:::-;21718:74;;21801:93;21890:3;21801:93;:::i;:::-;21919:2;21914:3;21910:12;21903:19;;21562:366;;;:::o;21934:419::-;22100:4;22138:2;22127:9;22123:18;22115:26;;22187:9;22181:4;22177:20;22173:1;22162:9;22158:17;22151:47;22215:131;22341:4;22215:131;:::i;:::-;22207:139;;21934:419;;;:::o;22359:348::-;22399:7;22422:20;22440:1;22422:20;:::i;:::-;22417:25;;22456:20;22474:1;22456:20;:::i;:::-;22451:25;;22644:1;22576:66;22572:74;22569:1;22566:81;22561:1;22554:9;22547:17;22543:105;22540:131;;;22651:18;;:::i;:::-;22540:131;22699:1;22696;22692:9;22681:20;;22359:348;;;;:::o;22713:171::-;22853:23;22849:1;22841:6;22837:14;22830:47;22713:171;:::o;22890:366::-;23032:3;23053:67;23117:2;23112:3;23053:67;:::i;:::-;23046:74;;23129:93;23218:3;23129:93;:::i;:::-;23247:2;23242:3;23238:12;23231:19;;22890:366;;;:::o;23262:419::-;23428:4;23466:2;23455:9;23451:18;23443:26;;23515:9;23509:4;23505:20;23501:1;23490:9;23486:17;23479:47;23543:131;23669:4;23543:131;:::i;:::-;23535:139;;23262:419;;;:::o;23687:233::-;23726:3;23749:24;23767:5;23749:24;:::i;:::-;23740:33;;23795:66;23788:5;23785:77;23782:103;;23865:18;;:::i;:::-;23782:103;23912:1;23905:5;23901:13;23894:20;;23687:233;;;:::o;23926:229::-;24066:34;24062:1;24054:6;24050:14;24043:58;24135:12;24130:2;24122:6;24118:15;24111:37;23926:229;:::o;24161:366::-;24303:3;24324:67;24388:2;24383:3;24324:67;:::i;:::-;24317:74;;24400:93;24489:3;24400:93;:::i;:::-;24518:2;24513:3;24509:12;24502:19;;24161:366;;;:::o;24533:419::-;24699:4;24737:2;24726:9;24722:18;24714:26;;24786:9;24780:4;24776:20;24772:1;24761:9;24757:17;24750:47;24814:131;24940:4;24814:131;:::i;:::-;24806:139;;24533:419;;;:::o;24958:234::-;25098:34;25094:1;25086:6;25082:14;25075:58;25167:17;25162:2;25154:6;25150:15;25143:42;24958:234;:::o;25198:366::-;25340:3;25361:67;25425:2;25420:3;25361:67;:::i;:::-;25354:74;;25437:93;25526:3;25437:93;:::i;:::-;25555:2;25550:3;25546:12;25539:19;;25198:366;;;:::o;25570:419::-;25736:4;25774:2;25763:9;25759:18;25751:26;;25823:9;25817:4;25813:20;25809:1;25798:9;25794:17;25787:47;25851:131;25977:4;25851:131;:::i;:::-;25843:139;;25570:419;;;:::o;25995:148::-;26097:11;26134:3;26119:18;;25995:148;;;;:::o;26149:377::-;26255:3;26283:39;26316:5;26283:39;:::i;:::-;26338:89;26420:6;26415:3;26338:89;:::i;:::-;26331:96;;26436:52;26481:6;26476:3;26469:4;26462:5;26458:16;26436:52;:::i;:::-;26513:6;26508:3;26504:16;26497:23;;26259:267;26149:377;;;;:::o;26532:435::-;26712:3;26734:95;26825:3;26816:6;26734:95;:::i;:::-;26727:102;;26846:95;26937:3;26928:6;26846:95;:::i;:::-;26839:102;;26958:3;26951:10;;26532:435;;;;;:::o;26973:225::-;27113:34;27109:1;27101:6;27097:14;27090:58;27182:8;27177:2;27169:6;27165:15;27158:33;26973:225;:::o;27204:366::-;27346:3;27367:67;27431:2;27426:3;27367:67;:::i;:::-;27360:74;;27443:93;27532:3;27443:93;:::i;:::-;27561:2;27556:3;27552:12;27545:19;;27204:366;;;:::o;27576:419::-;27742:4;27780:2;27769:9;27765:18;27757:26;;27829:9;27823:4;27819:20;27815:1;27804:9;27800:17;27793:47;27857:131;27983:4;27857:131;:::i;:::-;27849:139;;27576:419;;;:::o;28001:231::-;28141:34;28137:1;28129:6;28125:14;28118:58;28210:14;28205:2;28197:6;28193:15;28186:39;28001:231;:::o;28238:366::-;28380:3;28401:67;28465:2;28460:3;28401:67;:::i;:::-;28394:74;;28477:93;28566:3;28477:93;:::i;:::-;28595:2;28590:3;28586:12;28579:19;;28238:366;;;:::o;28610:419::-;28776:4;28814:2;28803:9;28799:18;28791:26;;28863:9;28857:4;28853:20;28849:1;28838:9;28834:17;28827:47;28891:131;29017:4;28891:131;:::i;:::-;28883:139;;28610:419;;;:::o;29035:224::-;29175:34;29171:1;29163:6;29159:14;29152:58;29244:7;29239:2;29231:6;29227:15;29220:32;29035:224;:::o;29265:366::-;29407:3;29428:67;29492:2;29487:3;29428:67;:::i;:::-;29421:74;;29504:93;29593:3;29504:93;:::i;:::-;29622:2;29617:3;29613:12;29606:19;;29265:366;;;:::o;29637:419::-;29803:4;29841:2;29830:9;29826:18;29818:26;;29890:9;29884:4;29880:20;29876:1;29865:9;29861:17;29854:47;29918:131;30044:4;29918:131;:::i;:::-;29910:139;;29637:419;;;:::o;30062:223::-;30202:34;30198:1;30190:6;30186:14;30179:58;30271:6;30266:2;30258:6;30254:15;30247:31;30062:223;:::o;30291:366::-;30433:3;30454:67;30518:2;30513:3;30454:67;:::i;:::-;30447:74;;30530:93;30619:3;30530:93;:::i;:::-;30648:2;30643:3;30639:12;30632:19;;30291:366;;;:::o;30663:419::-;30829:4;30867:2;30856:9;30852:18;30844:26;;30916:9;30910:4;30906:20;30902:1;30891:9;30887:17;30880:47;30944:131;31070:4;30944:131;:::i;:::-;30936:139;;30663:419;;;:::o;31088:191::-;31128:4;31148:20;31166:1;31148:20;:::i;:::-;31143:25;;31182:20;31200:1;31182:20;:::i;:::-;31177:25;;31221:1;31218;31215:8;31212:34;;;31226:18;;:::i;:::-;31212:34;31271:1;31268;31264:9;31256:17;;31088:191;;;;:::o;31285:237::-;31425:34;31421:1;31413:6;31409:14;31402:58;31494:20;31489:2;31481:6;31477:15;31470:45;31285:237;:::o;31528:366::-;31670:3;31691:67;31755:2;31750:3;31691:67;:::i;:::-;31684:74;;31767:93;31856:3;31767:93;:::i;:::-;31885:2;31880:3;31876:12;31869:19;;31528:366;;;:::o;31900:419::-;32066:4;32104:2;32093:9;32089:18;32081:26;;32153:9;32147:4;32143:20;32139:1;32128:9;32124:17;32117:47;32181:131;32307:4;32181:131;:::i;:::-;32173:139;;31900:419;;;:::o;32325:175::-;32465:27;32461:1;32453:6;32449:14;32442:51;32325:175;:::o;32506:366::-;32648:3;32669:67;32733:2;32728:3;32669:67;:::i;:::-;32662:74;;32745:93;32834:3;32745:93;:::i;:::-;32863:2;32858:3;32854:12;32847:19;;32506:366;;;:::o;32878:419::-;33044:4;33082:2;33071:9;33067:18;33059:26;;33131:9;33125:4;33121:20;33117:1;33106:9;33102:17;33095:47;33159:131;33285:4;33159:131;:::i;:::-;33151:139;;32878:419;;;:::o;33303:180::-;33351:77;33348:1;33341:88;33448:4;33445:1;33438:15;33472:4;33469:1;33462:15;33489:185;33529:1;33546:20;33564:1;33546:20;:::i;:::-;33541:25;;33580:20;33598:1;33580:20;:::i;:::-;33575:25;;33619:1;33609:35;;33624:18;;:::i;:::-;33609:35;33666:1;33663;33659:9;33654:14;;33489:185;;;;:::o;33680:176::-;33712:1;33729:20;33747:1;33729:20;:::i;:::-;33724:25;;33763:20;33781:1;33763:20;:::i;:::-;33758:25;;33802:1;33792:35;;33807:18;;:::i;:::-;33792:35;33848:1;33845;33841:9;33836:14;;33680:176;;;;:::o;33862:180::-;33910:77;33907:1;33900:88;34007:4;34004:1;33997:15;34031:4;34028:1;34021:15;34048:182;34188:34;34184:1;34176:6;34172:14;34165:58;34048:182;:::o;34236:366::-;34378:3;34399:67;34463:2;34458:3;34399:67;:::i;:::-;34392:74;;34475:93;34564:3;34475:93;:::i;:::-;34593:2;34588:3;34584:12;34577:19;;34236:366;;;:::o;34608:419::-;34774:4;34812:2;34801:9;34797:18;34789:26;;34861:9;34855:4;34851:20;34847:1;34836:9;34832:17;34825:47;34889:131;35015:4;34889:131;:::i;:::-;34881:139;;34608:419;;;:::o;35033:178::-;35173:30;35169:1;35161:6;35157:14;35150:54;35033:178;:::o;35217:366::-;35359:3;35380:67;35444:2;35439:3;35380:67;:::i;:::-;35373:74;;35456:93;35545:3;35456:93;:::i;:::-;35574:2;35569:3;35565:12;35558:19;;35217:366;;;:::o;35589:419::-;35755:4;35793:2;35782:9;35778:18;35770:26;;35842:9;35836:4;35832:20;35828:1;35817:9;35813:17;35806:47;35870:131;35996:4;35870:131;:::i;:::-;35862:139;;35589:419;;;:::o;36014:98::-;36065:6;36099:5;36093:12;36083:22;;36014:98;;;:::o;36118:168::-;36201:11;36235:6;36230:3;36223:19;36275:4;36270:3;36266:14;36251:29;;36118:168;;;;:::o;36292:360::-;36378:3;36406:38;36438:5;36406:38;:::i;:::-;36460:70;36523:6;36518:3;36460:70;:::i;:::-;36453:77;;36539:52;36584:6;36579:3;36572:4;36565:5;36561:16;36539:52;:::i;:::-;36616:29;36638:6;36616:29;:::i;:::-;36611:3;36607:39;36600:46;;36382:270;36292:360;;;;:::o;36658:640::-;36853:4;36891:3;36880:9;36876:19;36868:27;;36905:71;36973:1;36962:9;36958:17;36949:6;36905:71;:::i;:::-;36986:72;37054:2;37043:9;37039:18;37030:6;36986:72;:::i;:::-;37068;37136:2;37125:9;37121:18;37112:6;37068:72;:::i;:::-;37187:9;37181:4;37177:20;37172:2;37161:9;37157:18;37150:48;37215:76;37286:4;37277:6;37215:76;:::i;:::-;37207:84;;36658:640;;;;;;;:::o;37304:141::-;37360:5;37391:6;37385:13;37376:22;;37407:32;37433:5;37407:32;:::i;:::-;37304:141;;;;:::o;37451:349::-;37520:6;37569:2;37557:9;37548:7;37544:23;37540:32;37537:119;;;37575:79;;:::i;:::-;37537:119;37695:1;37720:63;37775:7;37766:6;37755:9;37751:22;37720:63;:::i;:::-;37710:73;;37666:127;37451:349;;;;:::o

Swarm Source

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