ETH Price: $3,416.87 (+1.29%)

Token

Crypto Maze Origin Loot Boxes (CM)
 

Overview

Max Total Supply

779 CM

Holders

290

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 CM
0x4579caf0346bbbecc46dae4c6f719535f175b3cb
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Unrevealed loot box from the Origin Crypto Maze item collection. This box contains 1 to 4 rare items. Never to be minted again! Be a true OG, flexing a rare Origin item, which also enhances the in-game stats of your Cryptomight hero! Choose to keep your item box unrevealed and...

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
LootBoxes

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-25
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.0;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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);
    }
}

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);
    }
}

abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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);
}

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

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);
}

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);
}

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);
}

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);
            }
        }
    }
}

abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

abstract contract ERC721P is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    string private _name;
    string private _symbol;
    address[] internal _owners;
    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
        interfaceId == type(IERC721).interfaceId ||
        interfaceId == type(IERC721Metadata).interfaceId ||
        super.supportsInterface(interfaceId);
    }
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        uint count = 0;
        uint length = _owners.length;
        for( uint i = 0; i < length; ++i ){
            if( owner == _owners[i] ){
                ++count;
            }
        }
        delete length;
        return count;
    }

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

    function name() public view virtual override returns (string memory) {
        return _name;
    }
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721P.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);
    }
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }
    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);
    }
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }
    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);
    }
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }
    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);
    }
    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");
    }
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return tokenId < _owners.length && _owners[tokenId] != address(0);
    }
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721P.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }
    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"
        );
    }
    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);
        _owners.push(to);

        emit Transfer(address(0), to, tokenId);
    }
    
	function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721P.ownerOf(tokenId);

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

        // Clear approvals
        _approve(address(0), tokenId);
        _owners[tokenId] = address(0);

        emit Transfer(owner, address(0), tokenId);
    }
	
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721P.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);
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721P.ownerOf(tokenId), to, tokenId);
    }
    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;
        }
    }
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

abstract contract ERC721Enum is ERC721P, IERC721Enumerable {
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721P) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256 tokenId) {
        require(index < ERC721P.balanceOf(owner), "ERC721Enum: owner ioob");
        uint count;
        for( uint i; i < _owners.length; ++i ){
            if( owner == _owners[i] ){
                if( count == index )
                    return i;
                else
                    ++count;
            }
        }
        require(false, "ERC721Enum: owner ioob");
    }
    function tokensOfOwner(address owner) public view returns (uint256[] memory) {
        require(0 < ERC721P.balanceOf(owner), "ERC721Enum: owner ioob");
        uint256 tokenCount = balanceOf(owner);
        uint256[] memory tokenIds = new uint256[](tokenCount);
        for (uint256 i = 0; i < tokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(owner, i);
        }
        return tokenIds;
    }
    function totalSupply() public view virtual override returns (uint256) {
        return _owners.length;
    }
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enum.totalSupply(), "ERC721Enum: global ioob");
        return index;
    }
}

abstract contract items{
   function mint(address user, uint256 count) external virtual;
}

