ETH Price: $2,967.12 (+1.22%)
Gas: 1 Gwei

Token

TheSuperstarFam (TSF)
 

Overview

Max Total Supply

677 TSF

Holders

246

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
danjam.eth
Balance
1 TSF
0x980bbdaf8db489a8f501c55360040e44574953a2
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:
TheSuperstarFam

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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


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


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


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


pragma solidity ^0.8.0;

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


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


pragma solidity ^0.8.0;

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

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

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


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


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


pragma solidity ^0.8.0;

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

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


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


pragma solidity ^0.8.0;

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

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

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

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

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


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


pragma solidity ^0.8.0;

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


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


pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


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


pragma solidity ^0.8.0;

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

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

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


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


pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File contracts/tsf.sol

// contracts/tsf.sol
pragma solidity ^0.8.0;


contract TheSuperstarFam is ERC721Enumerable, Ownable {

    // private variables and constants
    string private baseURI;
    string private _contractURI;

    // public variables and constants
    bool public saleIsActive = false;
    bool public presaleIsActive = true;
    bool public claimGiftActive = false;
    uint256 constant public TOTAL_SUPPLY = 10102;
    uint256 public maxPublicMintPerTx = 20;
    uint256 public price = 0.08 ether;
    string public provenance = '';

    struct List {
      uint hasMinted;
      uint allotted;
    }
    mapping(address => List) public viplist;

    mapping(address => List) public giftlist;

    event Mint(address owner, uint qty);
    event Gift(address to, uint qty);
    event Reserve(address to, uint qty);
    event Withdraw(uint amount);

    // constructor function
    constructor() ERC721("TheSuperstarFam", "TSF") {
    }

    // reserve superstars
    function reserveSuperstars(address addr, uint256 tokenCount) public onlyOwner {
      uint supply = totalSupply();
      require((supply + tokenCount) <= TOTAL_SUPPLY, "Exceeds max supply");
      uint i;
      for (i = 1; i <= tokenCount; i++) {
        _safeMint(addr, supply + i);
      }
      emit Reserve(addr, tokenCount);
    }

    // presale add to viplist
    // presale remove from viplist
    function updateAddressesInViplist(address[] calldata addresses, uint[] calldata allotted) onlyOwner public returns(bool success) {
      for (uint256 i = 0; i < addresses.length; i++) {
        viplist[addresses[i]].allotted = allotted[i];
      }
      success = true;
    }

    function remainingViplistedCount(address addr) public view returns (uint remainingViplisted) {
      List memory record;
      record = viplist[addr];
      if(record.allotted > record.hasMinted) {
        return (record.allotted - record.hasMinted);
      } else {
        return 0;
      }
    }

    // add to giftlist
    // remove from giftlist
    function updateAddressesInGiftlist(address[] calldata addresses, uint[] calldata allotted) onlyOwner public returns(bool success) {
      for (uint256 i = 0; i < addresses.length; i++) {
        giftlist[addresses[i]].allotted = allotted[i];
      }
      success = true;
    }

    function remainingGiftlistCount(address addr) public view returns (uint remainingGifts) {
      List memory record;
      record = giftlist[addr];
      if(record.allotted > record.hasMinted) {
        return (record.allotted - record.hasMinted);
      } else {
        return 0;
      }
    }

    // claim superstars/gifts
    function claimSuperstarGifts(uint256 tokenCount) public {
      require(claimGiftActive, "Gift claiming is not enabled");
      uint supply = totalSupply();
      require((supply + tokenCount) <= TOTAL_SUPPLY, "Exceeds max supply");
      uint _remainingGiftlistCount = remainingGiftlistCount(msg.sender);
      require(_remainingGiftlistCount > 0, "No gifts won OR you have already claimed");
      require(tokenCount <= _remainingGiftlistCount, "Exceeds max allotted gifts");
      giftlist[msg.sender].hasMinted = giftlist[msg.sender].hasMinted + tokenCount;
      uint i;
      for (i = 1; i <= tokenCount; i++) {
        _safeMint(msg.sender, supply + i);
      }
      emit Gift(msg.sender, tokenCount);
    }

    // publicsale mint superstars
    // presale mint superstars
    function mintSuperstar(uint256 tokenCount) public payable {
      require(saleIsActive, "Sale must be active to mint");
      uint256 supply = totalSupply();
      require((supply + tokenCount) <= TOTAL_SUPPLY, "Exceeds max supply");
      require((price * tokenCount) <= msg.value, "ETH value isn't correct");
      if(presaleIsActive) {
        uint _remainingViplistedCount = remainingViplistedCount(msg.sender);
        require(_remainingViplistedCount > 0, "Not on VIP list OR you have already minted");
        require(tokenCount <= _remainingViplistedCount, "Exceeds max allotted count in VIP list");
        viplist[msg.sender].hasMinted = viplist[msg.sender].hasMinted + tokenCount;
      } else {
        require(tokenCount <= maxPublicMintPerTx, "Exceeds max count per transaction");
      }

      uint i;
      for (i = 1; i <= tokenCount; i++) {
        _safeMint(msg.sender, supply + i);
      }
      emit Mint(msg.sender, tokenCount);
    }

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

    // set baseURI
    function setBaseURI(string memory uri) external onlyOwner {
        baseURI = uri;
    }

    // set provenance
    function setProvenance(string calldata _provenance) external onlyOwner {
      provenance = _provenance;
    }

    //set Contract URI
    function setContractURI(string memory contractURI_)external onlyOwner {
      _contractURI = contractURI_;
    }

    //view Contract URI
    function contractURI() public view returns (string memory) {
      return _contractURI;
    }

    // set presale state
    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    // set publicsale state
    function flipPresaleState() public onlyOwner {
        presaleIsActive = !presaleIsActive;
    }

    // set publicsale state
    function flipClaimGiftState() public onlyOwner {
        claimGiftActive = !claimGiftActive;
    }

    // withdraw function
    function withdraw() public onlyOwner {
      uint balance = address(this).balance;
      payable(msg.sender).transfer(balance);
      emit Withdraw(balance);
    }

    function getTokensByOwner(address addr) public view returns(uint[] memory) {
      uint[] memory result = new uint[](balanceOf(addr));
      uint counter = 0;
      for (uint i = 1; i <= totalSupply(); i++) {
          if (ownerOf(i) == addr) {
              result[counter] = i;
              counter++;
          }
      }
      return result;
    }

}

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":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"qty","type":"uint256"}],"name":"Gift","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"qty","type":"uint256"}],"name":"Mint","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":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"qty","type":"uint256"}],"name":"Reserve","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimGiftActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenCount","type":"uint256"}],"name":"claimSuperstarGifts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipClaimGiftState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPresaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getTokensByOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"giftlist","outputs":[{"internalType":"uint256","name":"hasMinted","type":"uint256"},{"internalType":"uint256","name":"allotted","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPublicMintPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenCount","type":"uint256"}],"name":"mintSuperstar","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":"presaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"remainingGiftlistCount","outputs":[{"internalType":"uint256","name":"remainingGifts","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"remainingViplistedCount","outputs":[{"internalType":"uint256","name":"remainingViplisted","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"tokenCount","type":"uint256"}],"name":"reserveSuperstars","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"contractURI_","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenance","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"allotted","type":"uint256[]"}],"name":"updateAddressesInGiftlist","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"allotted","type":"uint256[]"}],"name":"updateAddressesInViplist","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"viplist","outputs":[{"internalType":"uint256","name":"hasMinted","type":"uint256"},{"internalType":"uint256","name":"allotted","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600d805462ffffff19166101001790556014600e5567011c37937e080000600f5560a06040819052600060808190526200003c916010916200012c565b503480156200004a57600080fd5b50604080518082018252600f81526e54686553757065727374617246616d60881b6020808301918252835180850190945260038452622a29a360e91b9084015281519192916200009d916000916200012c565b508051620000b39060019060208401906200012c565b505050620000d0620000ca620000d660201b60201c565b620000da565b6200020f565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200013a90620001d2565b90600052602060002090601f0160209004810192826200015e5760008555620001a9565b82601f106200017957805160ff1916838001178555620001a9565b82800160010185558215620001a9579182015b82811115620001a95782518255916020019190600101906200018c565b50620001b7929150620001bb565b5090565b5b80821115620001b75760008155600101620001bc565b600181811c90821680620001e757607f821691505b602082108114156200020957634e487b7160e01b600052602260045260246000fd5b50919050565b613416806200021f6000396000f3fe6080604052600436106102e75760003560e01c806370a0823111610184578063a9da1aea116100d6578063e8a3d4851161008a578063f2fde38b11610064578063f2fde38b1461082e578063f81227d41461084e578063ffe630b51461086357600080fd5b8063e8a3d485146107b6578063e985e9c5146107cb578063eb8d24441461081457600080fd5b8063bb9c00e2116100bb578063bb9c00e214610742578063c10ac44e14610776578063c87b56dd1461079657600080fd5b8063a9da1aea146106d9578063b88d4fde1461072257600080fd5b8063938e3d7b11610138578063a05f755411610112578063a05f755414610684578063a22cb465146106a4578063a2d9eea6146106c457600080fd5b8063938e3d7b1461063957806395d89b4114610659578063a035b1fe1461066e57600080fd5b8063756df4e211610169578063756df4e2146105e55780638da5cb5b14610605578063902d55a51461062357600080fd5b806370a08231146105b0578063715018a6146105d057600080fd5b806330f72cd41161023d57806342842e0e116101f1578063503ca789116101cb578063503ca7891461055a57806355f804b3146105705780636352211e1461059057600080fd5b806342842e0e146104fa57806347533b521461051a5780634f6ccce71461053a57600080fd5b80633bd87583116102225780633bd87583146104985780633ccfd60b146104b857806340398d67146104cd57600080fd5b806330f72cd41461046457806334918dfd1461048357600080fd5b80630f7309e81161029f57806323b872dd1161027957806323b872dd1461040457806327eca030146104245780632f745c591461044457600080fd5b80630f7309e8146103bd57806318160ddd146103d25780631c9da242146103f157600080fd5b806307fc82d3116102d057806307fc82d314610343578063081812fc14610363578063095ea7b31461039b57600080fd5b806301ffc9a7146102ec57806306fdde0314610321575b600080fd5b3480156102f857600080fd5b5061030c610307366004613056565b610883565b60405190151581526020015b60405180910390f35b34801561032d57600080fd5b506103366108df565b604051610318919061323f565b34801561034f57600080fd5b5061030c61035e366004612fea565b610971565b34801561036f57600080fd5b5061038361037e36600461314b565b610a5d565b6040516001600160a01b039091168152602001610318565b3480156103a757600080fd5b506103bb6103b6366004612fc0565b610b03565b005b3480156103c957600080fd5b50610336610c35565b3480156103de57600080fd5b506008545b604051908152602001610318565b6103bb6103ff36600461314b565b610cc3565b34801561041057600080fd5b506103bb61041f366004612ecc565b610ff9565b34801561043057600080fd5b506103bb61043f36600461314b565b611080565b34801561045057600080fd5b506103e361045f366004612fc0565b6112a8565b34801561047057600080fd5b50600d5461030c90610100900460ff1681565b34801561048f57600080fd5b506103bb611350565b3480156104a457600080fd5b506103e36104b3366004612e7e565b6113be565b3480156104c457600080fd5b506103bb611440565b3480156104d957600080fd5b506104ed6104e8366004612e7e565b611500565b60405161031891906131fb565b34801561050657600080fd5b506103bb610515366004612ecc565b6115c8565b34801561052657600080fd5b506103e3610535366004612e7e565b6115e3565b34801561054657600080fd5b506103e361055536600461314b565b61164f565b34801561056657600080fd5b506103e3600e5481565b34801561057c57600080fd5b506103bb61058b366004613102565b6116f3565b34801561059c57600080fd5b506103836105ab36600461314b565b611764565b3480156105bc57600080fd5b506103e36105cb366004612e7e565b6117ef565b3480156105dc57600080fd5b506103bb611889565b3480156105f157600080fd5b5061030c610600366004612fea565b6118ef565b34801561061157600080fd5b50600a546001600160a01b0316610383565b34801561062f57600080fd5b506103e361277681565b34801561064557600080fd5b506103bb610654366004613102565b6119ca565b34801561066557600080fd5b50610336611a37565b34801561067a57600080fd5b506103e3600f5481565b34801561069057600080fd5b50600d5461030c9062010000900460ff1681565b3480156106b057600080fd5b506103bb6106bf366004612f84565b611a46565b3480156106d057600080fd5b506103bb611b0b565b3480156106e557600080fd5b5061070d6106f4366004612e7e565b6011602052600090815260409020805460019091015482565b60408051928352602083019190915201610318565b34801561072e57600080fd5b506103bb61073d366004612f08565b611ba0565b34801561074e57600080fd5b5061070d61075d366004612e7e565b6012602052600090815260409020805460019091015482565b34801561078257600080fd5b506103bb610791366004612fc0565b611c2e565b3480156107a257600080fd5b506103366107b136600461314b565b611d59565b3480156107c257600080fd5b50610336611e41565b3480156107d757600080fd5b5061030c6107e6366004612e99565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561082057600080fd5b50600d5461030c9060ff1681565b34801561083a57600080fd5b506103bb610849366004612e7e565b611e50565b34801561085a57600080fd5b506103bb611f32565b34801561086f57600080fd5b506103bb61087e366004613090565b611fc6565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806108d957506108d98261202c565b92915050565b6060600080546108ee906132e0565b80601f016020809104026020016040519081016040528092919081815260200182805461091a906132e0565b80156109675780601f1061093c57610100808354040283529160200191610967565b820191906000526020600020905b81548152906001019060200180831161094a57829003601f168201915b5050505050905090565b600a546000906001600160a01b031633146109d35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b60005b84811015610a51578383828181106109f0576109f0613386565b9050602002013560126000888885818110610a0d57610a0d613386565b9050602002016020810190610a229190612e7e565b6001600160a01b0316815260208101919091526040016000206001015580610a4981613315565b9150506109d6565b50600195945050505050565b6000818152600260205260408120546001600160a01b0316610ae75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016109ca565b506000908152600460205260409020546001600160a01b031690565b6000610b0e82611764565b9050806001600160a01b0316836001600160a01b03161415610b985760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016109ca565b336001600160a01b0382161480610bb45750610bb481336107e6565b610c265760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109ca565b610c30838361210f565b505050565b60108054610c42906132e0565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6e906132e0565b8015610cbb5780601f10610c9057610100808354040283529160200191610cbb565b820191906000526020600020905b815481529060010190602001808311610c9e57829003601f168201915b505050505081565b600d5460ff16610d155760405162461bcd60e51b815260206004820152601b60248201527f53616c65206d7573742062652061637469766520746f206d696e74000000000060448201526064016109ca565b6000610d2060085490565b9050612776610d2f8383613252565b1115610d7d5760405162461bcd60e51b815260206004820152601260248201527f45786365656473206d617820737570706c79000000000000000000000000000060448201526064016109ca565b3482600f54610d8c919061327e565b1115610dda5760405162461bcd60e51b815260206004820152601760248201527f4554482076616c75652069736e277420636f727265637400000000000000000060448201526064016109ca565b600d54610100900460ff1615610f14576000610df5336113be565b905060008111610e6d5760405162461bcd60e51b815260206004820152602a60248201527f4e6f74206f6e20564950206c697374204f5220796f75206861766520616c726560448201527f616479206d696e7465640000000000000000000000000000000000000000000060648201526084016109ca565b80831115610ee35760405162461bcd60e51b815260206004820152602660248201527f45786365656473206d617820616c6c6f7474656420636f756e7420696e20564960448201527f50206c697374000000000000000000000000000000000000000000000000000060648201526084016109ca565b33600090815260116020526040902054610efe908490613252565b3360009081526011602052604090205550610f8c565b600e54821115610f8c5760405162461bcd60e51b815260206004820152602160248201527f45786365656473206d617820636f756e7420706572207472616e73616374696f60448201527f6e0000000000000000000000000000000000000000000000000000000000000060648201526084016109ca565b60015b828111610fbb57610fa933610fa48385613252565b61218a565b80610fb381613315565b915050610f8f565b60408051338152602081018590527f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885910160405180910390a1505050565b61100333826121a4565b6110755760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016109ca565b610c308383836122ac565b600d5462010000900460ff166110d85760405162461bcd60e51b815260206004820152601c60248201527f4769667420636c61696d696e67206973206e6f7420656e61626c65640000000060448201526064016109ca565b60006110e360085490565b90506127766110f28383613252565b11156111405760405162461bcd60e51b815260206004820152601260248201527f45786365656473206d617820737570706c79000000000000000000000000000060448201526064016109ca565b600061114b336115e3565b9050600081116111c35760405162461bcd60e51b815260206004820152602860248201527f4e6f20676966747320776f6e204f5220796f75206861766520616c726561647960448201527f20636c61696d656400000000000000000000000000000000000000000000000060648201526084016109ca565b808311156112135760405162461bcd60e51b815260206004820152601a60248201527f45786365656473206d617820616c6c6f7474656420676966747300000000000060448201526064016109ca565b3360009081526012602052604090205461122e908490613252565b3360009081526012602052604090205560015b8381116112685761125633610fa48386613252565b8061126081613315565b915050611241565b60408051338152602081018690527fef33e970549489dd2e75c841935709372f2926e3b90b56af4040186e9b83b3e491015b60405180910390a150505050565b60006112b3836117ef565b82106113275760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e647300000000000000000000000000000000000000000060648201526084016109ca565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b031633146113aa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b600d805460ff19811660ff90911615179055565b60006113dd604051806040016040528060008152602001600081525090565b506001600160a01b038216600090815260116020908152604091829020825180840190935280548084526001909101549183018290521015611431578051602082015161142a919061329d565b9392505050565b50600092915050565b50919050565b600a546001600160a01b0316331461149a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b6040514790339082156108fc029083906000818181858888f193505050501580156114c9573d6000803e3d6000fd5b506040518181527f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d9060200160405180910390a150565b6060600061150d836117ef565b67ffffffffffffffff8111156115255761152561339c565b60405190808252806020026020018201604052801561154e578160200160208202803683370190505b509050600060015b60085481116115bf57846001600160a01b031661157282611764565b6001600160a01b031614156115ad578083838151811061159457611594613386565b6020908102919091010152816115a981613315565b9250505b806115b781613315565b915050611556565b50909392505050565b610c3083838360405180602001604052806000815250611ba0565b6000611602604051806040016040528060008152602001600081525090565b506001600160a01b038216600090815260126020908152604091829020825180840190935280548084526001909101549183018290521015611431578051602082015161142a919061329d565b600061165a60085490565b82106116ce5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e6473000000000000000000000000000000000000000060648201526084016109ca565b600882815481106116e1576116e1613386565b90600052602060002001549050919050565b600a546001600160a01b0316331461174d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b805161176090600b906020840190612c93565b5050565b6000818152600260205260408120546001600160a01b0316806108d95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016109ca565b60006001600160a01b03821661186d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016109ca565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146118e35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b6118ed6000612491565b565b600a546000906001600160a01b0316331461194c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b60005b84811015610a515783838281811061196957611969613386565b905060200201356011600088888581811061198657611986613386565b905060200201602081019061199b9190612e7e565b6001600160a01b03168152602081019190915260400160002060010155806119c281613315565b91505061194f565b600a546001600160a01b03163314611a245760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b805161176090600c906020840190612c93565b6060600180546108ee906132e0565b6001600160a01b038216331415611a9f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109ca565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b03163314611b655760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff8116620100009182900460ff1615909102179055565b611baa33836121a4565b611c1c5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016109ca565b611c28848484846124f0565b50505050565b600a546001600160a01b03163314611c885760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b6000611c9360085490565b9050612776611ca28383613252565b1115611cf05760405162461bcd60e51b815260206004820152601260248201527f45786365656473206d617820737570706c79000000000000000000000000000060448201526064016109ca565b60015b828111611d1a57611d0884610fa48385613252565b80611d1281613315565b915050611cf3565b604080516001600160a01b0386168152602081018590527f61c8427ca14788cf50e420fe4b1e41be1ab20530a3f48bb547315dc91e62b9c1910161129a565b6000818152600260205260409020546060906001600160a01b0316611de65760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e000000000000000000000000000000000060648201526084016109ca565b6000611df0612579565b90506000815111611e10576040518060200160405280600081525061142a565b80611e1a84612588565b604051602001611e2b929190613190565b6040516020818303038152906040529392505050565b6060600c80546108ee906132e0565b600a546001600160a01b03163314611eaa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b6001600160a01b038116611f265760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109ca565b611f2f81612491565b50565b600a546001600160a01b03163314611f8c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff81166101009182900460ff1615909102179055565b600a546001600160a01b031633146120205760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b610c3060108383612d17565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806120bf57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806108d957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146108d9565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038416908117909155819061215182611764565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6117608282604051806020016040528060008152506126ba565b6000818152600260205260408120546001600160a01b031661222e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016109ca565b600061223983611764565b9050806001600160a01b0316846001600160a01b031614806122745750836001600160a01b031661226984610a5d565b6001600160a01b0316145b806122a457506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166122bf82611764565b6001600160a01b03161461233b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e000000000000000000000000000000000000000000000060648201526084016109ca565b6001600160a01b0382166123b65760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016109ca565b6123c1838383612743565b6123cc60008261210f565b6001600160a01b03831660009081526003602052604081208054600192906123f590849061329d565b90915550506001600160a01b0382166000908152600360205260408120805460019290612423908490613252565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6124fb8484846122ac565b612507848484846127fb565b611c285760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109ca565b6060600b80546108ee906132e0565b6060816125c857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156125f257806125dc81613315565b91506125eb9050600a8361326a565b91506125cc565b60008167ffffffffffffffff81111561260d5761260d61339c565b6040519080825280601f01601f191660200182016040528015612637576020820181803683370190505b5090505b84156122a45761264c60018361329d565b9150612659600a86613330565b612664906030613252565b60f81b81838151811061267957612679613386565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506126b3600a8661326a565b945061263b565b6126c483836129a8565b6126d160008484846127fb565b610c305760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109ca565b6001600160a01b03831661279e5761279981600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6127c1565b816001600160a01b0316836001600160a01b0316146127c1576127c18382612b03565b6001600160a01b0382166127d857610c3081612ba0565b826001600160a01b0316826001600160a01b031614610c3057610c308282612c4f565b60006001600160a01b0384163b1561299d576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a02906128589033908990889088906004016131bf565b602060405180830381600087803b15801561287257600080fd5b505af19250505080156128a2575060408051601f3d908101601f1916820190925261289f91810190613073565b60015b612952573d8080156128d0576040519150601f19603f3d011682016040523d82523d6000602084013e6128d5565b606091505b50805161294a5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109ca565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506122a4565b506001949350505050565b6001600160a01b0382166129fe5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109ca565b6000818152600260205260409020546001600160a01b031615612a635760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109ca565b612a6f60008383612743565b6001600160a01b0382166000908152600360205260408120805460019290612a98908490613252565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001612b10846117ef565b612b1a919061329d565b600083815260076020526040902054909150808214612b6d576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612bb29060019061329d565b60008381526009602052604081205460088054939450909284908110612bda57612bda613386565b906000526020600020015490508060088381548110612bfb57612bfb613386565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612c3357612c33613370565b6001900381819060005260206000200160009055905550505050565b6000612c5a836117ef565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612c9f906132e0565b90600052602060002090601f016020900481019282612cc15760008555612d07565b82601f10612cda57805160ff1916838001178555612d07565b82800160010185558215612d07579182015b82811115612d07578251825591602001919060010190612cec565b50612d13929150612d8b565b5090565b828054612d23906132e0565b90600052602060002090601f016020900481019282612d455760008555612d07565b82601f10612d5e5782800160ff19823516178555612d07565b82800160010185558215612d07579182015b82811115612d07578235825591602001919060010190612d70565b5b80821115612d135760008155600101612d8c565b600067ffffffffffffffff80841115612dbb57612dbb61339c565b604051601f8501601f19908116603f01168101908282118183101715612de357612de361339c565b81604052809350858152868686011115612dfc57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612e2d57600080fd5b919050565b60008083601f840112612e4457600080fd5b50813567ffffffffffffffff811115612e5c57600080fd5b6020830191508360208260051b8501011115612e7757600080fd5b9250929050565b600060208284031215612e9057600080fd5b61142a82612e16565b60008060408385031215612eac57600080fd5b612eb583612e16565b9150612ec360208401612e16565b90509250929050565b600080600060608486031215612ee157600080fd5b612eea84612e16565b9250612ef860208501612e16565b9150604084013590509250925092565b60008060008060808587031215612f1e57600080fd5b612f2785612e16565b9350612f3560208601612e16565b925060408501359150606085013567ffffffffffffffff811115612f5857600080fd5b8501601f81018713612f6957600080fd5b612f7887823560208401612da0565b91505092959194509250565b60008060408385031215612f9757600080fd5b612fa083612e16565b915060208301358015158114612fb557600080fd5b809150509250929050565b60008060408385031215612fd357600080fd5b612fdc83612e16565b946020939093013593505050565b6000806000806040858703121561300057600080fd5b843567ffffffffffffffff8082111561301857600080fd5b61302488838901612e32565b9096509450602087013591508082111561303d57600080fd5b5061304a87828801612e32565b95989497509550505050565b60006020828403121561306857600080fd5b813561142a816133b2565b60006020828403121561308557600080fd5b815161142a816133b2565b600080602083850312156130a357600080fd5b823567ffffffffffffffff808211156130bb57600080fd5b818501915085601f8301126130cf57600080fd5b8135818111156130de57600080fd5b8660208285010111156130f057600080fd5b60209290920196919550909350505050565b60006020828403121561311457600080fd5b813567ffffffffffffffff81111561312b57600080fd5b8201601f8101841361313c57600080fd5b6122a484823560208401612da0565b60006020828403121561315d57600080fd5b5035919050565b6000815180845261317c8160208601602086016132b4565b601f01601f19169290920160200192915050565b600083516131a28184602088016132b4565b8351908301906131b68183602088016132b4565b01949350505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526131f16080830184613164565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561323357835183529284019291840191600101613217565b50909695505050505050565b60208152600061142a6020830184613164565b6000821982111561326557613265613344565b500190565b6000826132795761327961335a565b500490565b600081600019048311821515161561329857613298613344565b500290565b6000828210156132af576132af613344565b500390565b60005b838110156132cf5781810151838201526020016132b7565b83811115611c285750506000910152565b600181811c908216806132f457607f821691505b6020821081141561143a57634e487b7160e01b600052602260045260246000fd5b600060001982141561332957613329613344565b5060010190565b60008261333f5761333f61335a565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611f2f57600080fdfea2646970667358221220bb8ef364ccb408a60d12983945392de0da45e65bb23827c92f4fcf483b83cb8564736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102e75760003560e01c806370a0823111610184578063a9da1aea116100d6578063e8a3d4851161008a578063f2fde38b11610064578063f2fde38b1461082e578063f81227d41461084e578063ffe630b51461086357600080fd5b8063e8a3d485146107b6578063e985e9c5146107cb578063eb8d24441461081457600080fd5b8063bb9c00e2116100bb578063bb9c00e214610742578063c10ac44e14610776578063c87b56dd1461079657600080fd5b8063a9da1aea146106d9578063b88d4fde1461072257600080fd5b8063938e3d7b11610138578063a05f755411610112578063a05f755414610684578063a22cb465146106a4578063a2d9eea6146106c457600080fd5b8063938e3d7b1461063957806395d89b4114610659578063a035b1fe1461066e57600080fd5b8063756df4e211610169578063756df4e2146105e55780638da5cb5b14610605578063902d55a51461062357600080fd5b806370a08231146105b0578063715018a6146105d057600080fd5b806330f72cd41161023d57806342842e0e116101f1578063503ca789116101cb578063503ca7891461055a57806355f804b3146105705780636352211e1461059057600080fd5b806342842e0e146104fa57806347533b521461051a5780634f6ccce71461053a57600080fd5b80633bd87583116102225780633bd87583146104985780633ccfd60b146104b857806340398d67146104cd57600080fd5b806330f72cd41461046457806334918dfd1461048357600080fd5b80630f7309e81161029f57806323b872dd1161027957806323b872dd1461040457806327eca030146104245780632f745c591461044457600080fd5b80630f7309e8146103bd57806318160ddd146103d25780631c9da242146103f157600080fd5b806307fc82d3116102d057806307fc82d314610343578063081812fc14610363578063095ea7b31461039b57600080fd5b806301ffc9a7146102ec57806306fdde0314610321575b600080fd5b3480156102f857600080fd5b5061030c610307366004613056565b610883565b60405190151581526020015b60405180910390f35b34801561032d57600080fd5b506103366108df565b604051610318919061323f565b34801561034f57600080fd5b5061030c61035e366004612fea565b610971565b34801561036f57600080fd5b5061038361037e36600461314b565b610a5d565b6040516001600160a01b039091168152602001610318565b3480156103a757600080fd5b506103bb6103b6366004612fc0565b610b03565b005b3480156103c957600080fd5b50610336610c35565b3480156103de57600080fd5b506008545b604051908152602001610318565b6103bb6103ff36600461314b565b610cc3565b34801561041057600080fd5b506103bb61041f366004612ecc565b610ff9565b34801561043057600080fd5b506103bb61043f36600461314b565b611080565b34801561045057600080fd5b506103e361045f366004612fc0565b6112a8565b34801561047057600080fd5b50600d5461030c90610100900460ff1681565b34801561048f57600080fd5b506103bb611350565b3480156104a457600080fd5b506103e36104b3366004612e7e565b6113be565b3480156104c457600080fd5b506103bb611440565b3480156104d957600080fd5b506104ed6104e8366004612e7e565b611500565b60405161031891906131fb565b34801561050657600080fd5b506103bb610515366004612ecc565b6115c8565b34801561052657600080fd5b506103e3610535366004612e7e565b6115e3565b34801561054657600080fd5b506103e361055536600461314b565b61164f565b34801561056657600080fd5b506103e3600e5481565b34801561057c57600080fd5b506103bb61058b366004613102565b6116f3565b34801561059c57600080fd5b506103836105ab36600461314b565b611764565b3480156105bc57600080fd5b506103e36105cb366004612e7e565b6117ef565b3480156105dc57600080fd5b506103bb611889565b3480156105f157600080fd5b5061030c610600366004612fea565b6118ef565b34801561061157600080fd5b50600a546001600160a01b0316610383565b34801561062f57600080fd5b506103e361277681565b34801561064557600080fd5b506103bb610654366004613102565b6119ca565b34801561066557600080fd5b50610336611a37565b34801561067a57600080fd5b506103e3600f5481565b34801561069057600080fd5b50600d5461030c9062010000900460ff1681565b3480156106b057600080fd5b506103bb6106bf366004612f84565b611a46565b3480156106d057600080fd5b506103bb611b0b565b3480156106e557600080fd5b5061070d6106f4366004612e7e565b6011602052600090815260409020805460019091015482565b60408051928352602083019190915201610318565b34801561072e57600080fd5b506103bb61073d366004612f08565b611ba0565b34801561074e57600080fd5b5061070d61075d366004612e7e565b6012602052600090815260409020805460019091015482565b34801561078257600080fd5b506103bb610791366004612fc0565b611c2e565b3480156107a257600080fd5b506103366107b136600461314b565b611d59565b3480156107c257600080fd5b50610336611e41565b3480156107d757600080fd5b5061030c6107e6366004612e99565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561082057600080fd5b50600d5461030c9060ff1681565b34801561083a57600080fd5b506103bb610849366004612e7e565b611e50565b34801561085a57600080fd5b506103bb611f32565b34801561086f57600080fd5b506103bb61087e366004613090565b611fc6565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806108d957506108d98261202c565b92915050565b6060600080546108ee906132e0565b80601f016020809104026020016040519081016040528092919081815260200182805461091a906132e0565b80156109675780601f1061093c57610100808354040283529160200191610967565b820191906000526020600020905b81548152906001019060200180831161094a57829003601f168201915b5050505050905090565b600a546000906001600160a01b031633146109d35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b60005b84811015610a51578383828181106109f0576109f0613386565b9050602002013560126000888885818110610a0d57610a0d613386565b9050602002016020810190610a229190612e7e565b6001600160a01b0316815260208101919091526040016000206001015580610a4981613315565b9150506109d6565b50600195945050505050565b6000818152600260205260408120546001600160a01b0316610ae75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016109ca565b506000908152600460205260409020546001600160a01b031690565b6000610b0e82611764565b9050806001600160a01b0316836001600160a01b03161415610b985760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016109ca565b336001600160a01b0382161480610bb45750610bb481336107e6565b610c265760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109ca565b610c30838361210f565b505050565b60108054610c42906132e0565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6e906132e0565b8015610cbb5780601f10610c9057610100808354040283529160200191610cbb565b820191906000526020600020905b815481529060010190602001808311610c9e57829003601f168201915b505050505081565b600d5460ff16610d155760405162461bcd60e51b815260206004820152601b60248201527f53616c65206d7573742062652061637469766520746f206d696e74000000000060448201526064016109ca565b6000610d2060085490565b9050612776610d2f8383613252565b1115610d7d5760405162461bcd60e51b815260206004820152601260248201527f45786365656473206d617820737570706c79000000000000000000000000000060448201526064016109ca565b3482600f54610d8c919061327e565b1115610dda5760405162461bcd60e51b815260206004820152601760248201527f4554482076616c75652069736e277420636f727265637400000000000000000060448201526064016109ca565b600d54610100900460ff1615610f14576000610df5336113be565b905060008111610e6d5760405162461bcd60e51b815260206004820152602a60248201527f4e6f74206f6e20564950206c697374204f5220796f75206861766520616c726560448201527f616479206d696e7465640000000000000000000000000000000000000000000060648201526084016109ca565b80831115610ee35760405162461bcd60e51b815260206004820152602660248201527f45786365656473206d617820616c6c6f7474656420636f756e7420696e20564960448201527f50206c697374000000000000000000000000000000000000000000000000000060648201526084016109ca565b33600090815260116020526040902054610efe908490613252565b3360009081526011602052604090205550610f8c565b600e54821115610f8c5760405162461bcd60e51b815260206004820152602160248201527f45786365656473206d617820636f756e7420706572207472616e73616374696f60448201527f6e0000000000000000000000000000000000000000000000000000000000000060648201526084016109ca565b60015b828111610fbb57610fa933610fa48385613252565b61218a565b80610fb381613315565b915050610f8f565b60408051338152602081018590527f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885910160405180910390a1505050565b61100333826121a4565b6110755760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016109ca565b610c308383836122ac565b600d5462010000900460ff166110d85760405162461bcd60e51b815260206004820152601c60248201527f4769667420636c61696d696e67206973206e6f7420656e61626c65640000000060448201526064016109ca565b60006110e360085490565b90506127766110f28383613252565b11156111405760405162461bcd60e51b815260206004820152601260248201527f45786365656473206d617820737570706c79000000000000000000000000000060448201526064016109ca565b600061114b336115e3565b9050600081116111c35760405162461bcd60e51b815260206004820152602860248201527f4e6f20676966747320776f6e204f5220796f75206861766520616c726561647960448201527f20636c61696d656400000000000000000000000000000000000000000000000060648201526084016109ca565b808311156112135760405162461bcd60e51b815260206004820152601a60248201527f45786365656473206d617820616c6c6f7474656420676966747300000000000060448201526064016109ca565b3360009081526012602052604090205461122e908490613252565b3360009081526012602052604090205560015b8381116112685761125633610fa48386613252565b8061126081613315565b915050611241565b60408051338152602081018690527fef33e970549489dd2e75c841935709372f2926e3b90b56af4040186e9b83b3e491015b60405180910390a150505050565b60006112b3836117ef565b82106113275760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e647300000000000000000000000000000000000000000060648201526084016109ca565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b031633146113aa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b600d805460ff19811660ff90911615179055565b60006113dd604051806040016040528060008152602001600081525090565b506001600160a01b038216600090815260116020908152604091829020825180840190935280548084526001909101549183018290521015611431578051602082015161142a919061329d565b9392505050565b50600092915050565b50919050565b600a546001600160a01b0316331461149a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b6040514790339082156108fc029083906000818181858888f193505050501580156114c9573d6000803e3d6000fd5b506040518181527f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d9060200160405180910390a150565b6060600061150d836117ef565b67ffffffffffffffff8111156115255761152561339c565b60405190808252806020026020018201604052801561154e578160200160208202803683370190505b509050600060015b60085481116115bf57846001600160a01b031661157282611764565b6001600160a01b031614156115ad578083838151811061159457611594613386565b6020908102919091010152816115a981613315565b9250505b806115b781613315565b915050611556565b50909392505050565b610c3083838360405180602001604052806000815250611ba0565b6000611602604051806040016040528060008152602001600081525090565b506001600160a01b038216600090815260126020908152604091829020825180840190935280548084526001909101549183018290521015611431578051602082015161142a919061329d565b600061165a60085490565b82106116ce5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e6473000000000000000000000000000000000000000060648201526084016109ca565b600882815481106116e1576116e1613386565b90600052602060002001549050919050565b600a546001600160a01b0316331461174d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b805161176090600b906020840190612c93565b5050565b6000818152600260205260408120546001600160a01b0316806108d95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016109ca565b60006001600160a01b03821661186d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016109ca565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146118e35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b6118ed6000612491565b565b600a546000906001600160a01b0316331461194c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b60005b84811015610a515783838281811061196957611969613386565b905060200201356011600088888581811061198657611986613386565b905060200201602081019061199b9190612e7e565b6001600160a01b03168152602081019190915260400160002060010155806119c281613315565b91505061194f565b600a546001600160a01b03163314611a245760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b805161176090600c906020840190612c93565b6060600180546108ee906132e0565b6001600160a01b038216331415611a9f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109ca565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b03163314611b655760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff8116620100009182900460ff1615909102179055565b611baa33836121a4565b611c1c5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016109ca565b611c28848484846124f0565b50505050565b600a546001600160a01b03163314611c885760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b6000611c9360085490565b9050612776611ca28383613252565b1115611cf05760405162461bcd60e51b815260206004820152601260248201527f45786365656473206d617820737570706c79000000000000000000000000000060448201526064016109ca565b60015b828111611d1a57611d0884610fa48385613252565b80611d1281613315565b915050611cf3565b604080516001600160a01b0386168152602081018590527f61c8427ca14788cf50e420fe4b1e41be1ab20530a3f48bb547315dc91e62b9c1910161129a565b6000818152600260205260409020546060906001600160a01b0316611de65760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e000000000000000000000000000000000060648201526084016109ca565b6000611df0612579565b90506000815111611e10576040518060200160405280600081525061142a565b80611e1a84612588565b604051602001611e2b929190613190565b6040516020818303038152906040529392505050565b6060600c80546108ee906132e0565b600a546001600160a01b03163314611eaa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b6001600160a01b038116611f265760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109ca565b611f2f81612491565b50565b600a546001600160a01b03163314611f8c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff81166101009182900460ff1615909102179055565b600a546001600160a01b031633146120205760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b610c3060108383612d17565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806120bf57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806108d957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146108d9565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038416908117909155819061215182611764565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6117608282604051806020016040528060008152506126ba565b6000818152600260205260408120546001600160a01b031661222e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016109ca565b600061223983611764565b9050806001600160a01b0316846001600160a01b031614806122745750836001600160a01b031661226984610a5d565b6001600160a01b0316145b806122a457506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166122bf82611764565b6001600160a01b03161461233b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e000000000000000000000000000000000000000000000060648201526084016109ca565b6001600160a01b0382166123b65760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016109ca565b6123c1838383612743565b6123cc60008261210f565b6001600160a01b03831660009081526003602052604081208054600192906123f590849061329d565b90915550506001600160a01b0382166000908152600360205260408120805460019290612423908490613252565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6124fb8484846122ac565b612507848484846127fb565b611c285760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109ca565b6060600b80546108ee906132e0565b6060816125c857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156125f257806125dc81613315565b91506125eb9050600a8361326a565b91506125cc565b60008167ffffffffffffffff81111561260d5761260d61339c565b6040519080825280601f01601f191660200182016040528015612637576020820181803683370190505b5090505b84156122a45761264c60018361329d565b9150612659600a86613330565b612664906030613252565b60f81b81838151811061267957612679613386565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506126b3600a8661326a565b945061263b565b6126c483836129a8565b6126d160008484846127fb565b610c305760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109ca565b6001600160a01b03831661279e5761279981600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6127c1565b816001600160a01b0316836001600160a01b0316146127c1576127c18382612b03565b6001600160a01b0382166127d857610c3081612ba0565b826001600160a01b0316826001600160a01b031614610c3057610c308282612c4f565b60006001600160a01b0384163b1561299d576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a02906128589033908990889088906004016131bf565b602060405180830381600087803b15801561287257600080fd5b505af19250505080156128a2575060408051601f3d908101601f1916820190925261289f91810190613073565b60015b612952573d8080156128d0576040519150601f19603f3d011682016040523d82523d6000602084013e6128d5565b606091505b50805161294a5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109ca565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506122a4565b506001949350505050565b6001600160a01b0382166129fe5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109ca565b6000818152600260205260409020546001600160a01b031615612a635760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109ca565b612a6f60008383612743565b6001600160a01b0382166000908152600360205260408120805460019290612a98908490613252565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001612b10846117ef565b612b1a919061329d565b600083815260076020526040902054909150808214612b6d576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612bb29060019061329d565b60008381526009602052604081205460088054939450909284908110612bda57612bda613386565b906000526020600020015490508060088381548110612bfb57612bfb613386565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612c3357612c33613370565b6001900381819060005260206000200160009055905550505050565b6000612c5a836117ef565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612c9f906132e0565b90600052602060002090601f016020900481019282612cc15760008555612d07565b82601f10612cda57805160ff1916838001178555612d07565b82800160010185558215612d07579182015b82811115612d07578251825591602001919060010190612cec565b50612d13929150612d8b565b5090565b828054612d23906132e0565b90600052602060002090601f016020900481019282612d455760008555612d07565b82601f10612d5e5782800160ff19823516178555612d07565b82800160010185558215612d07579182015b82811115612d07578235825591602001919060010190612d70565b5b80821115612d135760008155600101612d8c565b600067ffffffffffffffff80841115612dbb57612dbb61339c565b604051601f8501601f19908116603f01168101908282118183101715612de357612de361339c565b81604052809350858152868686011115612dfc57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612e2d57600080fd5b919050565b60008083601f840112612e4457600080fd5b50813567ffffffffffffffff811115612e5c57600080fd5b6020830191508360208260051b8501011115612e7757600080fd5b9250929050565b600060208284031215612e9057600080fd5b61142a82612e16565b60008060408385031215612eac57600080fd5b612eb583612e16565b9150612ec360208401612e16565b90509250929050565b600080600060608486031215612ee157600080fd5b612eea84612e16565b9250612ef860208501612e16565b9150604084013590509250925092565b60008060008060808587031215612f1e57600080fd5b612f2785612e16565b9350612f3560208601612e16565b925060408501359150606085013567ffffffffffffffff811115612f5857600080fd5b8501601f81018713612f6957600080fd5b612f7887823560208401612da0565b91505092959194509250565b60008060408385031215612f9757600080fd5b612fa083612e16565b915060208301358015158114612fb557600080fd5b809150509250929050565b60008060408385031215612fd357600080fd5b612fdc83612e16565b946020939093013593505050565b6000806000806040858703121561300057600080fd5b843567ffffffffffffffff8082111561301857600080fd5b61302488838901612e32565b9096509450602087013591508082111561303d57600080fd5b5061304a87828801612e32565b95989497509550505050565b60006020828403121561306857600080fd5b813561142a816133b2565b60006020828403121561308557600080fd5b815161142a816133b2565b600080602083850312156130a357600080fd5b823567ffffffffffffffff808211156130bb57600080fd5b818501915085601f8301126130cf57600080fd5b8135818111156130de57600080fd5b8660208285010111156130f057600080fd5b60209290920196919550909350505050565b60006020828403121561311457600080fd5b813567ffffffffffffffff81111561312b57600080fd5b8201601f8101841361313c57600080fd5b6122a484823560208401612da0565b60006020828403121561315d57600080fd5b5035919050565b6000815180845261317c8160208601602086016132b4565b601f01601f19169290920160200192915050565b600083516131a28184602088016132b4565b8351908301906131b68183602088016132b4565b01949350505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526131f16080830184613164565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561323357835183529284019291840191600101613217565b50909695505050505050565b60208152600061142a6020830184613164565b6000821982111561326557613265613344565b500190565b6000826132795761327961335a565b500490565b600081600019048311821515161561329857613298613344565b500290565b6000828210156132af576132af613344565b500390565b60005b838110156132cf5781810151838201526020016132b7565b83811115611c285750506000910152565b600181811c908216806132f457607f821691505b6020821081141561143a57634e487b7160e01b600052602260045260246000fd5b600060001982141561332957613329613344565b5060010190565b60008261333f5761333f61335a565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611f2f57600080fdfea2646970667358221220bb8ef364ccb408a60d12983945392de0da45e65bb23827c92f4fcf483b83cb8564736f6c63430008070033

Deployed Bytecode Sourcemap

43350:6043:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34838:224;;;;;;;;;;-1:-1:-1;34838:224:0;;;;;:::i;:::-;;:::i;:::-;;;8519:14:1;;8512:22;8494:41;;8482:2;8467:18;34838:224:0;;;;;;;;21731:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;45371:282::-;;;;;;;;;;-1:-1:-1;45371:282:0;;;;;:::i;:::-;;:::i;23290:221::-;;;;;;;;;;-1:-1:-1;23290:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6832:55:1;;;6814:74;;6802:2;6787:18;23290:221:0;6668:226:1;22813:411:0;;;;;;;;;;-1:-1:-1;22813:411:0;;;;;:::i;:::-;;:::i;:::-;;43815:29;;;;;;;;;;;;;:::i;35478:113::-;;;;;;;;;;-1:-1:-1;35566:10:0;:17;35478:113;;;19519:25:1;;;19507:2;19492:18;35478:113:0;19373:177:1;46804:976:0;;;;;;:::i;:::-;;:::i;24180:339::-;;;;;;;;;;-1:-1:-1;24180:339:0;;;;;:::i;:::-;;:::i;46001:728::-;;;;;;;;;;-1:-1:-1;46001:728:0;;;;;:::i;:::-;;:::i;35146:256::-;;;;;;;;;;-1:-1:-1;35146:256:0;;;;;:::i;:::-;;:::i;43596:34::-;;;;;;;;;;-1:-1:-1;43596:34:0;;;;;;;;;;;48457:89;;;;;;;;;;;;;:::i;45005:305::-;;;;;;;;;;-1:-1:-1;45005:305:0;;;;;:::i;:::-;;:::i;48852:167::-;;;;;;;;;;;;;:::i;49027:361::-;;;;;;;;;;-1:-1:-1;49027:361:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24590:185::-;;;;;;;;;;-1:-1:-1;24590:185:0;;;;;:::i;:::-;;:::i;45661:301::-;;;;;;;;;;-1:-1:-1;45661:301:0;;;;;:::i;:::-;;:::i;35668:233::-;;;;;;;;;;-1:-1:-1;35668:233:0;;;;;:::i;:::-;;:::i;43730:38::-;;;;;;;;;;;;;;;;47916:90;;;;;;;;;;-1:-1:-1;47916:90:0;;;;;:::i;:::-;;:::i;21425:239::-;;;;;;;;;;-1:-1:-1;21425:239:0;;;;;:::i;:::-;;:::i;21155:208::-;;;;;;;;;;-1:-1:-1;21155:208:0;;;;;:::i;:::-;;:::i;42639:94::-;;;;;;;;;;;;;:::i;44717:280::-;;;;;;;;;;-1:-1:-1;44717:280:0;;;;;:::i;:::-;;:::i;41988:87::-;;;;;;;;;;-1:-1:-1;42061:6:0;;-1:-1:-1;;;;;42061:6:0;41988:87;;43679:44;;;;;;;;;;;;43718:5;43679:44;;48181:114;;;;;;;;;;-1:-1:-1;48181:114:0;;;;;:::i;:::-;;:::i;21900:104::-;;;;;;;;;;;;;:::i;43775:33::-;;;;;;;;;;;;;;;;43637:35;;;;;;;;;;-1:-1:-1;43637:35:0;;;;;;;;;;;23583:295;;;;;;;;;;-1:-1:-1;23583:295:0;;;;;:::i;:::-;;:::i;48718:100::-;;;;;;;;;;;;;:::i;43924:39::-;;;;;;;;;;-1:-1:-1;43924:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;19729:25:1;;;19785:2;19770:18;;19763:34;;;;19702:18;43924:39:0;19555:248:1;24846:328:0;;;;;;;;;;-1:-1:-1;24846:328:0;;;;;:::i;:::-;;:::i;43972:40::-;;;;;;;;;;-1:-1:-1;43972:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;44299:343;;;;;;;;;;-1:-1:-1;44299:343:0;;;;;:::i;:::-;;:::i;22075:334::-;;;;;;;;;;-1:-1:-1;22075:334:0;;;;;:::i;:::-;;:::i;48328:95::-;;;;;;;;;;;;;:::i;23949:164::-;;;;;;;;;;-1:-1:-1;23949:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;24070:25:0;;;24046:4;24070:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23949:164;43557:32;;;;;;;;;;-1:-1:-1;43557:32:0;;;;;;;;42888:192;;;;;;;;;;-1:-1:-1;42888:192:0;;;;;:::i;:::-;;:::i;48583:98::-;;;;;;;;;;;;;:::i;48037:112::-;;;;;;;;;;-1:-1:-1;48037:112:0;;;;;:::i;:::-;;:::i;34838:224::-;34940:4;34964:50;;;34979:35;34964:50;;:90;;;35018:36;35042:11;35018:23;:36::i;:::-;34957:97;34838:224;-1:-1:-1;;34838:224:0:o;21731:100::-;21785:13;21818:5;21811:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21731:100;:::o;45371:282::-;42061:6;;45487:12;;-1:-1:-1;;;;;42061:6:0;16274:10;42208:23;42200:68;;;;-1:-1:-1;;;42200:68:0;;16389:2:1;42200:68:0;;;16371:21:1;;;16408:18;;;16401:30;16467:34;16447:18;;;16440:62;16519:18;;42200:68:0;;;;;;;;;45515:9:::1;45510:113;45530:20:::0;;::::1;45510:113;;;45602:8;;45611:1;45602:11;;;;;;;:::i;:::-;;;;;;;45568:8;:22;45577:9;;45587:1;45577:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;45568:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;45568:22:0;:31:::1;;:45:::0;45552:3;::::1;::::0;::::1;:::i;:::-;;;;45510:113;;;-1:-1:-1::0;45641:4:0::1;::::0;45371:282;-1:-1:-1;;;;;45371:282:0:o;23290:221::-;23366:7;26773:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26773:16:0;23386:73;;;;-1:-1:-1;;;23386:73:0;;15976:2:1;23386:73:0;;;15958:21:1;16015:2;15995:18;;;15988:30;16054:34;16034:18;;;16027:62;16125:14;16105:18;;;16098:42;16157:19;;23386:73:0;15774:408:1;23386:73:0;-1:-1:-1;23479:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23479:24:0;;23290:221::o;22813:411::-;22894:13;22910:23;22925:7;22910:14;:23::i;:::-;22894:39;;22958:5;-1:-1:-1;;;;;22952:11:0;:2;-1:-1:-1;;;;;22952:11:0;;;22944:57;;;;-1:-1:-1;;;22944:57:0;;17576:2:1;22944:57:0;;;17558:21:1;17615:2;17595:18;;;17588:30;17654:34;17634:18;;;17627:62;17725:3;17705:18;;;17698:31;17746:19;;22944:57:0;17374:397:1;22944:57:0;16274:10;-1:-1:-1;;;;;23036:21:0;;;;:62;;-1:-1:-1;23061:37:0;23078:5;16274:10;23949:164;:::i;23061:37::-;23014:168;;;;-1:-1:-1;;;23014:168:0;;12450:2:1;23014:168:0;;;12432:21:1;12489:2;12469:18;;;12462:30;12528:34;12508:18;;;12501:62;12599:26;12579:18;;;12572:54;12643:19;;23014:168:0;12248:420:1;23014:168:0;23195:21;23204:2;23208:7;23195:8;:21::i;:::-;22883:341;22813:411;;:::o;43815:29::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46804:976::-;46879:12;;;;46871:52;;;;-1:-1:-1;;;46871:52:0;;11326:2:1;46871:52:0;;;11308:21:1;11365:2;11345:18;;;11338:30;11404:29;11384:18;;;11377:57;11451:18;;46871:52:0;11124:351:1;46871:52:0;46932:14;46949:13;35566:10;:17;;35478:113;46949:13;46932:30;-1:-1:-1;43718:5:0;46980:19;46989:10;46932:30;46980:19;:::i;:::-;46979:37;;46971:68;;;;-1:-1:-1;;;46971:68:0;;14098:2:1;46971:68:0;;;14080:21:1;14137:2;14117:18;;;14110:30;14176:20;14156:18;;;14149:48;14214:18;;46971:68:0;13896:342:1;46971:68:0;47080:9;47065:10;47057:5;;:18;;;;:::i;:::-;47056:33;;47048:69;;;;-1:-1:-1;;;47048:69:0;;15624:2:1;47048:69:0;;;15606:21:1;15663:2;15643:18;;;15636:30;15702:25;15682:18;;;15675:53;15745:18;;47048:69:0;15422:347:1;47048:69:0;47129:15;;;;;;;47126:492;;;47157:29;47189:35;47213:10;47189:23;:35::i;:::-;47157:67;;47270:1;47243:24;:28;47235:83;;;;-1:-1:-1;;;47235:83:0;;15213:2:1;47235:83:0;;;15195:21:1;15252:2;15232:18;;;15225:30;15291:34;15271:18;;;15264:62;15362:12;15342:18;;;15335:40;15392:19;;47235:83:0;15011:406:1;47235:83:0;47351:24;47337:10;:38;;47329:89;;;;-1:-1:-1;;;47329:89:0;;14806:2:1;47329:89:0;;;14788:21:1;14845:2;14825:18;;;14818:30;14884:34;14864:18;;;14857:62;14955:8;14935:18;;;14928:36;14981:19;;47329:89:0;14604:402:1;47329:89:0;47469:10;47461:19;;;;:7;:19;;;;;:29;:42;;47493:10;;47461:42;:::i;:::-;47437:10;47429:19;;;;:7;:19;;;;;:74;-1:-1:-1;47126:492:0;;;47552:18;;47538:10;:32;;47530:78;;;;-1:-1:-1;;;47530:78:0;;13696:2:1;47530:78:0;;;13678:21:1;13735:2;13715:18;;;13708:30;13774:34;13754:18;;;13747:62;13845:3;13825:18;;;13818:31;13866:19;;47530:78:0;13494:397:1;47530:78:0;47652:1;47643:88;47660:10;47655:1;:15;47643:88;;47688:33;47698:10;47710;47719:1;47710:6;:10;:::i;:::-;47688:9;:33::i;:::-;47672:3;;;;:::i;:::-;;;;47643:88;;;47744:28;;;47749:10;7589:74:1;;7694:2;7679:18;;7672:34;;;47744:28:0;;7562:18:1;47744:28:0;;;;;;;46862:918;;46804:976;:::o;24180:339::-;24375:41;16274:10;24408:7;24375:18;:41::i;:::-;24367:103;;;;-1:-1:-1;;;24367:103:0;;17978:2:1;24367:103:0;;;17960:21:1;18017:2;17997:18;;;17990:30;18056:34;18036:18;;;18029:62;18127:19;18107:18;;;18100:47;18164:19;;24367:103:0;17776:413:1;24367:103:0;24483:28;24493:4;24499:2;24503:7;24483:9;:28::i;46001:728::-;46074:15;;;;;;;46066:56;;;;-1:-1:-1;;;46066:56:0;;19218:2:1;46066:56:0;;;19200:21:1;19257:2;19237:18;;;19230:30;19296;19276:18;;;19269:58;19344:18;;46066:56:0;19016:352:1;46066:56:0;46131:11;46145:13;35566:10;:17;;35478:113;46145:13;46131:27;-1:-1:-1;43718:5:0;46176:19;46185:10;46131:27;46176:19;:::i;:::-;46175:37;;46167:68;;;;-1:-1:-1;;;46167:68:0;;14098:2:1;46167:68:0;;;14080:21:1;14137:2;14117:18;;;14110:30;14176:20;14156:18;;;14149:48;14214:18;;46167:68:0;13896:342:1;46167:68:0;46244:28;46275:34;46298:10;46275:22;:34::i;:::-;46244:65;;46352:1;46326:23;:27;46318:80;;;;-1:-1:-1;;;46318:80:0;;18396:2:1;46318:80:0;;;18378:21:1;18435:2;18415:18;;;18408:30;18474:34;18454:18;;;18447:62;18545:10;18525:18;;;18518:38;18573:19;;46318:80:0;18194:404:1;46318:80:0;46429:23;46415:10;:37;;46407:76;;;;-1:-1:-1;;;46407:76:0;;12095:2:1;46407:76:0;;;12077:21:1;12134:2;12114:18;;;12107:30;12173:28;12153:18;;;12146:56;12219:18;;46407:76:0;11893:350:1;46407:76:0;46534:10;46525:20;;;;:8;:20;;;;;:30;:43;;46558:10;;46525:43;:::i;:::-;46501:10;46492:20;;;;:8;:20;;;;;:76;46601:1;46592:88;46609:10;46604:1;:15;46592:88;;46637:33;46647:10;46659;46668:1;46659:6;:10;:::i;46637:33::-;46621:3;;;;:::i;:::-;;;;46592:88;;;46693:28;;;46698:10;7589:74:1;;7694:2;7679:18;;7672:34;;;46693:28:0;;7562:18:1;46693:28:0;;;;;;;;46057:672;;;46001:728;:::o;35146:256::-;35243:7;35279:23;35296:5;35279:16;:23::i;:::-;35271:5;:31;35263:87;;;;-1:-1:-1;;;35263:87:0;;8972:2:1;35263:87:0;;;8954:21:1;9011:2;8991:18;;;8984:30;9050:34;9030:18;;;9023:62;9121:13;9101:18;;;9094:41;9152:19;;35263:87:0;8770:407:1;35263:87:0;-1:-1:-1;;;;;;35368:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;35146:256::o;48457:89::-;42061:6;;-1:-1:-1;;;;;42061:6:0;16274:10;42208:23;42200:68;;;;-1:-1:-1;;;42200:68:0;;16389:2:1;42200:68:0;;;16371:21:1;;;16408:18;;;16401:30;16467:34;16447:18;;;16440:62;16519:18;;42200:68:0;16187:356:1;42200:68:0;48526:12:::1;::::0;;-1:-1:-1;;48510:28:0;::::1;48526:12;::::0;;::::1;48525:13;48510:28;::::0;;48457:89::o;45005:305::-;45073:23;45107:18;-1:-1:-1;;;;;;;;;;;;;;;;;;;45107:18:0;-1:-1:-1;;;;;;45143:13:0;;;;;;:7;:13;;;;;;;;;45134:22;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45165:138:0;;;45241:16;;45223:15;;;;:34;;45241:16;45223:34;:::i;:::-;45215:43;45005:305;-1:-1:-1;;;45005:305:0:o;45165:138::-;-1:-1:-1;45292:1:0;;45005:305;-1:-1:-1;;45005:305:0:o;45165:138::-;45098:212;45005:305;;;:::o;48852:167::-;42061:6;;-1:-1:-1;;;;;42061:6:0;16274:10;42208:23;42200:68;;;;-1:-1:-1;;;42200:68:0;;16389:2:1;42200:68:0;;;16371:21:1;;;16408:18;;;16401:30;16467:34;16447:18;;;16440:62;16519:18;;42200:68:0;16187:356:1;42200:68:0;48943:37:::1;::::0;48913:21:::1;::::0;48951:10:::1;::::0;48943:37;::::1;;;::::0;48913:21;;48898:12:::1;48943:37:::0;48898:12;48943:37;48913:21;48951:10;48943:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;48994:17:0::1;::::0;19519:25:1;;;48994:17:0::1;::::0;19507:2:1;19492:18;48994:17:0::1;;;;;;;48889:130;48852:167::o:0;49027:361::-;49087:13;49111:20;49145:15;49155:4;49145:9;:15::i;:::-;49134:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49134:27:0;-1:-1:-1;49111:50:0;-1:-1:-1;49170:12:0;49209:1;49195:164;35566:10;:17;49212:1;:18;49195:164;;49268:4;-1:-1:-1;;;;;49254:18:0;:10;49262:1;49254:7;:10::i;:::-;-1:-1:-1;;;;;49254:18:0;;49250:100;;;49309:1;49291:6;49298:7;49291:15;;;;;;;;:::i;:::-;;;;;;;;;;:19;49327:9;;;;:::i;:::-;;;;49250:100;49232:3;;;;:::i;:::-;;;;49195:164;;;-1:-1:-1;49374:6:0;;49027:361;-1:-1:-1;;;49027:361:0:o;24590:185::-;24728:39;24745:4;24751:2;24755:7;24728:39;;;;;;;;;;;;:16;:39::i;45661:301::-;45728:19;45758:18;-1:-1:-1;;;;;;;;;;;;;;;;;;;45758:18:0;-1:-1:-1;;;;;;45794:14:0;;;;;;:8;:14;;;;;;;;;45785:23;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45817:138:0;;;45893:16;;45875:15;;;;:34;;45893:16;45875:34;:::i;35668:233::-;35743:7;35779:30;35566:10;:17;;35478:113;35779:30;35771:5;:38;35763:95;;;;-1:-1:-1;;;35763:95:0;;18805:2:1;35763:95:0;;;18787:21:1;18844:2;18824:18;;;18817:30;18883:34;18863:18;;;18856:62;18954:14;18934:18;;;18927:42;18986:19;;35763:95:0;18603:408:1;35763:95:0;35876:10;35887:5;35876:17;;;;;;;;:::i;:::-;;;;;;;;;35869:24;;35668:233;;;:::o;47916:90::-;42061:6;;-1:-1:-1;;;;;42061:6:0;16274:10;42208:23;42200:68;;;;-1:-1:-1;;;42200:68:0;;16389:2:1;42200:68:0;;;16371:21:1;;;16408:18;;;16401:30;16467:34;16447:18;;;16440:62;16519:18;;42200:68:0;16187:356:1;42200:68:0;47985:13;;::::1;::::0;:7:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;;47916:90:::0;:::o;21425:239::-;21497:7;21533:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21533:16:0;21568:19;21560:73;;;;-1:-1:-1;;;21560:73:0;;13286:2:1;21560:73:0;;;13268:21:1;13325:2;13305:18;;;13298:30;13364:34;13344:18;;;13337:62;13435:11;13415:18;;;13408:39;13464:19;;21560:73:0;13084:405:1;21155:208:0;21227:7;-1:-1:-1;;;;;21255:19:0;;21247:74;;;;-1:-1:-1;;;21247:74:0;;12875:2:1;21247:74:0;;;12857:21:1;12914:2;12894:18;;;12887:30;12953:34;12933:18;;;12926:62;13024:12;13004:18;;;12997:40;13054:19;;21247:74:0;12673:406:1;21247:74:0;-1:-1:-1;;;;;;21339:16:0;;;;;:9;:16;;;;;;;21155:208::o;42639:94::-;42061:6;;-1:-1:-1;;;;;42061:6:0;16274:10;42208:23;42200:68;;;;-1:-1:-1;;;42200:68:0;;16389:2:1;42200:68:0;;;16371:21:1;;;16408:18;;;16401:30;16467:34;16447:18;;;16440:62;16519:18;;42200:68:0;16187:356:1;42200:68:0;42704:21:::1;42722:1;42704:9;:21::i;:::-;42639:94::o:0;44717:280::-;42061:6;;44832:12;;-1:-1:-1;;;;;42061:6:0;16274:10;42208:23;42200:68;;;;-1:-1:-1;;;42200:68:0;;16389:2:1;42200:68:0;;;16371:21:1;;;16408:18;;;16401:30;16467:34;16447:18;;;16440:62;16519:18;;42200:68:0;16187:356:1;42200:68:0;44860:9:::1;44855:112;44875:20:::0;;::::1;44855:112;;;44946:8;;44955:1;44946:11;;;;;;;:::i;:::-;;;;;;;44913:7;:21;44921:9;;44931:1;44921:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;44913:21:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;44913:21:0;:30:::1;;:44:::0;44897:3;::::1;::::0;::::1;:::i;:::-;;;;44855:112;;48181:114:::0;42061:6;;-1:-1:-1;;;;;42061:6:0;16274:10;42208:23;42200:68;;;;-1:-1:-1;;;42200:68:0;;16389:2:1;42200:68:0;;;16371:21:1;;;16408:18;;;16401:30;16467:34;16447:18;;;16440:62;16519:18;;42200:68:0;16187:356:1;42200:68:0;48260:27;;::::1;::::0;:12:::1;::::0;:27:::1;::::0;::::1;::::0;::::1;:::i;21900:104::-:0;21956:13;21989:7;21982:14;;;;;:::i;23583:295::-;-1:-1:-1;;;;;23686:24:0;;16274:10;23686:24;;23678:62;;;;-1:-1:-1;;;23678:62:0;;10972:2:1;23678:62:0;;;10954:21:1;11011:2;10991:18;;;10984:30;11050:27;11030:18;;;11023:55;11095:18;;23678:62:0;10770:349:1;23678:62:0;16274:10;23753:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;23753:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;23753:53:0;;;;;;;;;;23822:48;;8494:41:1;;;23753:42:0;;16274:10;23822:48;;8467:18:1;23822:48:0;;;;;;;23583:295;;:::o;48718:100::-;42061:6;;-1:-1:-1;;;;;42061:6:0;16274:10;42208:23;42200:68;;;;-1:-1:-1;;;42200:68:0;;16389:2:1;42200:68:0;;;16371:21:1;;;16408:18;;;16401:30;16467:34;16447:18;;;16440:62;16519:18;;42200:68:0;16187:356:1;42200:68:0;48795:15:::1;::::0;;48776:34;;::::1;48795:15:::0;;;;::::1;;;48794:16;48776:34:::0;;::::1;;::::0;;48718:100::o;24846:328::-;25021:41;16274:10;25054:7;25021:18;:41::i;:::-;25013:103;;;;-1:-1:-1;;;25013:103:0;;17978:2:1;25013:103:0;;;17960:21:1;18017:2;17997:18;;;17990:30;18056:34;18036:18;;;18029:62;18127:19;18107:18;;;18100:47;18164:19;;25013:103:0;17776:413:1;25013:103:0;25127:39;25141:4;25147:2;25151:7;25160:5;25127:13;:39::i;:::-;24846:328;;;;:::o;44299:343::-;42061:6;;-1:-1:-1;;;;;42061:6:0;16274:10;42208:23;42200:68;;;;-1:-1:-1;;;42200:68:0;;16389:2:1;42200:68:0;;;16371:21:1;;;16408:18;;;16401:30;16467:34;16447:18;;;16440:62;16519:18;;42200:68:0;16187:356:1;42200:68:0;44386:11:::1;44400:13;35566:10:::0;:17;;35478:113;44400:13:::1;44386:27:::0;-1:-1:-1;43718:5:0::1;44431:19;44440:10:::0;44386:27;44431:19:::1;:::i;:::-;44430:37;;44422:68;;;::::0;-1:-1:-1;;;44422:68:0;;14098:2:1;44422:68:0::1;::::0;::::1;14080:21:1::0;14137:2;14117:18;;;14110:30;14176:20;14156:18;;;14149:48;14214:18;;44422:68:0::1;13896:342:1::0;44422:68:0::1;44523:1;44514:82;44531:10;44526:1;:15;44514:82;;44559:27;44569:4:::0;44575:10:::1;44584:1:::0;44575:6;:10:::1;:::i;44559:27::-;44543:3:::0;::::1;::::0;::::1;:::i;:::-;;;;44514:82;;;44609:25;::::0;;-1:-1:-1;;;;;7607:55:1;;7589:74;;7694:2;7679:18;;7672:34;;;44609:25:0::1;::::0;7562:18:1;44609:25:0::1;7415:297:1::0;22075:334:0;26749:4;26773:16;;;:7;:16;;;;;;22148:13;;-1:-1:-1;;;;;26773:16:0;22174:76;;;;-1:-1:-1;;;22174:76:0;;17160:2:1;22174:76:0;;;17142:21:1;17199:2;17179:18;;;17172:30;17238:34;17218:18;;;17211:62;17309:17;17289:18;;;17282:45;17344:19;;22174:76:0;16958:411:1;22174:76:0;22263:21;22287:10;:8;:10::i;:::-;22263:34;;22339:1;22321:7;22315:21;:25;:86;;;;;;;;;;;;;;;;;22367:7;22376:18;:7;:16;:18::i;:::-;22350:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22308:93;22075:334;-1:-1:-1;;;22075:334:0:o;48328:95::-;48372:13;48403:12;48396:19;;;;;:::i;42888:192::-;42061:6;;-1:-1:-1;;;;;42061:6:0;16274:10;42208:23;42200:68;;;;-1:-1:-1;;;42200:68:0;;16389:2:1;42200:68:0;;;16371:21:1;;;16408:18;;;16401:30;16467:34;16447:18;;;16440:62;16519:18;;42200:68:0;16187:356:1;42200:68:0;-1:-1:-1;;;;;42977:22:0;::::1;42969:73;;;::::0;-1:-1:-1;;;42969:73:0;;9803:2:1;42969:73:0::1;::::0;::::1;9785:21:1::0;9842:2;9822:18;;;9815:30;9881:34;9861:18;;;9854:62;9952:8;9932:18;;;9925:36;9978:19;;42969:73:0::1;9601:402:1::0;42969:73:0::1;43053:19;43063:8;43053:9;:19::i;:::-;42888:192:::0;:::o;48583:98::-;42061:6;;-1:-1:-1;;;;;42061:6:0;16274:10;42208:23;42200:68;;;;-1:-1:-1;;;42200:68:0;;16389:2:1;42200:68:0;;;16371:21:1;;;16408:18;;;16401:30;16467:34;16447:18;;;16440:62;16519:18;;42200:68:0;16187:356:1;42200:68:0;48658:15:::1;::::0;;48639:34;;::::1;48658:15;::::0;;;::::1;;;48657:16;48639:34:::0;;::::1;;::::0;;48583:98::o;48037:112::-;42061:6;;-1:-1:-1;;;;;42061:6:0;16274:10;42208:23;42200:68;;;;-1:-1:-1;;;42200:68:0;;16389:2:1;42200:68:0;;;16371:21:1;;;16408:18;;;16401:30;16467:34;16447:18;;;16440:62;16519:18;;42200:68:0;16187:356:1;42200:68:0;48117:24:::1;:10;48130:11:::0;;48117:24:::1;:::i;20786:305::-:0;20888:4;20925:40;;;20940:25;20925:40;;:105;;-1:-1:-1;20982:48:0;;;20997:33;20982:48;20925:105;:158;;;-1:-1:-1;19410:25:0;19395:40;;;;21047:36;19286:157;30666:174;30741:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;30741:29:0;-1:-1:-1;;;;;30741:29:0;;;;;;;;:24;;30795:23;30741:24;30795:14;:23::i;:::-;-1:-1:-1;;;;;30786:46:0;;;;;;;;;;;30666:174;;:::o;27668:110::-;27744:26;27754:2;27758:7;27744:26;;;;;;;;;;;;:9;:26::i;26978:348::-;27071:4;26773:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26773:16:0;27088:73;;;;-1:-1:-1;;;27088:73:0;;11682:2:1;27088:73:0;;;11664:21:1;11721:2;11701:18;;;11694:30;11760:34;11740:18;;;11733:62;11831:14;11811:18;;;11804:42;11863:19;;27088:73:0;11480:408:1;27088:73:0;27172:13;27188:23;27203:7;27188:14;:23::i;:::-;27172:39;;27241:5;-1:-1:-1;;;;;27230:16:0;:7;-1:-1:-1;;;;;27230:16:0;;:51;;;;27274:7;-1:-1:-1;;;;;27250:31:0;:20;27262:7;27250:11;:20::i;:::-;-1:-1:-1;;;;;27250:31:0;;27230:51;:87;;;-1:-1:-1;;;;;;24070:25:0;;;24046:4;24070:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27285:32;27222:96;26978:348;-1:-1:-1;;;;26978:348:0:o;29970:578::-;30129:4;-1:-1:-1;;;;;30102:31:0;:23;30117:7;30102:14;:23::i;:::-;-1:-1:-1;;;;;30102:31:0;;30094:85;;;;-1:-1:-1;;;30094:85:0;;16750:2:1;30094:85:0;;;16732:21:1;16789:2;16769:18;;;16762:30;16828:34;16808:18;;;16801:62;16899:11;16879:18;;;16872:39;16928:19;;30094:85:0;16548:405:1;30094:85:0;-1:-1:-1;;;;;30198:16:0;;30190:65;;;;-1:-1:-1;;;30190:65:0;;10567:2:1;30190:65:0;;;10549:21:1;10606:2;10586:18;;;10579:30;10645:34;10625:18;;;10618:62;10716:6;10696:18;;;10689:34;10740:19;;30190:65:0;10365:400:1;30190:65:0;30268:39;30289:4;30295:2;30299:7;30268:20;:39::i;:::-;30372:29;30389:1;30393:7;30372:8;:29::i;:::-;-1:-1:-1;;;;;30414:15:0;;;;;;:9;:15;;;;;:20;;30433:1;;30414:15;:20;;30433:1;;30414:20;:::i;:::-;;;;-1:-1:-1;;;;;;;30445:13:0;;;;;;:9;:13;;;;;:18;;30462:1;;30445:13;:18;;30462:1;;30445:18;:::i;:::-;;;;-1:-1:-1;;30474:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;30474:21:0;-1:-1:-1;;;;;30474:21:0;;;;;;;;;30513:27;;30474:16;;30513:27;;;;;;;29970:578;;;:::o;43088:173::-;43163:6;;;-1:-1:-1;;;;;43180:17:0;;;-1:-1:-1;;43180:17:0;;;;;;;43213:40;;43163:6;;;43180:17;43163:6;;43213:40;;43144:16;;43213:40;43133:128;43088:173;:::o;26056:315::-;26213:28;26223:4;26229:2;26233:7;26213:9;:28::i;:::-;26260:48;26283:4;26289:2;26293:7;26302:5;26260:22;:48::i;:::-;26252:111;;;;-1:-1:-1;;;26252:111:0;;9384:2:1;26252:111:0;;;9366:21:1;9423:2;9403:18;;;9396:30;9462:34;9442:18;;;9435:62;9533:20;9513:18;;;9506:48;9571:19;;26252:111:0;9182:414:1;47788:100:0;47840:13;47873:7;47866:14;;;;;:::i;16725:723::-;16781:13;17002:10;16998:53;;-1:-1:-1;;17029:10:0;;;;;;;;;;;;;;;;;;16725:723::o;16998:53::-;17076:5;17061:12;17117:78;17124:9;;17117:78;;17150:8;;;;:::i;:::-;;-1:-1:-1;17173:10:0;;-1:-1:-1;17181:2:0;17173:10;;:::i;:::-;;;17117:78;;;17205:19;17237:6;17227:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17227:17:0;;17205:39;;17255:154;17262:10;;17255:154;;17289:11;17299:1;17289:11;;:::i;:::-;;-1:-1:-1;17358:10:0;17366:2;17358:5;:10;:::i;:::-;17345:24;;:2;:24;:::i;:::-;17332:39;;17315:6;17322;17315:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;17386:11:0;17395:2;17386:11;;:::i;:::-;;;17255:154;;28005:321;28135:18;28141:2;28145:7;28135:5;:18::i;:::-;28186:54;28217:1;28221:2;28225:7;28234:5;28186:22;:54::i;:::-;28164:154;;;;-1:-1:-1;;;28164:154:0;;9384:2:1;28164:154:0;;;9366:21:1;9423:2;9403:18;;;9396:30;9462:34;9442:18;;;9435:62;9533:20;9513:18;;;9506:48;9571:19;;28164:154:0;9182:414:1;36514:589:0;-1:-1:-1;;;;;36720:18:0;;36716:187;;36755:40;36787:7;37930:10;:17;;37903:24;;;;:15;:24;;;;;:44;;;37958:24;;;;;;;;;;;;37826:164;36755:40;36716:187;;;36825:2;-1:-1:-1;;;;;36817:10:0;:4;-1:-1:-1;;;;;36817:10:0;;36813:90;;36844:47;36877:4;36883:7;36844:32;:47::i;:::-;-1:-1:-1;;;;;36917:16:0;;36913:183;;36950:45;36987:7;36950:36;:45::i;36913:183::-;37023:4;-1:-1:-1;;;;;37017:10:0;:2;-1:-1:-1;;;;;37017:10:0;;37013:83;;37044:40;37072:2;37076:7;37044:27;:40::i;31405:799::-;31560:4;-1:-1:-1;;;;;31581:13:0;;8555:20;8603:8;31577:620;;31617:72;;;;;-1:-1:-1;;;;;31617:36:0;;;;;:72;;16274:10;;31668:4;;31674:7;;31683:5;;31617:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31617:72:0;;;;;;;;-1:-1:-1;;31617:72:0;;;;;;;;;;;;:::i;:::-;;;31613:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31859:13:0;;31855:272;;31902:60;;-1:-1:-1;;;31902:60:0;;9384:2:1;31902:60:0;;;9366:21:1;9423:2;9403:18;;;9396:30;9462:34;9442:18;;;9435:62;9533:20;9513:18;;;9506:48;9571:19;;31902:60:0;9182:414:1;31855:272:0;32077:6;32071:13;32062:6;32058:2;32054:15;32047:38;31613:529;31740:51;;31750:41;31740:51;;-1:-1:-1;31733:58:0;;31577:620;-1:-1:-1;32181:4:0;31405:799;;;;;;:::o;28662:382::-;-1:-1:-1;;;;;28742:16:0;;28734:61;;;;-1:-1:-1;;;28734:61:0;;14445:2:1;28734:61:0;;;14427:21:1;;;14464:18;;;14457:30;14523:34;14503:18;;;14496:62;14575:18;;28734:61:0;14243:356:1;28734:61:0;26749:4;26773:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26773:16:0;:30;28806:58;;;;-1:-1:-1;;;28806:58:0;;10210:2:1;28806:58:0;;;10192:21:1;10249:2;10229:18;;;10222:30;10288;10268:18;;;10261:58;10336:18;;28806:58:0;10008:352:1;28806:58:0;28877:45;28906:1;28910:2;28914:7;28877:20;:45::i;:::-;-1:-1:-1;;;;;28935:13:0;;;;;;:9;:13;;;;;:18;;28952:1;;28935:13;:18;;28952:1;;28935:18;:::i;:::-;;;;-1:-1:-1;;28964:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;28964:21:0;-1:-1:-1;;;;;28964:21:0;;;;;;;;29003:33;;28964:16;;;29003:33;;28964:16;;29003:33;28662:382;;:::o;38617:988::-;38883:22;38933:1;38908:22;38925:4;38908:16;:22::i;:::-;:26;;;;:::i;:::-;38945:18;38966:26;;;:17;:26;;;;;;38883:51;;-1:-1:-1;39099:28:0;;;39095:328;;-1:-1:-1;;;;;39166:18:0;;39144:19;39166:18;;;:12;:18;;;;;;;;:34;;;;;;;;;39217:30;;;;;;:44;;;39334:30;;:17;:30;;;;;:43;;;39095:328;-1:-1:-1;39519:26:0;;;;:17;:26;;;;;;;;39512:33;;;-1:-1:-1;;;;;39563:18:0;;;;;:12;:18;;;;;:34;;;;;;;39556:41;38617:988::o;39900:1079::-;40178:10;:17;40153:22;;40178:21;;40198:1;;40178:21;:::i;:::-;40210:18;40231:24;;;:15;:24;;;;;;40604:10;:26;;40153:46;;-1:-1:-1;40231:24:0;;40153:46;;40604:26;;;;;;:::i;:::-;;;;;;;;;40582:48;;40668:11;40643:10;40654;40643:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;40748:28;;;:15;:28;;;;;;;:41;;;40920:24;;;;;40913:31;40955:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;39971:1008;;;39900:1079;:::o;37404:221::-;37489:14;37506:20;37523:2;37506:16;:20::i;:::-;-1:-1:-1;;;;;37537:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;37582:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;37404:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:690:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;289:2;283:9;355:2;343:15;;-1:-1:-1;;339:24:1;;;365:2;335:33;331:42;319:55;;;389:18;;;409:22;;;386:46;383:72;;;435:18;;:::i;:::-;475:10;471:2;464:22;504:6;495:15;;534:6;526;519:22;574:3;565:6;560:3;556:16;553:25;550:45;;;591:1;588;581:12;550:45;641:6;636:3;629:4;621:6;617:17;604:44;696:1;689:4;680:6;672;668:19;664:30;657:41;;;;14:690;;;;;:::o;709:196::-;777:20;;-1:-1:-1;;;;;826:54:1;;816:65;;806:93;;895:1;892;885:12;806:93;709:196;;;:::o;910:367::-;973:8;983:6;1037:3;1030:4;1022:6;1018:17;1014:27;1004:55;;1055:1;1052;1045:12;1004:55;-1:-1:-1;1078:20:1;;1121:18;1110:30;;1107:50;;;1153:1;1150;1143:12;1107:50;1190:4;1182:6;1178:17;1166:29;;1250:3;1243:4;1233:6;1230:1;1226:14;1218:6;1214:27;1210:38;1207:47;1204:67;;;1267:1;1264;1257:12;1204:67;910:367;;;;;:::o;1282:186::-;1341:6;1394:2;1382:9;1373:7;1369:23;1365:32;1362:52;;;1410:1;1407;1400:12;1362:52;1433:29;1452:9;1433:29;:::i;1473:260::-;1541:6;1549;1602:2;1590:9;1581:7;1577:23;1573:32;1570:52;;;1618:1;1615;1608:12;1570:52;1641:29;1660:9;1641:29;:::i;:::-;1631:39;;1689:38;1723:2;1712:9;1708:18;1689:38;:::i;:::-;1679:48;;1473:260;;;;;:::o;1738:328::-;1815:6;1823;1831;1884:2;1872:9;1863:7;1859:23;1855:32;1852:52;;;1900:1;1897;1890:12;1852:52;1923:29;1942:9;1923:29;:::i;:::-;1913:39;;1971:38;2005:2;1994:9;1990:18;1971:38;:::i;:::-;1961:48;;2056:2;2045:9;2041:18;2028:32;2018:42;;1738:328;;;;;:::o;2071:666::-;2166:6;2174;2182;2190;2243:3;2231:9;2222:7;2218:23;2214:33;2211:53;;;2260:1;2257;2250:12;2211:53;2283:29;2302:9;2283:29;:::i;:::-;2273:39;;2331:38;2365:2;2354:9;2350:18;2331:38;:::i;:::-;2321:48;;2416:2;2405:9;2401:18;2388:32;2378:42;;2471:2;2460:9;2456:18;2443:32;2498:18;2490:6;2487:30;2484:50;;;2530:1;2527;2520:12;2484:50;2553:22;;2606:4;2598:13;;2594:27;-1:-1:-1;2584:55:1;;2635:1;2632;2625:12;2584:55;2658:73;2723:7;2718:2;2705:16;2700:2;2696;2692:11;2658:73;:::i;:::-;2648:83;;;2071:666;;;;;;;:::o;2742:347::-;2807:6;2815;2868:2;2856:9;2847:7;2843:23;2839:32;2836:52;;;2884:1;2881;2874:12;2836:52;2907:29;2926:9;2907:29;:::i;:::-;2897:39;;2986:2;2975:9;2971:18;2958:32;3033:5;3026:13;3019:21;3012:5;3009:32;2999:60;;3055:1;3052;3045:12;2999:60;3078:5;3068:15;;;2742:347;;;;;:::o;3094:254::-;3162:6;3170;3223:2;3211:9;3202:7;3198:23;3194:32;3191:52;;;3239:1;3236;3229:12;3191:52;3262:29;3281:9;3262:29;:::i;:::-;3252:39;3338:2;3323:18;;;;3310:32;;-1:-1:-1;;;3094:254:1:o;3353:773::-;3475:6;3483;3491;3499;3552:2;3540:9;3531:7;3527:23;3523:32;3520:52;;;3568:1;3565;3558:12;3520:52;3608:9;3595:23;3637:18;3678:2;3670:6;3667:14;3664:34;;;3694:1;3691;3684:12;3664:34;3733:70;3795:7;3786:6;3775:9;3771:22;3733:70;:::i;:::-;3822:8;;-1:-1:-1;3707:96:1;-1:-1:-1;3910:2:1;3895:18;;3882:32;;-1:-1:-1;3926:16:1;;;3923:36;;;3955:1;3952;3945:12;3923:36;;3994:72;4058:7;4047:8;4036:9;4032:24;3994:72;:::i;:::-;3353:773;;;;-1:-1:-1;4085:8:1;-1:-1:-1;;;;3353:773:1:o;4131:245::-;4189:6;4242:2;4230:9;4221:7;4217:23;4213:32;4210:52;;;4258:1;4255;4248:12;4210:52;4297:9;4284:23;4316:30;4340:5;4316:30;:::i;4381:249::-;4450:6;4503:2;4491:9;4482:7;4478:23;4474:32;4471:52;;;4519:1;4516;4509:12;4471:52;4551:9;4545:16;4570:30;4594:5;4570:30;:::i;4635:592::-;4706:6;4714;4767:2;4755:9;4746:7;4742:23;4738:32;4735:52;;;4783:1;4780;4773:12;4735:52;4823:9;4810:23;4852:18;4893:2;4885:6;4882:14;4879:34;;;4909:1;4906;4899:12;4879:34;4947:6;4936:9;4932:22;4922:32;;4992:7;4985:4;4981:2;4977:13;4973:27;4963:55;;5014:1;5011;5004:12;4963:55;5054:2;5041:16;5080:2;5072:6;5069:14;5066:34;;;5096:1;5093;5086:12;5066:34;5141:7;5136:2;5127:6;5123:2;5119:15;5115:24;5112:37;5109:57;;;5162:1;5159;5152:12;5109:57;5193:2;5185:11;;;;;5215:6;;-1:-1:-1;4635:592:1;;-1:-1:-1;;;;4635:592:1:o;5232:450::-;5301:6;5354:2;5342:9;5333:7;5329:23;5325:32;5322:52;;;5370:1;5367;5360:12;5322:52;5410:9;5397:23;5443:18;5435:6;5432:30;5429:50;;;5475:1;5472;5465:12;5429:50;5498:22;;5551:4;5543:13;;5539:27;-1:-1:-1;5529:55:1;;5580:1;5577;5570:12;5529:55;5603:73;5668:7;5663:2;5650:16;5645:2;5641;5637:11;5603:73;:::i;5687:180::-;5746:6;5799:2;5787:9;5778:7;5774:23;5770:32;5767:52;;;5815:1;5812;5805:12;5767:52;-1:-1:-1;5838:23:1;;5687:180;-1:-1:-1;5687:180:1:o;5872:316::-;5913:3;5951:5;5945:12;5978:6;5973:3;5966:19;5994:63;6050:6;6043:4;6038:3;6034:14;6027:4;6020:5;6016:16;5994:63;:::i;:::-;6102:2;6090:15;-1:-1:-1;;6086:88:1;6077:98;;;;6177:4;6073:109;;5872:316;-1:-1:-1;;5872:316:1:o;6193:470::-;6372:3;6410:6;6404:13;6426:53;6472:6;6467:3;6460:4;6452:6;6448:17;6426:53;:::i;:::-;6542:13;;6501:16;;;;6564:57;6542:13;6501:16;6598:4;6586:17;;6564:57;:::i;:::-;6637:20;;6193:470;-1:-1:-1;;;;6193:470:1:o;6899:511::-;7093:4;-1:-1:-1;;;;;7203:2:1;7195:6;7191:15;7180:9;7173:34;7255:2;7247:6;7243:15;7238:2;7227:9;7223:18;7216:43;;7295:6;7290:2;7279:9;7275:18;7268:34;7338:3;7333:2;7322:9;7318:18;7311:31;7359:45;7399:3;7388:9;7384:19;7376:6;7359:45;:::i;:::-;7351:53;6899:511;-1:-1:-1;;;;;;6899:511:1:o;7717:632::-;7888:2;7940:21;;;8010:13;;7913:18;;;8032:22;;;7859:4;;7888:2;8111:15;;;;8085:2;8070:18;;;7859:4;8154:169;8168:6;8165:1;8162:13;8154:169;;;8229:13;;8217:26;;8298:15;;;;8263:12;;;;8190:1;8183:9;8154:169;;;-1:-1:-1;8340:3:1;;7717:632;-1:-1:-1;;;;;;7717:632:1:o;8546:219::-;8695:2;8684:9;8677:21;8658:4;8715:44;8755:2;8744:9;8740:18;8732:6;8715:44;:::i;19808:128::-;19848:3;19879:1;19875:6;19872:1;19869:13;19866:39;;;19885:18;;:::i;:::-;-1:-1:-1;19921:9:1;;19808:128::o;19941:120::-;19981:1;20007;19997:35;;20012:18;;:::i;:::-;-1:-1:-1;20046:9:1;;19941:120::o;20066:228::-;20106:7;20232:1;-1:-1:-1;;20160:74:1;20157:1;20154:81;20149:1;20142:9;20135:17;20131:105;20128:131;;;20239:18;;:::i;:::-;-1:-1:-1;20279:9:1;;20066:228::o;20299:125::-;20339:4;20367:1;20364;20361:8;20358:34;;;20372:18;;:::i;:::-;-1:-1:-1;20409:9:1;;20299:125::o;20429:258::-;20501:1;20511:113;20525:6;20522:1;20519:13;20511:113;;;20601:11;;;20595:18;20582:11;;;20575:39;20547:2;20540:10;20511:113;;;20642:6;20639:1;20636:13;20633:48;;;-1:-1:-1;;20677:1:1;20659:16;;20652:27;20429:258::o;20692:437::-;20771:1;20767:12;;;;20814;;;20835:61;;20889:4;20881:6;20877:17;20867:27;;20835:61;20942:2;20934:6;20931:14;20911:18;20908:38;20905:218;;;-1:-1:-1;;;20976:1:1;20969:88;21080:4;21077:1;21070:15;21108:4;21105:1;21098:15;21134:195;21173:3;-1:-1:-1;;21197:5:1;21194:77;21191:103;;;21274:18;;:::i;:::-;-1:-1:-1;21321:1:1;21310:13;;21134:195::o;21334:112::-;21366:1;21392;21382:35;;21397:18;;:::i;:::-;-1:-1:-1;21431:9:1;;21334:112::o;21451:184::-;-1:-1:-1;;;21500:1:1;21493:88;21600:4;21597:1;21590:15;21624:4;21621:1;21614:15;21640:184;-1:-1:-1;;;21689:1:1;21682:88;21789:4;21786:1;21779:15;21813:4;21810:1;21803:15;21829:184;-1:-1:-1;;;21878:1:1;21871:88;21978:4;21975:1;21968:15;22002:4;21999:1;21992:15;22018:184;-1:-1:-1;;;22067:1:1;22060:88;22167:4;22164:1;22157:15;22191:4;22188:1;22181:15;22207:184;-1:-1:-1;;;22256:1:1;22249:88;22356:4;22353:1;22346:15;22380:4;22377:1;22370:15;22396:177;22481:66;22474:5;22470:78;22463:5;22460:89;22450:117;;22563:1;22560;22553:12

Swarm Source

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