contract LootBoxes is ERC721Enum, Ownable, ReentrancyGuard {
	using Strings for uint256;
	uint256 public NFT_MINTED;
	uint256 public BOX_REVEALED;
    string private baseURI;

	address public CryptomightsUnrevealed;
	items public itemsInstance = items(0xaD03209558fCCF81C1488e738298275502C6A421);
	
    constructor() ERC721P('Crypto Maze Origin Loot Boxes', 'CM') {}

    function _baseURI() internal view virtual returns (string memory) {
        return baseURI;
    }
	
	function mint(address recipient, uint256 count) external nonReentrant{
	    require(_msgSender() == CryptomightsUnrevealed, "Incorrect Request");
		uint256 totalSupply = totalSupply();
		for (uint256 i = 0; i < count; i++) {
             if (recipient != address(0)) {
                 _safeMint(recipient, totalSupply + i);
	             NFT_MINTED++;
             }
         }
    }
	
	function revealBox(uint256[] calldata ids) external nonReentrant{
		for (uint256 i = 0; i < ids.length; i++) {
			  uint256 tokenid = ids[i];
			  uint256 count = random();
			  require(ownerOf(tokenid) == msg.sender, "Incorrect owner");
			  _burn(tokenid);
		      itemsInstance.mint(msg.sender, count);
	          BOX_REVEALED++;
         }
    }
	
    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        require(_exists(_tokenId), "ERC721Metadata: Nonexistent token");
        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0	? string(abi.encodePacked(currentBaseURI)) : "";
    }
	
    function transferFrom(address _from, address _to, uint256 _tokenId) public override {
        ERC721P.transferFrom(_from, _to, _tokenId);
    }

    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory _data) public override {
        ERC721P.safeTransferFrom(_from, _to, _tokenId, _data);
    }

	function setBaseURI(string memory newBaseURI) external onlyOwner {
        require(bytes(newBaseURI).length != 0, "Invalid new URI");
        baseURI = newBaseURI;
    }
	
	function setCryptoMightsUnrevealedAddress(address newAddress) external onlyOwner {
        require(newAddress != address(0), "Invalid new address");
        CryptomightsUnrevealed = newAddress;
    }
	
	function random() public view returns(uint){
        uint rand = uint(keccak256(abi.encodePacked(block.timestamp,block.difficulty, msg.sender))) % 4;
		return rand + 1;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BOX_REVEALED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CryptomightsUnrevealed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_MINTED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"itemsInstance","outputs":[{"internalType":"contract items","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"random","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"revealBox","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setCryptoMightsUnrevealedAddress","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":"tokenId","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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"}]

6080604052600b80546001600160a01b03191673ad03209558fccf81c1488e738298275502c6a4211790553480156200003757600080fd5b50604080518082018252601d81527f43727970746f204d617a65204f726967696e204c6f6f7420426f786573000000602080830191825283518085019094526002845261434d60f01b90840152815191929162000097916000916200012b565b508051620000ad9060019060208401906200012b565b505050620000ca620000c4620000d560201b60201c565b620000d9565b60016006556200020e565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200013990620001d1565b90600052602060002090601f0160209004810192826200015d5760008555620001a8565b82601f106200017857805160ff1916838001178555620001a8565b82800160010185558215620001a8579182015b82811115620001a85782518255916020019190600101906200018b565b50620001b6929150620001ba565b5090565b5b80821115620001b65760008155600101620001bb565b600281046001821680620001e657607f821691505b602082108114156200020857634e487b7160e01b600052602260045260246000fd5b50919050565b612064806200021e6000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c80636352211e1161010457806395d89b41116100a2578063cd9bfebd11610071578063cd9bfebd14610398578063e1b8a756146103a0578063e985e9c5146103b3578063f2fde38b146103c6576101cf565b806395d89b4114610357578063a22cb4651461035f578063b88d4fde14610372578063c87b56dd14610385576101cf565b8063715018a6116100de578063715018a6146103145780638462151c1461031c5780638a4e0cd71461033c5780638da5cb5b1461034f576101cf565b80636352211e146102e65780636ca6e444146102f957806370a0823114610301576101cf565b80632f745c59116101715780634f6ccce71161014b5780634f6ccce7146102b057806355f804b3146102c35780635658e02f146102d65780635ec01e4d146102de576101cf565b80632f745c591461027757806340c10f191461028a57806342842e0e1461029d576101cf565b8063095ea7b3116101ad578063095ea7b31461023257806318160ddd1461024757806323b872dd1461025c5780632a37d0151461026f576101cf565b806301ffc9a7146101d457806306fdde03146101fd578063081812fc14610212575b600080fd5b6101e76101e23660046117b7565b6103d9565b6040516101f4919061196b565b60405180910390f35b610205610406565b6040516101f49190611976565b610225610220366004611835565b610498565b6040516101f491906118bd565b61024561024036600461171f565b6104e4565b005b61024f61057c565b6040516101f49190611f29565b61024561026a366004611631565b610582565b61024f61058d565b61024f61028536600461171f565b610593565b61024561029836600461171f565b610656565b6102456102ab366004611631565b610724565b61024f6102be366004611835565b61073f565b6102456102d13660046117ef565b61076b565b61024f6107df565b61024f6107e5565b6102256102f4366004611835565b610835565b61022561088d565b61024f61030f3660046115e5565b61089c565b610245610939565b61032f61032a3660046115e5565b610984565b6040516101f49190611927565b61024561034a3660046115e5565b610a6a565b610225610af1565b610205610b00565b61024561036d3660046116e5565b610b0f565b61024561038036600461166c565b610bdd565b610205610393366004611835565b610bef565b610225610c68565b6102456103ae366004611748565b610c77565b6101e76103c13660046115ff565b610db3565b6102456103d43660046115e5565b610de1565b60006001600160e01b0319821663780e9d6360e01b14806103fe57506103fe82610e52565b90505b919050565b60606000805461041590611f76565b80601f016020809104026020016040519081016040528092919081815260200182805461044190611f76565b801561048e5780601f106104635761010080835404028352916020019161048e565b820191906000526020600020905b81548152906001019060200180831161047157829003601f168201915b5050505050905090565b60006104a382610e92565b6104c85760405162461bcd60e51b81526004016104bf90611cdd565b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b60006104ef82610835565b9050806001600160a01b0316836001600160a01b031614156105235760405162461bcd60e51b81526004016104bf90611e37565b806001600160a01b0316610535610eea565b6001600160a01b031614806105515750610551816103c1610eea565b61056d5760405162461bcd60e51b81526004016104bf90611bb8565b6105778383610eee565b505050565b60025490565b610577838383610f5c565b60085481565b600061059e8361089c565b82106105bc5760405162461bcd60e51b81526004016104bf90611dd0565b6000805b60025481101561063757600281815481106105eb57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0386811691161415610627578382141561061b5791506106509050565b61062482611fb1565b91505b61063081611fb1565b90506105c0565b5060405162461bcd60e51b81526004016104bf90611dd0565b92915050565b600260065414156106795760405162461bcd60e51b81526004016104bf90611ec9565b6002600655600a546001600160a01b0316610692610eea565b6001600160a01b0316146106b85760405162461bcd60e51b81526004016104bf906119ca565b60006106c261057c565b905060005b82811015610719576001600160a01b03841615610707576106f1846106ec8385611f32565b610f94565b6007805490600061070183611fb1565b91905055505b8061071181611fb1565b9150506106c7565b505060016006555050565b61057783838360405180602001604052806000815250610bdd565b600061074961057c565b82106107675760405162461bcd60e51b81526004016104bf90611e00565b5090565b610773610eea565b6001600160a01b0316610784610af1565b6001600160a01b0316146107aa5760405162461bcd60e51b81526004016104bf90611d52565b80516107c85760405162461bcd60e51b81526004016104bf90611f00565b80516107db9060099060208401906114ce565b5050565b60075481565b60008060044244336040516020016107ff93929190611895565b6040516020818303038152906040528051906020012060001c6108229190611fcc565b905061082f816001611f32565b91505090565b6000806002838154811061085957634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03169050806103fe5760405162461bcd60e51b81526004016104bf90611c5f565b600a546001600160a01b031681565b60006001600160a01b0382166108c45760405162461bcd60e51b81526004016104bf90611c15565b600254600090815b8181101561093057600281815481106108f557634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03868116911614156109205761091d83611fb1565b92505b61092981611fb1565b90506108cc565b50909392505050565b610941610eea565b6001600160a01b0316610952610af1565b6001600160a01b0316146109785760405162461bcd60e51b81526004016104bf90611d52565b6109826000610fae565b565b606061098f8261089c565b6000106109ae5760405162461bcd60e51b81526004016104bf90611dd0565b60006109b98361089c565b905060008167ffffffffffffffff8111156109e457634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610a0d578160200160208202803683370190505b50905060005b82811015610a6257610a258582610593565b828281518110610a4557634e487b7160e01b600052603260045260246000fd5b602090810291909101015280610a5a81611fb1565b915050610a13565b509392505050565b610a72610eea565b6001600160a01b0316610a83610af1565b6001600160a01b031614610aa95760405162461bcd60e51b81526004016104bf90611d52565b6001600160a01b038116610acf5760405162461bcd60e51b81526004016104bf90611b8b565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031690565b60606001805461041590611f76565b610b17610eea565b6001600160a01b0316826001600160a01b03161415610b485760405162461bcd60e51b81526004016104bf90611b08565b8060046000610b55610eea565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610b99610eea565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610bd1919061196b565b60405180910390a35050565b610be984848484611000565b50505050565b6060610bfa82610e92565b610c165760405162461bcd60e51b81526004016104bf90611989565b6000610c20611039565b90506000815111610c405760405180602001604052806000815250610c61565b80604051602001610c519190611879565b6040516020818303038152906040525b9392505050565b600b546001600160a01b031681565b60026006541415610c9a5760405162461bcd60e51b81526004016104bf90611ec9565b600260065560005b81811015610da9576000838383818110610ccc57634e487b7160e01b600052603260045260246000fd5b9050602002013590506000610cdf6107e5565b905033610ceb83610835565b6001600160a01b031614610d115760405162461bcd60e51b81526004016104bf90611d29565b610d1a82611048565b600b546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990610d4c903390859060040161190e565b600060405180830381600087803b158015610d6657600080fd5b505af1158015610d7a573d6000803e3d6000fd5b505060088054925090506000610d8f83611fb1565b919050555050508080610da190611fb1565b915050610ca2565b5050600160065550565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b610de9610eea565b6001600160a01b0316610dfa610af1565b6001600160a01b031614610e205760405162461bcd60e51b81526004016104bf90611d52565b6001600160a01b038116610e465760405162461bcd60e51b81526004016104bf90611a47565b610e4f81610fae565b50565b60006001600160e01b031982166380ac58cd60e01b1480610e8357506001600160e01b03198216635b5e139f60e01b145b806103fe57506103fe826110e4565b600254600090821080156103fe575060006001600160a01b031660028381548110610ecd57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316141592915050565b3390565b600081815260036020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610f2382610835565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610f6d610f67610eea565b826110fd565b610f895760405162461bcd60e51b81526004016104bf90611e78565b610577838383611182565b6107db828260405180602001604052806000815250611273565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61101161100b610eea565b836110fd565b61102d5760405162461bcd60e51b81526004016104bf90611e78565b610be9848484846112a6565b60606009805461041590611f76565b600061105382610835565b905061106181600084610577565b61106c600083610eee565b60006002838154811061108f57634e487b7160e01b600052603260045260246000fd5b6000918252602082200180546001600160a01b0319166001600160a01b0393841617905560405184928416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160e01b031981166301ffc9a760e01b14919050565b600061110882610e92565b6111245760405162461bcd60e51b81526004016104bf90611b3f565b600061112f83610835565b9050806001600160a01b0316846001600160a01b0316148061116a5750836001600160a01b031661115f84610498565b6001600160a01b0316145b8061117a575061117a8185610db3565b949350505050565b826001600160a01b031661119582610835565b6001600160a01b0316146111bb5760405162461bcd60e51b81526004016104bf90611d87565b6001600160a01b0382166111e15760405162461bcd60e51b81526004016104bf90611ac4565b6111ec838383610577565b6111f7600082610eee565b816002828154811061121957634e487b7160e01b600052603260045260246000fd5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b61127d83836112d9565b61128a60008484846113ad565b6105775760405162461bcd60e51b81526004016104bf906119f5565b6112b1848484611182565b6112bd848484846113ad565b610be95760405162461bcd60e51b81526004016104bf906119f5565b6001600160a01b0382166112ff5760405162461bcd60e51b81526004016104bf90611ca8565b61130881610e92565b156113255760405162461bcd60e51b81526004016104bf90611a8d565b61133160008383610577565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006113c1846001600160a01b03166114c8565b156114bd57836001600160a01b031663150b7a026113dd610eea565b8786866040518563ffffffff1660e01b81526004016113ff94939291906118d1565b602060405180830381600087803b15801561141957600080fd5b505af1925050508015611449575060408051601f3d908101601f19168201909252611446918101906117d3565b60015b6114a3573d808015611477576040519150601f19603f3d011682016040523d82523d6000602084013e61147c565b606091505b50805161149b5760405162461bcd60e51b81526004016104bf906119f5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061117a565b506001949350505050565b3b151590565b8280546114da90611f76565b90600052602060002090601f0160209004810192826114fc5760008555611542565b82601f1061151557805160ff1916838001178555611542565b82800160010185558215611542579182015b82811115611542578251825591602001919060010190611527565b506107679291505b80821115610767576000815560010161154a565b600067ffffffffffffffff8084111561157957611579612002565b604051601f8501601f19168101602001828111828210171561159d5761159d612002565b6040528481529150818385018610156115b557600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b038116811461040157600080fd5b6000602082840312156115f6578081fd5b610c61826115ce565b60008060408385031215611611578081fd5b61161a836115ce565b9150611628602084016115ce565b90509250929050565b600080600060608486031215611645578081fd5b61164e846115ce565b925061165c602085016115ce565b9150604084013590509250925092565b60008060008060808587031215611681578081fd5b61168a856115ce565b9350611698602086016115ce565b925060408501359150606085013567ffffffffffffffff8111156116ba578182fd5b8501601f810187136116ca578182fd5b6116d98782356020840161155e565b91505092959194509250565b600080604083850312156116f7578182fd5b611700836115ce565b915060208301358015158114611714578182fd5b809150509250929050565b60008060408385031215611731578182fd5b61173a836115ce565b946020939093013593505050565b6000806020838503121561175a578182fd5b823567ffffffffffffffff80821115611771578384fd5b818501915085601f830112611784578384fd5b813581811115611792578485fd5b86602080830285010111156117a5578485fd5b60209290920196919550909350505050565b6000602082840312156117c8578081fd5b8135610c6181612018565b6000602082840312156117e4578081fd5b8151610c6181612018565b600060208284031215611800578081fd5b813567ffffffffffffffff811115611816578182fd5b8201601f81018413611826578182fd5b61117a8482356020840161155e565b600060208284031215611846578081fd5b5035919050565b60008151808452611865816020860160208601611f4a565b601f01601f19169290920160200192915050565b6000825161188b818460208701611f4a565b9190910192915050565b928352602083019190915260601b6bffffffffffffffffffffffff1916604082015260540190565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906119049083018461184d565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b8181101561195f57835183529284019291840191600101611943565b50909695505050505050565b901515815260200190565b600060208252610c61602083018461184d565b60208082526021908201527f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b656040820152603760f91b606082015260800190565b602080825260119082015270125b98dbdc9c9958dd0814995c5d595cdd607a1b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b602080825260139082015272496e76616c6964206e6577206164647265737360681b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252600f908201526e24b731b7b93932b1ba1037bbb732b960891b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b60208082526016908201527522a9219b9918a2b73ab69d1037bbb732b91034b7b7b160511b604082015260600190565b60208082526017908201527f455243373231456e756d3a20676c6f62616c20696f6f62000000000000000000604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600f908201526e496e76616c6964206e65772055524960881b604082015260600190565b90815260200190565b60008219821115611f4557611f45611fec565b500190565b60005b83811015611f65578181015183820152602001611f4d565b83811115610be95750506000910152565b600281046001821680611f8a57607f821691505b60208210811415611fab57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611fc557611fc5611fec565b5060010190565b600082611fe757634e487b7160e01b81526012600452602481fd5b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610e4f57600080fdfea2646970667358221220238dbacd69961d49e30edbe0478baf9e4350b1b35cc18f2347c42f1d9259df9e64736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c80636352211e1161010457806395d89b41116100a2578063cd9bfebd11610071578063cd9bfebd14610398578063e1b8a756146103a0578063e985e9c5146103b3578063f2fde38b146103c6576101cf565b806395d89b4114610357578063a22cb4651461035f578063b88d4fde14610372578063c87b56dd14610385576101cf565b8063715018a6116100de578063715018a6146103145780638462151c1461031c5780638a4e0cd71461033c5780638da5cb5b1461034f576101cf565b80636352211e146102e65780636ca6e444146102f957806370a0823114610301576101cf565b80632f745c59116101715780634f6ccce71161014b5780634f6ccce7146102b057806355f804b3146102c35780635658e02f146102d65780635ec01e4d146102de576101cf565b80632f745c591461027757806340c10f191461028a57806342842e0e1461029d576101cf565b8063095ea7b3116101ad578063095ea7b31461023257806318160ddd1461024757806323b872dd1461025c5780632a37d0151461026f576101cf565b806301ffc9a7146101d457806306fdde03146101fd578063081812fc14610212575b600080fd5b6101e76101e23660046117b7565b6103d9565b6040516101f4919061196b565b60405180910390f35b610205610406565b6040516101f49190611976565b610225610220366004611835565b610498565b6040516101f491906118bd565b61024561024036600461171f565b6104e4565b005b61024f61057c565b6040516101f49190611f29565b61024561026a366004611631565b610582565b61024f61058d565b61024f61028536600461171f565b610593565b61024561029836600461171f565b610656565b6102456102ab366004611631565b610724565b61024f6102be366004611835565b61073f565b6102456102d13660046117ef565b61076b565b61024f6107df565b61024f6107e5565b6102256102f4366004611835565b610835565b61022561088d565b61024f61030f3660046115e5565b61089c565b610245610939565b61032f61032a3660046115e5565b610984565b6040516101f49190611927565b61024561034a3660046115e5565b610a6a565b610225610af1565b610205610b00565b61024561036d3660046116e5565b610b0f565b61024561038036600461166c565b610bdd565b610205610393366004611835565b610bef565b610225610c68565b6102456103ae366004611748565b610c77565b6101e76103c13660046115ff565b610db3565b6102456103d43660046115e5565b610de1565b60006001600160e01b0319821663780e9d6360e01b14806103fe57506103fe82610e52565b90505b919050565b60606000805461041590611f76565b80601f016020809104026020016040519081016040528092919081815260200182805461044190611f76565b801561048e5780601f106104635761010080835404028352916020019161048e565b820191906000526020600020905b81548152906001019060200180831161047157829003601f168201915b5050505050905090565b60006104a382610e92565b6104c85760405162461bcd60e51b81526004016104bf90611cdd565b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b60006104ef82610835565b9050806001600160a01b0316836001600160a01b031614156105235760405162461bcd60e51b81526004016104bf90611e37565b806001600160a01b0316610535610eea565b6001600160a01b031614806105515750610551816103c1610eea565b61056d5760405162461bcd60e51b81526004016104bf90611bb8565b6105778383610eee565b505050565b60025490565b610577838383610f5c565b60085481565b600061059e8361089c565b82106105bc5760405162461bcd60e51b81526004016104bf90611dd0565b6000805b60025481101561063757600281815481106105eb57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0386811691161415610627578382141561061b5791506106509050565b61062482611fb1565b91505b61063081611fb1565b90506105c0565b5060405162461bcd60e51b81526004016104bf90611dd0565b92915050565b600260065414156106795760405162461bcd60e51b81526004016104bf90611ec9565b6002600655600a546001600160a01b0316610692610eea565b6001600160a01b0316146106b85760405162461bcd60e51b81526004016104bf906119ca565b60006106c261057c565b905060005b82811015610719576001600160a01b03841615610707576106f1846106ec8385611f32565b610f94565b6007805490600061070183611fb1565b91905055505b8061071181611fb1565b9150506106c7565b505060016006555050565b61057783838360405180602001604052806000815250610bdd565b600061074961057c565b82106107675760405162461bcd60e51b81526004016104bf90611e00565b5090565b610773610eea565b6001600160a01b0316610784610af1565b6001600160a01b0316146107aa5760405162461bcd60e51b81526004016104bf90611d52565b80516107c85760405162461bcd60e51b81526004016104bf90611f00565b80516107db9060099060208401906114ce565b5050565b60075481565b60008060044244336040516020016107ff93929190611895565b6040516020818303038152906040528051906020012060001c6108229190611fcc565b905061082f816001611f32565b91505090565b6000806002838154811061085957634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03169050806103fe5760405162461bcd60e51b81526004016104bf90611c5f565b600a546001600160a01b031681565b60006001600160a01b0382166108c45760405162461bcd60e51b81526004016104bf90611c15565b600254600090815b8181101561093057600281815481106108f557634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03868116911614156109205761091d83611fb1565b92505b61092981611fb1565b90506108cc565b50909392505050565b610941610eea565b6001600160a01b0316610952610af1565b6001600160a01b0316146109785760405162461bcd60e51b81526004016104bf90611d52565b6109826000610fae565b565b606061098f8261089c565b6000106109ae5760405162461bcd60e51b81526004016104bf90611dd0565b60006109b98361089c565b905060008167ffffffffffffffff8111156109e457634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610a0d578160200160208202803683370190505b50905060005b82811015610a6257610a258582610593565b828281518110610a4557634e487b7160e01b600052603260045260246000fd5b602090810291909101015280610a5a81611fb1565b915050610a13565b509392505050565b610a72610eea565b6001600160a01b0316610a83610af1565b6001600160a01b031614610aa95760405162461bcd60e51b81526004016104bf90611d52565b6001600160a01b038116610acf5760405162461bcd60e51b81526004016104bf90611b8b565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031690565b60606001805461041590611f76565b610b17610eea565b6001600160a01b0316826001600160a01b03161415610b485760405162461bcd60e51b81526004016104bf90611b08565b8060046000610b55610eea565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610b99610eea565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610bd1919061196b565b60405180910390a35050565b610be984848484611000565b50505050565b6060610bfa82610e92565b610c165760405162461bcd60e51b81526004016104bf90611989565b6000610c20611039565b90506000815111610c405760405180602001604052806000815250610c61565b80604051602001610c519190611879565b6040516020818303038152906040525b9392505050565b600b546001600160a01b031681565b60026006541415610c9a5760405162461bcd60e51b81526004016104bf90611ec9565b600260065560005b81811015610da9576000838383818110610ccc57634e487b7160e01b600052603260045260246000fd5b9050602002013590506000610cdf6107e5565b905033610ceb83610835565b6001600160a01b031614610d115760405162461bcd60e51b81526004016104bf90611d29565b610d1a82611048565b600b546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990610d4c903390859060040161190e565b600060405180830381600087803b158015610d6657600080fd5b505af1158015610d7a573d6000803e3d6000fd5b505060088054925090506000610d8f83611fb1565b919050555050508080610da190611fb1565b915050610ca2565b5050600160065550565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b610de9610eea565b6001600160a01b0316610dfa610af1565b6001600160a01b031614610e205760405162461bcd60e51b81526004016104bf90611d52565b6001600160a01b038116610e465760405162461bcd60e51b81526004016104bf90611a47565b610e4f81610fae565b50565b60006001600160e01b031982166380ac58cd60e01b1480610e8357506001600160e01b03198216635b5e139f60e01b145b806103fe57506103fe826110e4565b600254600090821080156103fe575060006001600160a01b031660028381548110610ecd57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316141592915050565b3390565b600081815260036020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610f2382610835565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610f6d610f67610eea565b826110fd565b610f895760405162461bcd60e51b81526004016104bf90611e78565b610577838383611182565b6107db828260405180602001604052806000815250611273565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61101161100b610eea565b836110fd565b61102d5760405162461bcd60e51b81526004016104bf90611e78565b610be9848484846112a6565b60606009805461041590611f76565b600061105382610835565b905061106181600084610577565b61106c600083610eee565b60006002838154811061108f57634e487b7160e01b600052603260045260246000fd5b6000918252602082200180546001600160a01b0319166001600160a01b0393841617905560405184928416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160e01b031981166301ffc9a760e01b14919050565b600061110882610e92565b6111245760405162461bcd60e51b81526004016104bf90611b3f565b600061112f83610835565b9050806001600160a01b0316846001600160a01b0316148061116a5750836001600160a01b031661115f84610498565b6001600160a01b0316145b8061117a575061117a8185610db3565b949350505050565b826001600160a01b031661119582610835565b6001600160a01b0316146111bb5760405162461bcd60e51b81526004016104bf90611d87565b6001600160a01b0382166111e15760405162461bcd60e51b81526004016104bf90611ac4565b6111ec838383610577565b6111f7600082610eee565b816002828154811061121957634e487b7160e01b600052603260045260246000fd5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b61127d83836112d9565b61128a60008484846113ad565b6105775760405162461bcd60e51b81526004016104bf906119f5565b6112b1848484611182565b6112bd848484846113ad565b610be95760405162461bcd60e51b81526004016104bf906119f5565b6001600160a01b0382166112ff5760405162461bcd60e51b81526004016104bf90611ca8565b61130881610e92565b156113255760405162461bcd60e51b81526004016104bf90611a8d565b61133160008383610577565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006113c1846001600160a01b03166114c8565b156114bd57836001600160a01b031663150b7a026113dd610eea565b8786866040518563ffffffff1660e01b81526004016113ff94939291906118d1565b602060405180830381600087803b15801561141957600080fd5b505af1925050508015611449575060408051601f3d908101601f19168201909252611446918101906117d3565b60015b6114a3573d808015611477576040519150601f19603f3d011682016040523d82523d6000602084013e61147c565b606091505b50805161149b5760405162461bcd60e51b81526004016104bf906119f5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061117a565b506001949350505050565b3b151590565b8280546114da90611f76565b90600052602060002090601f0160209004810192826114fc5760008555611542565b82601f1061151557805160ff1916838001178555611542565b82800160010185558215611542579182015b82811115611542578251825591602001919060010190611527565b506107679291505b80821115610767576000815560010161154a565b600067ffffffffffffffff8084111561157957611579612002565b604051601f8501601f19168101602001828111828210171561159d5761159d612002565b6040528481529150818385018610156115b557600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b038116811461040157600080fd5b6000602082840312156115f6578081fd5b610c61826115ce565b60008060408385031215611611578081fd5b61161a836115ce565b9150611628602084016115ce565b90509250929050565b600080600060608486031215611645578081fd5b61164e846115ce565b925061165c602085016115ce565b9150604084013590509250925092565b60008060008060808587031215611681578081fd5b61168a856115ce565b9350611698602086016115ce565b925060408501359150606085013567ffffffffffffffff8111156116ba578182fd5b8501601f810187136116ca578182fd5b6116d98782356020840161155e565b91505092959194509250565b600080604083850312156116f7578182fd5b611700836115ce565b915060208301358015158114611714578182fd5b809150509250929050565b60008060408385031215611731578182fd5b61173a836115ce565b946020939093013593505050565b6000806020838503121561175a578182fd5b823567ffffffffffffffff80821115611771578384fd5b818501915085601f830112611784578384fd5b813581811115611792578485fd5b86602080830285010111156117a5578485fd5b60209290920196919550909350505050565b6000602082840312156117c8578081fd5b8135610c6181612018565b6000602082840312156117e4578081fd5b8151610c6181612018565b600060208284031215611800578081fd5b813567ffffffffffffffff811115611816578182fd5b8201601f81018413611826578182fd5b61117a8482356020840161155e565b600060208284031215611846578081fd5b5035919050565b60008151808452611865816020860160208601611f4a565b601f01601f19169290920160200192915050565b6000825161188b818460208701611f4a565b9190910192915050565b928352602083019190915260601b6bffffffffffffffffffffffff1916604082015260540190565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906119049083018461184d565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b8181101561195f57835183529284019291840191600101611943565b50909695505050505050565b901515815260200190565b600060208252610c61602083018461184d565b60208082526021908201527f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b656040820152603760f91b606082015260800190565b602080825260119082015270125b98dbdc9c9958dd0814995c5d595cdd607a1b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b602080825260139082015272496e76616c6964206e6577206164647265737360681b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252600f908201526e24b731b7b93932b1ba1037bbb732b960891b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b60208082526016908201527522a9219b9918a2b73ab69d1037bbb732b91034b7b7b160511b604082015260600190565b60208082526017908201527f455243373231456e756d3a20676c6f62616c20696f6f62000000000000000000604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600f908201526e496e76616c6964206e65772055524960881b604082015260600190565b90815260200190565b60008219821115611f4557611f45611fec565b500190565b60005b83811015611f65578181015183820152602001611f4d565b83811115610be95750506000910152565b600281046001821680611f8a57607f821691505b60208210811415611fab57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611fc557611fc5611fec565b5060010190565b600082611fe757634e487b7160e01b81526012600452602481fd5b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610e4f57600080fdfea2646970667358221220238dbacd69961d49e30edbe0478baf9e4350b1b35cc18f2347c42f1d9259df9e64736f6c63430008000033

Deployed Bytecode Sourcemap

29888:2488:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28314:225;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22427:100;;;:::i;:::-;;;;;;;:::i;23061:221::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;22643:412::-;;;;;;:::i;:::-;;:::i;:::-;;29475:110;;;:::i;:::-;;;;;;;:::i;31472:145::-;;;;;;:::i;:::-;;:::i;30009:27::-;;;:::i;28545:500::-;;;;;;:::i;:::-;;:::i;30376:393::-;;;;;;:::i;:::-;;:::i;24104:185::-;;;;;;:::i;:::-;;:::i;29591:194::-;;;;;;:::i;:::-;;:::i;31810:172::-;;;;;;:::i;:::-;;:::i;29980:25::-;;;:::i;32196:177::-;;;:::i;22180:239::-;;;;;;:::i;:::-;;:::i;30071:37::-;;;:::i;21753:422::-;;;;;;:::i;:::-;;:::i;1362:94::-;;;:::i;29051:418::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;31988:202::-;;;;;;:::i;:::-;;:::i;711:87::-;;;:::i;22533:104::-;;;:::i;23288:295::-;;;;;;:::i;:::-;;:::i;31625:180::-;;;;;;:::i;:::-;;:::i;31142:321::-;;;;;;:::i;:::-;;:::i;30112:78::-;;;:::i;30775:358::-;;;;;;:::i;:::-;;:::i;23589:164::-;;;;;;:::i;:::-;;:::i;1611:192::-;;;;;;:::i;:::-;;:::i;28314:225::-;28417:4;-1:-1:-1;;;;;;28441:50:0;;-1:-1:-1;;;28441:50:0;;:90;;;28495:36;28519:11;28495:23;:36::i;:::-;28434:97;;28314:225;;;;:::o;22427:100::-;22481:13;22514:5;22507:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22427:100;:::o;23061:221::-;23137:7;23165:16;23173:7;23165;:16::i;:::-;23157:73;;;;-1:-1:-1;;;23157:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;23250:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23250:24:0;;23061:221::o;22643:412::-;22724:13;22740:24;22756:7;22740:15;:24::i;:::-;22724:40;;22789:5;-1:-1:-1;;;;;22783:11:0;:2;-1:-1:-1;;;;;22783:11:0;;;22775:57;;;;-1:-1:-1;;;22775:57:0;;;;;;;:::i;:::-;22883:5;-1:-1:-1;;;;;22867:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;22867:21:0;;:62;;;;22892:37;22909:5;22916:12;:10;:12::i;22892:37::-;22845:168;;;;-1:-1:-1;;;22845:168:0;;;;;;;:::i;:::-;23026:21;23035:2;23039:7;23026:8;:21::i;:::-;22643:412;;;:::o;29475:110::-;29563:7;:14;29475:110;:::o;31472:145::-;31567:42;31588:5;31595:3;31600:8;31567:20;:42::i;30009:27::-;;;;:::o;28545:500::-;28634:15;28678:24;28696:5;28678:17;:24::i;:::-;28670:5;:32;28662:67;;;;-1:-1:-1;;;28662:67:0;;;;;;;:::i;:::-;28740:10;28766:6;28761:226;28778:7;:14;28774:18;;28761:226;;;28827:7;28835:1;28827:10;;;;;;-1:-1:-1;;;28827:10:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28818:19:0;;;28827:10;;28818:19;28814:162;;;28871:5;28862;:14;28858:102;;;28907:1;-1:-1:-1;28900:8:0;;-1:-1:-1;28900:8:0;28858:102;28953:7;;;:::i;:::-;;;28858:102;28794:3;;;:::i;:::-;;;28761:226;;;-1:-1:-1;28997:40:0;;-1:-1:-1;;;28997:40:0;;;;;;;:::i;28545:500::-;;;;;:::o;30376:393::-;4822:1;5418:7;;:19;;5410:63;;;;-1:-1:-1;;;5410:63:0;;;;;;;:::i;:::-;4822:1;5551:7;:18;30477:22:::1;::::0;-1:-1:-1;;;;;30477:22:0::1;30461:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;30461:38:0::1;;30453:68;;;;-1:-1:-1::0;;;30453:68:0::1;;;;;;;:::i;:::-;30526:19;30548:13;:11;:13::i;:::-;30526:35;;30571:9;30566:196;30590:5;30586:1;:9;30566:196;;;-1:-1:-1::0;;;;;30622:23:0;::::1;::::0;30618:132:::1;;30667:37;30677:9:::0;30688:15:::1;30702:1:::0;30688:11;:15:::1;:::i;:::-;30667:9;:37::i;:::-;30721:10;:12:::0;;;:10:::1;:12;::::0;::::1;:::i;:::-;;;;;;30618:132;30597:3:::0;::::1;::::0;::::1;:::i;:::-;;;;30566:196;;;-1:-1:-1::0;;4778:1:0;5730:7;:22;-1:-1:-1;;30376:393:0:o;24104:185::-;24242:39;24259:4;24265:2;24269:7;24242:39;;;;;;;;;;;;:16;:39::i;29591:194::-;29666:7;29702:24;:22;:24::i;:::-;29694:5;:32;29686:68;;;;-1:-1:-1;;;29686:68:0;;;;;;;:::i;:::-;-1:-1:-1;29772:5:0;29591:194::o;31810:172::-;942:12;:10;:12::i;:::-;-1:-1:-1;;;;;931:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;931:23:0;;923:68;;;;-1:-1:-1;;;923:68:0;;;;;;;:::i;:::-;31894:24;;31886:57:::1;;;;-1:-1:-1::0;;;31886:57:0::1;;;;;;;:::i;:::-;31954:20:::0;;::::1;::::0;:7:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;:::-;;31810:172:::0;:::o;29980:25::-;;;;:::o;32196:177::-;32234:4;32250:9;32344:1;32294:15;32310:16;32328:10;32277:62;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32267:73;;;;;;32262:79;;:83;;;;:::i;:::-;32250:95;-1:-1:-1;32357:8:0;32250:95;32364:1;32357:8;:::i;:::-;32350:15;;;32196:177;:::o;22180:239::-;22252:7;22272:13;22288:7;22296;22288:16;;;;;;-1:-1:-1;;;22288:16:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22288:16:0;;-1:-1:-1;22323:19:0;22315:73;;;;-1:-1:-1;;;22315:73:0;;;;;;;:::i;30071:37::-;;;-1:-1:-1;;;;;30071:37:0;;:::o;21753:422::-;21825:7;-1:-1:-1;;;;;21853:19:0;;21845:74;;;;-1:-1:-1;;;21845:74:0;;;;;;;:::i;:::-;21969:7;:14;21930:10;;;21994:127;22015:6;22011:1;:10;21994:127;;;22056:7;22064:1;22056:10;;;;;;-1:-1:-1;;;22056:10:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22047:19:0;;;22056:10;;22047:19;22043:67;;;22087:7;;;:::i;:::-;;;22043:67;22023:3;;;:::i;:::-;;;21994:127;;;-1:-1:-1;22162:5:0;;21753:422;-1:-1:-1;;;21753:422:0:o;1362:94::-;942:12;:10;:12::i;:::-;-1:-1:-1;;;;;931:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;931:23:0;;923:68;;;;-1:-1:-1;;;923:68:0;;;;;;;:::i;:::-;1427:21:::1;1445:1;1427:9;:21::i;:::-;1362:94::o:0;29051:418::-;29110:16;29151:24;29169:5;29151:17;:24::i;:::-;29147:1;:28;29139:63;;;;-1:-1:-1;;;29139:63:0;;;;;;;:::i;:::-;29213:18;29234:16;29244:5;29234:9;:16::i;:::-;29213:37;;29261:25;29303:10;29289:25;;;;;;-1:-1:-1;;;29289:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29289:25:0;;29261:53;;29330:9;29325:111;29349:10;29345:1;:14;29325:111;;;29395:29;29415:5;29422:1;29395:19;:29::i;:::-;29381:8;29390:1;29381:11;;;;;;-1:-1:-1;;;29381:11:0;;;;;;;;;;;;;;;;;;:43;29361:3;;;;:::i;:::-;;;;29325:111;;;-1:-1:-1;29453:8:0;29051:418;-1:-1:-1;;;29051:418:0:o;31988:202::-;942:12;:10;:12::i;:::-;-1:-1:-1;;;;;931:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;931:23:0;;923:68;;;;-1:-1:-1;;;923:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32088:24:0;::::1;32080:56;;;;-1:-1:-1::0;;;32080:56:0::1;;;;;;;:::i;:::-;32147:22;:35:::0;;-1:-1:-1;;;;;;32147:35:0::1;-1:-1:-1::0;;;;;32147:35:0;;;::::1;::::0;;;::::1;::::0;;31988:202::o;711:87::-;784:6;;-1:-1:-1;;;;;784:6:0;711:87;:::o;22533:104::-;22589:13;22622:7;22615:14;;;;;:::i;23288:295::-;23403:12;:10;:12::i;:::-;-1:-1:-1;;;;;23391:24:0;:8;-1:-1:-1;;;;;23391:24:0;;;23383:62;;;;-1:-1:-1;;;23383:62:0;;;;;;;:::i;:::-;23503:8;23458:18;:32;23477:12;:10;:12::i;:::-;-1:-1:-1;;;;;23458:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;23458:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;23458:53:0;;;;;;;;;;;23542:12;:10;:12::i;:::-;-1:-1:-1;;;;;23527:48:0;;23566:8;23527:48;;;;;;:::i;:::-;;;;;;;;23288:295;;:::o;31625:180::-;31744:53;31769:5;31776:3;31781:8;31791:5;31744:24;:53::i;:::-;31625:180;;;;:::o;31142:321::-;31216:13;31250:17;31258:8;31250:7;:17::i;:::-;31242:63;;;;-1:-1:-1;;;31242:63:0;;;;;;;:::i;:::-;31316:28;31347:10;:8;:10::i;:::-;31316:41;;31406:1;31381:14;31375:28;:32;:80;;;;;;;;;;;;;;;;;31434:14;31417:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;31375:80;31368:87;31142:321;-1:-1:-1;;;31142:321:0:o;30112:78::-;;;-1:-1:-1;;;;;30112:78:0;;:::o;30775:358::-;4822:1;5418:7;;:19;;5410:63;;;;-1:-1:-1;;;5410:63:0;;;;;;;:::i;:::-;4822:1;5551:7;:18;30849:9:::1;30844:282;30864:14:::0;;::::1;30844:282;;;30893:15;30911:3;;30915:1;30911:6;;;;;-1:-1:-1::0;;;30911:6:0::1;;;;;;;;;;;;;;;30893:24;;30925:13;30941:8;:6;:8::i;:::-;30925:24:::0;-1:-1:-1;30985:10:0::1;30965:16;30973:7:::0;30965::::1;:16::i;:::-;-1:-1:-1::0;;;;;30965:30:0::1;;30957:58;;;;-1:-1:-1::0;;;30957:58:0::1;;;;;;;:::i;:::-;31023:14;31029:7;31023:5;:14::i;:::-;31048:13;::::0;:37:::1;::::0;-1:-1:-1;;;31048:37:0;;-1:-1:-1;;;;;31048:13:0;;::::1;::::0;:18:::1;::::0;:37:::1;::::0;31067:10:::1;::::0;31079:5;;31048:37:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;31099:12:0::1;:14:::0;;;-1:-1:-1;31099:12:0;-1:-1:-1;31099:12:0::1;:14;::::0;::::1;:::i;:::-;;;;;;30844:282;;30880:3;;;;;:::i;:::-;;;;30844:282;;;-1:-1:-1::0;;4778:1:0;5730:7;:22;-1:-1:-1;30775:358:0:o;23589:164::-;-1:-1:-1;;;;;23710:25:0;;;23686:4;23710:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23589:164::o;1611:192::-;942:12;:10;:12::i;:::-;-1:-1:-1;;;;;931:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;931:23:0;;923:68;;;;-1:-1:-1;;;923:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1700:22:0;::::1;1692:73;;;;-1:-1:-1::0;;;1692:73:0::1;;;;;;;:::i;:::-;1776:19;1786:8;1776:9;:19::i;:::-;1611:192:::0;:::o;21454:293::-;21556:4;-1:-1:-1;;;;;;21589:40:0;;-1:-1:-1;;;21589:40:0;;:101;;-1:-1:-1;;;;;;;21642:48:0;;-1:-1:-1;;;21642:48:0;21589:101;:150;;;;21703:36;21727:11;21703:23;:36::i;24950:155::-;25049:7;:14;25015:4;;25039:24;;:58;;;;;25095:1;-1:-1:-1;;;;;25067:30:0;:7;25075;25067:16;;;;;;-1:-1:-1;;;25067:16:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25067:16:0;:30;;;24950:155;-1:-1:-1;;24950:155:0:o;94:98::-;174:10;94:98;:::o;27129:175::-;27204:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;27204:29:0;-1:-1:-1;;;;;27204:29:0;;;;;;;;:24;;27258;27204;27258:15;:24::i;:::-;-1:-1:-1;;;;;27249:47:0;;;;;;;;;;;27129:175;;:::o;23759:339::-;23954:41;23973:12;:10;:12::i;:::-;23987:7;23954:18;:41::i;:::-;23946:103;;;;-1:-1:-1;;;23946:103:0;;;;;;;:::i;:::-;24062:28;24072:4;24078:2;24082:7;24062:9;:28::i;25466:110::-;25542:26;25552:2;25556:7;25542:26;;;;;;;;;;;;:9;:26::i;1811:173::-;1886:6;;;-1:-1:-1;;;;;1903:17:0;;;-1:-1:-1;;;;;;1903:17:0;;;;;;;1936:40;;1886:6;;;1903:17;1886:6;;1936:40;;1867:16;;1936:40;1811:173;;:::o;24295:328::-;24470:41;24489:12;:10;:12::i;:::-;24503:7;24470:18;:41::i;:::-;24462:103;;;;-1:-1:-1;;;24462:103:0;;;;;;;:::i;:::-;24576:39;24590:4;24596:2;24600:7;24609:5;24576:13;:39::i;30271:99::-;30322:13;30355:7;30348:14;;;;;:::i;26264:333::-;26324:13;26340:24;26356:7;26340:15;:24::i;:::-;26324:40;;26377:48;26398:5;26413:1;26417:7;26377:20;:48::i;:::-;26466:29;26483:1;26487:7;26466:8;:29::i;:::-;26533:1;26506:7;26514;26506:16;;;;;;-1:-1:-1;;;26506:16:0;;;;;;;;;;;;;;;;;:29;;-1:-1:-1;;;;;;26506:29:0;-1:-1:-1;;;;;26506:29:0;;;;;;26553:36;;26581:7;;26553:36;;;;;26506:16;;26553:36;26264:333;;:::o;20833:157::-;-1:-1:-1;;;;;;20942:40:0;;-1:-1:-1;;;20942:40:0;20833:157;;;:::o;25111:349::-;25204:4;25229:16;25237:7;25229;:16::i;:::-;25221:73;;;;-1:-1:-1;;;25221:73:0;;;;;;;:::i;:::-;25305:13;25321:24;25337:7;25321:15;:24::i;:::-;25305:40;;25375:5;-1:-1:-1;;;;;25364:16:0;:7;-1:-1:-1;;;;;25364:16:0;;:51;;;;25408:7;-1:-1:-1;;;;;25384:31:0;:20;25396:7;25384:11;:20::i;:::-;-1:-1:-1;;;;;25384:31:0;;25364:51;:87;;;;25419:32;25436:5;25443:7;25419:16;:32::i;:::-;25356:96;25111:349;-1:-1:-1;;;;25111:349:0:o;26606:517::-;26766:4;-1:-1:-1;;;;;26738:32:0;:24;26754:7;26738:15;:24::i;:::-;-1:-1:-1;;;;;26738:32:0;;26730:86;;;;-1:-1:-1;;;26730:86:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26835:16:0;;26827:65;;;;-1:-1:-1;;;26827:65:0;;;;;;;:::i;:::-;26905:39;26926:4;26932:2;26936:7;26905:20;:39::i;:::-;27009:29;27026:1;27030:7;27009:8;:29::i;:::-;27068:2;27049:7;27057;27049:16;;;;;;-1:-1:-1;;;27049:16:0;;;;;;;;;;;;;;;;;:21;;-1:-1:-1;;;;;;27049:21:0;-1:-1:-1;;;;;27049:21:0;;;;;;27088:27;;27107:7;;27088:27;;;;;;;;;;27049:16;27088:27;26606:517;;;:::o;25582:321::-;25712:18;25718:2;25722:7;25712:5;:18::i;:::-;25763:54;25794:1;25798:2;25802:7;25811:5;25763:22;:54::i;:::-;25741:154;;;;-1:-1:-1;;;25741:154:0;;;;;;;:::i;24629:315::-;24786:28;24796:4;24802:2;24806:7;24786:9;:28::i;:::-;24833:48;24856:4;24862:2;24866:7;24875:5;24833:22;:48::i;:::-;24825:111;;;;-1:-1:-1;;;24825:111:0;;;;;;;:::i;25909:346::-;-1:-1:-1;;;;;25989:16:0;;25981:61;;;;-1:-1:-1;;;25981:61:0;;;;;;;:::i;:::-;26062:16;26070:7;26062;:16::i;:::-;26061:17;26053:58;;;;-1:-1:-1;;;26053:58:0;;;;;;;:::i;:::-;26124:45;26153:1;26157:2;26161:7;26124:20;:45::i;:::-;26180:7;:16;;;;;;;-1:-1:-1;26180:16:0;;;;;;;-1:-1:-1;;;;;;26180:16:0;-1:-1:-1;;;;;26180:16:0;;;;;;;;26214:33;;26239:7;;-1:-1:-1;26214:33:0;;-1:-1:-1;;26214:33:0;25909:346;;:::o;27310:799::-;27465:4;27486:15;:2;-1:-1:-1;;;;;27486:13:0;;:15::i;:::-;27482:620;;;27538:2;-1:-1:-1;;;;;27522:36:0;;27559:12;:10;:12::i;:::-;27573:4;27579:7;27588:5;27522:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27522:72:0;;;;;;;;-1:-1:-1;;27522:72:0;;;;;;;;;;;;:::i;:::-;;;27518:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27764:13:0;;27760:272;;27807:60;;-1:-1:-1;;;27807:60:0;;;;;;;:::i;27760:272::-;27982:6;27976:13;27967:6;27963:2;27959:15;27952:38;27518:529;-1:-1:-1;;;;;;27645:51:0;-1:-1:-1;;;27645:51:0;;-1:-1:-1;27638:58:0;;27482:620;-1:-1:-1;28086:4:0;27310:799;;;;;;:::o;13395:387::-;13718:20;13766:8;;;13395:387::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:607:1;;110:18;151:2;143:6;140:14;137:2;;;157:18;;:::i;:::-;206:2;200:9;279:2;256:17;;-1:-1:-1;;252:31:1;240:44;;286:4;236:55;306:18;;;326:22;;;303:46;300:2;;;352:18;;:::i;:::-;388:2;381:22;436;;;421:6;-1:-1:-1;421:6:1;473:16;;;470:25;-1:-1:-1;467:2:1;;;508:1;505;498:12;467:2;558:6;553:3;546:4;538:6;534:17;521:44;613:1;606:4;597:6;589;585:19;581:30;574:41;;;90:531;;;;;:::o;626:175::-;696:20;;-1:-1:-1;;;;;745:31:1;;735:42;;725:2;;791:1;788;781:12;806:198;;918:2;906:9;897:7;893:23;889:32;886:2;;;939:6;931;924:22;886:2;967:31;988:9;967:31;:::i;1009:274::-;;;1138:2;1126:9;1117:7;1113:23;1109:32;1106:2;;;1159:6;1151;1144:22;1106:2;1187:31;1208:9;1187:31;:::i;:::-;1177:41;;1237:40;1273:2;1262:9;1258:18;1237:40;:::i;:::-;1227:50;;1096:187;;;;;:::o;1288:342::-;;;;1434:2;1422:9;1413:7;1409:23;1405:32;1402:2;;;1455:6;1447;1440:22;1402:2;1483:31;1504:9;1483:31;:::i;:::-;1473:41;;1533:40;1569:2;1558:9;1554:18;1533:40;:::i;:::-;1523:50;;1620:2;1609:9;1605:18;1592:32;1582:42;;1392:238;;;;;:::o;1635:702::-;;;;;1807:3;1795:9;1786:7;1782:23;1778:33;1775:2;;;1829:6;1821;1814:22;1775:2;1857:31;1878:9;1857:31;:::i;:::-;1847:41;;1907:40;1943:2;1932:9;1928:18;1907:40;:::i;:::-;1897:50;;1994:2;1983:9;1979:18;1966:32;1956:42;;2049:2;2038:9;2034:18;2021:32;2076:18;2068:6;2065:30;2062:2;;;2113:6;2105;2098:22;2062:2;2141:22;;2194:4;2186:13;;2182:27;-1:-1:-1;2172:2:1;;2228:6;2220;2213:22;2172:2;2256:75;2323:7;2318:2;2305:16;2300:2;2296;2292:11;2256:75;:::i;:::-;2246:85;;;1765:572;;;;;;;:::o;2342:369::-;;;2468:2;2456:9;2447:7;2443:23;2439:32;2436:2;;;2489:6;2481;2474:22;2436:2;2517:31;2538:9;2517:31;:::i;:::-;2507:41;;2598:2;2587:9;2583:18;2570:32;2645:5;2638:13;2631:21;2624:5;2621:32;2611:2;;2672:6;2664;2657:22;2611:2;2700:5;2690:15;;;2426:285;;;;;:::o;2716:266::-;;;2845:2;2833:9;2824:7;2820:23;2816:32;2813:2;;;2866:6;2858;2851:22;2813:2;2894:31;2915:9;2894:31;:::i;:::-;2884:41;2972:2;2957:18;;;;2944:32;;-1:-1:-1;;;2803:179:1:o;2987:666::-;;;3134:2;3122:9;3113:7;3109:23;3105:32;3102:2;;;3155:6;3147;3140:22;3102:2;3200:9;3187:23;3229:18;3270:2;3262:6;3259:14;3256:2;;;3291:6;3283;3276:22;3256:2;3334:6;3323:9;3319:22;3309:32;;3379:7;3372:4;3368:2;3364:13;3360:27;3350:2;;3406:6;3398;3391:22;3350:2;3451;3438:16;3477:2;3469:6;3466:14;3463:2;;;3498:6;3490;3483:22;3463:2;3557:7;3552:2;3546;3538:6;3534:15;3530:2;3526:24;3522:33;3519:46;3516:2;;;3583:6;3575;3568:22;3516:2;3619;3611:11;;;;;3641:6;;-1:-1:-1;3092:561:1;;-1:-1:-1;;;;3092:561:1:o;3658:257::-;;3769:2;3757:9;3748:7;3744:23;3740:32;3737:2;;;3790:6;3782;3775:22;3737:2;3834:9;3821:23;3853:32;3879:5;3853:32;:::i;3920:261::-;;4042:2;4030:9;4021:7;4017:23;4013:32;4010:2;;;4063:6;4055;4048:22;4010:2;4100:9;4094:16;4119:32;4145:5;4119:32;:::i;4186:482::-;;4308:2;4296:9;4287:7;4283:23;4279:32;4276:2;;;4329:6;4321;4314:22;4276:2;4374:9;4361:23;4407:18;4399:6;4396:30;4393:2;;;4444:6;4436;4429:22;4393:2;4472:22;;4525:4;4517:13;;4513:27;-1:-1:-1;4503:2:1;;4559:6;4551;4544:22;4503:2;4587:75;4654:7;4649:2;4636:16;4631:2;4627;4623:11;4587:75;:::i;4673:190::-;;4785:2;4773:9;4764:7;4760:23;4756:32;4753:2;;;4806:6;4798;4791:22;4753:2;-1:-1:-1;4834:23:1;;4743:120;-1:-1:-1;4743:120:1:o;4868:259::-;;4949:5;4943:12;4976:6;4971:3;4964:19;4992:63;5048:6;5041:4;5036:3;5032:14;5025:4;5018:5;5014:16;4992:63;:::i;:::-;5109:2;5088:15;-1:-1:-1;;5084:29:1;5075:39;;;;5116:4;5071:50;;4919:208;-1:-1:-1;;4919:208:1:o;5132:276::-;;5301:6;5295:13;5317:53;5363:6;5358:3;5351:4;5343:6;5339:17;5317:53;:::i;:::-;5386:16;;;;;5271:137;-1:-1:-1;;5271:137:1:o;5413:359::-;5598:19;;;5642:2;5633:12;;5626:28;;;;5692:2;5688:15;-1:-1:-1;;5684:53:1;5679:2;5670:12;;5663:75;5763:2;5754:12;;5588:184::o;5777:203::-;-1:-1:-1;;;;;5941:32:1;;;;5923:51;;5911:2;5896:18;;5878:102::o;5985:490::-;-1:-1:-1;;;;;6254:15:1;;;6236:34;;6306:15;;6301:2;6286:18;;6279:43;6353:2;6338:18;;6331:34;;;6401:3;6396:2;6381:18;;6374:31;;;5985:490;;6422:47;;6449:19;;6441:6;6422:47;:::i;:::-;6414:55;6188:287;-1:-1:-1;;;;;;6188:287:1:o;6480:274::-;-1:-1:-1;;;;;6672:32:1;;;;6654:51;;6736:2;6721:18;;6714:34;6642:2;6627:18;;6609:145::o;6759:635::-;6930:2;6982:21;;;7052:13;;6955:18;;;7074:22;;;6759:635;;6930:2;7153:15;;;;7127:2;7112:18;;;6759:635;7199:169;7213:6;7210:1;7207:13;7199:169;;;7274:13;;7262:26;;7343:15;;;;7308:12;;;;7235:1;7228:9;7199:169;;;-1:-1:-1;7385:3:1;;6910:484;-1:-1:-1;;;;;;6910:484:1:o;7399:187::-;7564:14;;7557:22;7539:41;;7527:2;7512:18;;7494:92::o;7813:221::-;;7962:2;7951:9;7944:21;7982:46;8024:2;8013:9;8009:18;8001:6;7982:46;:::i;8039:397::-;8241:2;8223:21;;;8280:2;8260:18;;;8253:30;8319:34;8314:2;8299:18;;8292:62;-1:-1:-1;;;8385:2:1;8370:18;;8363:31;8426:3;8411:19;;8213:223::o;8441:341::-;8643:2;8625:21;;;8682:2;8662:18;;;8655:30;-1:-1:-1;;;8716:2:1;8701:18;;8694:47;8773:2;8758:18;;8615:167::o;8787:414::-;8989:2;8971:21;;;9028:2;9008:18;;;9001:30;9067:34;9062:2;9047:18;;9040:62;-1:-1:-1;;;9133:2:1;9118:18;;9111:48;9191:3;9176:19;;8961:240::o;9206:402::-;9408:2;9390:21;;;9447:2;9427:18;;;9420:30;9486:34;9481:2;9466:18;;9459:62;-1:-1:-1;;;9552:2:1;9537:18;;9530:36;9598:3;9583:19;;9380:228::o;9613:352::-;9815:2;9797:21;;;9854:2;9834:18;;;9827:30;9893;9888:2;9873:18;;9866:58;9956:2;9941:18;;9787:178::o;9970:400::-;10172:2;10154:21;;;10211:2;10191:18;;;10184:30;10250:34;10245:2;10230:18;;10223:62;-1:-1:-1;;;10316:2:1;10301:18;;10294:34;10360:3;10345:19;;10144:226::o;10375:349::-;10577:2;10559:21;;;10616:2;10596:18;;;10589:30;10655:27;10650:2;10635:18;;10628:55;10715:2;10700:18;;10549:175::o;10729:408::-;10931:2;10913:21;;;10970:2;10950:18;;;10943:30;11009:34;11004:2;10989:18;;10982:62;-1:-1:-1;;;11075:2:1;11060:18;;11053:42;11127:3;11112:19;;10903:234::o;11142:343::-;11344:2;11326:21;;;11383:2;11363:18;;;11356:30;-1:-1:-1;;;11417:2:1;11402:18;;11395:49;11476:2;11461:18;;11316:169::o;11490:420::-;11692:2;11674:21;;;11731:2;11711:18;;;11704:30;11770:34;11765:2;11750:18;;11743:62;11841:26;11836:2;11821:18;;11814:54;11900:3;11885:19;;11664:246::o;11915:406::-;12117:2;12099:21;;;12156:2;12136:18;;;12129:30;12195:34;12190:2;12175:18;;12168:62;-1:-1:-1;;;12261:2:1;12246:18;;12239:40;12311:3;12296:19;;12089:232::o;12326:405::-;12528:2;12510:21;;;12567:2;12547:18;;;12540:30;12606:34;12601:2;12586:18;;12579:62;-1:-1:-1;;;12672:2:1;12657:18;;12650:39;12721:3;12706:19;;12500:231::o;12736:356::-;12938:2;12920:21;;;12957:18;;;12950:30;13016:34;13011:2;12996:18;;12989:62;13083:2;13068:18;;12910:182::o;13097:408::-;13299:2;13281:21;;;13338:2;13318:18;;;13311:30;13377:34;13372:2;13357:18;;13350:62;-1:-1:-1;;;13443:2:1;13428:18;;13421:42;13495:3;13480:19;;13271:234::o;13510:339::-;13712:2;13694:21;;;13751:2;13731:18;;;13724:30;-1:-1:-1;;;13785:2:1;13770:18;;13763:45;13840:2;13825:18;;13684:165::o;13854:356::-;14056:2;14038:21;;;14075:18;;;14068:30;14134:34;14129:2;14114:18;;14107:62;14201:2;14186:18;;14028:182::o;14215:405::-;14417:2;14399:21;;;14456:2;14436:18;;;14429:30;14495:34;14490:2;14475:18;;14468:62;-1:-1:-1;;;14561:2:1;14546:18;;14539:39;14610:3;14595:19;;14389:231::o;14625:346::-;14827:2;14809:21;;;14866:2;14846:18;;;14839:30;-1:-1:-1;;;14900:2:1;14885:18;;14878:52;14962:2;14947:18;;14799:172::o;14976:347::-;15178:2;15160:21;;;15217:2;15197:18;;;15190:30;15256:25;15251:2;15236:18;;15229:53;15314:2;15299:18;;15150:173::o;15328:397::-;15530:2;15512:21;;;15569:2;15549:18;;;15542:30;15608:34;15603:2;15588:18;;15581:62;-1:-1:-1;;;15674:2:1;15659:18;;15652:31;15715:3;15700:19;;15502:223::o;15730:413::-;15932:2;15914:21;;;15971:2;15951:18;;;15944:30;16010:34;16005:2;15990:18;;15983:62;-1:-1:-1;;;16076:2:1;16061:18;;16054:47;16133:3;16118:19;;15904:239::o;16148:355::-;16350:2;16332:21;;;16389:2;16369:18;;;16362:30;16428:33;16423:2;16408:18;;16401:61;16494:2;16479:18;;16322:181::o;16508:339::-;16710:2;16692:21;;;16749:2;16729:18;;;16722:30;-1:-1:-1;;;16783:2:1;16768:18;;16761:45;16838:2;16823:18;;16682:165::o;16852:177::-;16998:25;;;16986:2;16971:18;;16953:76::o;17034:128::-;;17105:1;17101:6;17098:1;17095:13;17092:2;;;17111:18;;:::i;:::-;-1:-1:-1;17147:9:1;;17082:80::o;17167:258::-;17239:1;17249:113;17263:6;17260:1;17257:13;17249:113;;;17339:11;;;17333:18;17320:11;;;17313:39;17285:2;17278:10;17249:113;;;17380:6;17377:1;17374:13;17371:2;;;-1:-1:-1;;17415:1:1;17397:16;;17390:27;17220:205::o;17430:380::-;17515:1;17505:12;;17562:1;17552:12;;;17573:2;;17627:4;17619:6;17615:17;17605:27;;17573:2;17680;17672:6;17669:14;17649:18;17646:38;17643:2;;;17726:10;17721:3;17717:20;17714:1;17707:31;17761:4;17758:1;17751:15;17789:4;17786:1;17779:15;17643:2;;17485:325;;;:::o;17815:135::-;;-1:-1:-1;;17875:17:1;;17872:2;;;17895:18;;:::i;:::-;-1:-1:-1;17942:1:1;17931:13;;17862:88::o;17955:209::-;;18013:1;18003:2;;-1:-1:-1;;;18038:31:1;;18092:4;18089:1;18082:15;18120:4;18045:1;18110:15;18003:2;-1:-1:-1;18149:9:1;;17993:171::o;18169:127::-;18230:10;18225:3;18221:20;18218:1;18211:31;18261:4;18258:1;18251:15;18285:4;18282:1;18275:15;18301:127;18362:10;18357:3;18353:20;18350:1;18343:31;18393:4;18390:1;18383:15;18417:4;18414:1;18407:15;18433:133;-1:-1:-1;;;;;;18509:32:1;;18499:43;;18489:2;;18556:1;18553;18546:12

Swarm Source

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