ETH Price: $3,460.97 (+2.07%)
Gas: 9 Gwei

Token

CarMan_Metaverse (CMM)
 

Overview

Max Total Supply

1,281 CMM

Holders

409

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
7 CMM
0x9b5A5fBd5C8c733599b624D6da12ff16A56ea1C4
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Welcome to the home of CarMan_Metaverse.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CarMan

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-03-01
*/

// SPDX-License-Identifier: MIT

 /****************************************************************
 **                                                             **
 **   ██████╗ █████╗ ██████╗     ███╗   ███╗ █████╗ ███╗   ██╗  **
 **  ██╔════╝██╔══██╗██╔══██╗    ████╗ ████║██╔══██╗████╗  ██║  **
 **  ██║     ███████║██████╔╝    ██╔████╔██║███████║██╔██╗ ██║  **
 **  ██║     ██╔══██║██╔══██╗    ██║╚██╔╝██║██╔══██║██║╚██╗██║  **
 **  ╚██████╗██║  ██║██║  ██║    ██║ ╚═╝ ██║██║  ██║██║ ╚████║  **
 **   ╚═════╝╚═╝  ╚═╝╚═╝  ╚═╝    ╚═╝     ╚═╝╚═╝  ╚═╝╚═╝  ╚═══╝  **
 **                                                             **
 **   © 2022 iParking                                            **
 **                                                             **
 ****************************************************************/

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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
pragma solidity ^0.8.0;
/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

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

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

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


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

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

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


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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;

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

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

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


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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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



pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _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);
    }
}

pragma solidity >=0.7.0 <0.9.0;

contract CarMan is ERC721Enumerable, Ownable {
  using Strings for uint256;

  string public baseURI;
  string public baseExtension = ".json";
  string public notRevealedUri;
  uint256 public cost = 0.5 ether;
  uint256 public maxSupply = 2000;
  uint256 public maxMintAmount = 10;
  uint256 public nftPerAddressLimit = 10;
  uint256 public currentPhaseMintMaxAmount = 110;

  uint32 public publicSaleStart = 1647136800;
  uint32 public preSaleStart = 1646964000;
  uint32 public vipSaleStart = 1646618400;

  bool public publicSalePaused = true;
  bool public preSalePaused = true;
  bool public vipSalePaused = true;
  
  bool public revealed = false;
  bool public onlyWhitelisted = true;
  address[] whitelistedAddresses;

  mapping(address => uint256) addressMintedBalance;
  mapping(address => uint256) vipMintAmount;

  // addresses to manage this contract
  mapping(address => bool) controllers;


  constructor(
    string memory _name,
    string memory _symbol,
    string memory _initBaseURI,
    string memory _initNotRevealedUri
  ) ERC721(_name, _symbol) {
    baseURI = _initBaseURI;
    notRevealedUri = _initNotRevealedUri;
  }

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

  // public
  function vipSaleMint(uint256 _mintAmount) public {
    require(_mintAmount > 0, "Mint Amount should be bigger than 0");
    require((!vipSalePaused)&&(vipSaleStart <= block.timestamp), "Not Reach VIP Sale Time");
  
    uint256 supply = totalSupply();
    require(_mintAmount > 0, "need to mint at least 1 NFT");
    require(_mintAmount <= maxMintAmount, "max mint amount per session exceeded");
    require(supply + _mintAmount <= currentPhaseMintMaxAmount, "reach current Phase NFT limit");
    require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded");

    require(vipMintAmount[msg.sender] != 0, "user is not VIP");
    uint256 ownerMintedCount = addressMintedBalance[msg.sender];
    uint256 vipMintCount = vipMintAmount[msg.sender];
 
    require(ownerMintedCount + _mintAmount <= vipMintCount, "max VIP Mint Amount exceeded");
    require(ownerMintedCount + _mintAmount <= nftPerAddressLimit, "max NFT per address exceeded");
    
    for (uint256 i = 1; i <= _mintAmount; i++) {
        addressMintedBalance[msg.sender]++;
      _safeMint(msg.sender, supply + i);
    }
  }

  function preSaleMint(uint256 _mintAmount) public payable {
    require(_mintAmount > 0, "Mint Amount should be bigger than 0");
    require((!preSalePaused)&&(preSaleStart <= block.timestamp), "Not Reach Pre Sale Time");
  
    uint256 supply = totalSupply();
    require(_mintAmount > 0, "need to mint at least 1 NFT");
    require(_mintAmount <= maxMintAmount, "max mint amount per session exceeded");
    require(supply + _mintAmount <= currentPhaseMintMaxAmount, "reach current Phase NFT limit");
    require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded");

    if (msg.sender != owner()) {
        if(onlyWhitelisted == true) {
            require(isWhitelisted(msg.sender), "user is not whitelisted");
            uint256 ownerMintedCount = addressMintedBalance[msg.sender];
            require(ownerMintedCount + _mintAmount <= nftPerAddressLimit, "max NFT per address exceeded");
        }
        require(msg.value >= cost * _mintAmount, "insufficient funds");
    }
    
    for (uint256 i = 1; i <= _mintAmount; i++) {
        addressMintedBalance[msg.sender]++;
      _safeMint(msg.sender, supply + i);
    }
  }

  function publicSaleMint(uint256 _mintAmount) public payable {
    require(_mintAmount > 0, "Mint Amount should be bigger than 0");
    require((!publicSalePaused)&&(publicSaleStart <= block.timestamp), "Not Reach Public Sale Time");
  
    uint256 supply = totalSupply();
    require(_mintAmount > 0, "need to mint at least 1 NFT");
    require(_mintAmount <= maxMintAmount, "max mint amount per session exceeded");
    require(supply + _mintAmount <= currentPhaseMintMaxAmount, "reach current Phase NFT limit");
    require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded");

    if (msg.sender != owner()) {
        if(onlyWhitelisted == true) {
            require(isWhitelisted(msg.sender), "user is not whitelisted");
            uint256 ownerMintedCount = addressMintedBalance[msg.sender];
            require(ownerMintedCount + _mintAmount <= nftPerAddressLimit, "max NFT per address exceeded");
        }
        require(msg.value >= cost * _mintAmount, "insufficient funds");
    }
    
    for (uint256 i = 1; i <= _mintAmount; i++) {
        addressMintedBalance[msg.sender]++;
      _safeMint(msg.sender, supply + i);
    }
  }
  
  function isWhitelisted(address _user) public view returns (bool) {
    for (uint i = 0; i < whitelistedAddresses.length; i++) {
      if (whitelistedAddresses[i] == _user) {
          return true;
      }
    }
    return false;
  }

  function walletOfOwner(address _owner) public view returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory tokenIds = new uint256[](ownerTokenCount);
    for (uint256 i; i < ownerTokenCount; i++) {
      tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
    }
    return tokenIds;
  }

  function tokenURI(uint256 tokenId) public view virtual override returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );
    
    if(revealed == false) {
        return notRevealedUri;
    }

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

  function publicSaleIsActive() public view returns (bool) {
    return ( (publicSaleStart <= block.timestamp) && (!publicSalePaused) );
  }

  function preSaleIsActive() public view returns (bool) {
    return ( (preSaleStart <= block.timestamp) && (!preSalePaused) );
  }

  function vipSaleIsActive() public view returns (bool) {
    return ( (vipSaleStart <= block.timestamp) && (!vipSalePaused) );
  }

  function checkVIPMintAmount(address _account) public view returns (uint256) {
    return vipMintAmount[_account];
  }

  // for controller
  function reveal(bool _state) public {
    require(controllers[msg.sender], "Only controllers can operate this function");
    revealed = _state;
  }
  
  function setNftPerAddressLimit(uint256 _limit) public {
    require(controllers[msg.sender], "Only controllers can operate this function");
    nftPerAddressLimit = _limit;
  }
  
  function setCost(uint256 _newCost) public {
    require(controllers[msg.sender], "Only controllers can operate this function");
    cost = _newCost;
  }

  function setmaxMintAmount(uint256 _newmaxMintAmount) public {
    require(controllers[msg.sender], "Only controllers can operate this function");
    maxMintAmount = _newmaxMintAmount;
  }

  function setcurrentPhaseMintMaxAmount(uint256 _newPhaseAmount) public {
    require(controllers[msg.sender], "Only controllers can operate this function");
    currentPhaseMintMaxAmount = _newPhaseAmount;
  }

  function setPublicSaleStart(uint32 timestamp) public {
    require(controllers[msg.sender], "Only controllers can operate this function");
    publicSaleStart = timestamp;
  }
  
  function setPreSaleStart(uint32 timestamp) public {
    require(controllers[msg.sender], "Only controllers can operate this function");
    preSaleStart = timestamp;
  } 

  function setVIPSaleStart(uint32 timestamp) public {
    require(controllers[msg.sender], "Only controllers can operate this function");
    vipSaleStart = timestamp;
  }

  function setBaseURI(string memory _newBaseURI) public {
    require(controllers[msg.sender], "Only controllers can operate this function");
    baseURI = _newBaseURI;
  }

  function setBaseExtension(string memory _newBaseExtension) public {
    require(controllers[msg.sender], "Only controllers can operate this function");
    baseExtension = _newBaseExtension;
  }
  
  function setNotRevealedURI(string memory _notRevealedURI) public {
    require(controllers[msg.sender], "Only controllers can operate this function");
    notRevealedUri = _notRevealedURI;
  }

  function setPreSalePause(bool _state) public {
    require(controllers[msg.sender], "Only controllers can operate this function");
    preSalePaused = _state;
  }

  function setVIPSalePause(bool _state) public {
    require(controllers[msg.sender], "Only controllers can operate this function");
    vipSalePaused = _state;
  }

  function setVIPMintAmount(address[] memory _accounts, uint256[] memory _amounts) public {
    require(controllers[msg.sender], "Only controllers can operate this function");
    require(_accounts.length == _amounts.length, "accounts and amounts array length mismatch");

    for (uint256 i = 0; i < _accounts.length; ++i) {
      vipMintAmount[_accounts[i]]=_amounts[i];
    }
  }

  function setPublicSalePause(bool _state) public {
    require(controllers[msg.sender], "Only controllers can operate this function");
    publicSalePaused = _state;
  }
  
  function setOnlyWhitelisted(bool _state) public {
    require(controllers[msg.sender], "Only controllers can operate this function");
    onlyWhitelisted = _state;
  }
  
  function whitelistUsers(address[] calldata _users) public {
    require(controllers[msg.sender], "Only controllers can operate this function");
    delete whitelistedAddresses;
    whitelistedAddresses = _users;
  }

  //only owner
 
   /**
   * enables an address for management
   * @param controller the address to enable
   */
  function addController(address controller) external onlyOwner {
    controllers[controller] = true;
  }

  /**
   * disables an address for management
   * @param controller the address to disbale
   */
  function removeController(address controller) external onlyOwner {
    controllers[controller] = false;
  }
 
  function withdraw() public onlyOwner {
    (bool success, ) = payable(msg.sender).call{value: address(this).balance}("");
    require(success);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"controller","type":"address"}],"name":"addController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"checkVIPMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentPhaseMintMaxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"preSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"preSalePaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleStart","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSalePaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleStart","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"controller","type":"address"}],"name":"removeController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPreSalePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"timestamp","type":"uint32"}],"name":"setPreSaleStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPublicSalePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"timestamp","type":"uint32"}],"name":"setPublicSaleStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_accounts","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"setVIPMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setVIPSalePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"timestamp","type":"uint32"}],"name":"setVIPSaleStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPhaseAmount","type":"uint256"}],"name":"setcurrentPhaseMintMaxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vipSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"vipSaleMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vipSalePaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vipSaleStart","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040526005608081905264173539b7b760d91b60a09081526200002891600c9190620001e7565b506706f05b59d3b20000600e556107d0600f55600a6010819055601155606e60125560138054600160801b600160701b6d01000000000000000000000000006c0100000000000000000000000063622d502063ffffffff199095169490941763ffffffff60201b191667622aad20000000001763ffffffff60401b19166b6225672000000000000000001760ff60601b19169390931760ff60681b19169290921760ff60701b19169190911761ffff60781b1916179055348015620000ec57600080fd5b5060405162003fff38038062003fff8339810160408190526200010f9162000338565b83518490849062000128906000906020850190620001e7565b5080516200013e906001906020840190620001e7565b5050506200015b620001556200019160201b60201c565b62000195565b81516200017090600b906020850190620001e7565b5080516200018690600d906020840190620001e7565b50505050506200043f565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001f590620003ec565b90600052602060002090601f01602090048101928262000219576000855562000264565b82601f106200023457805160ff191683800117855562000264565b8280016001018555821562000264579182015b828111156200026457825182559160200191906001019062000247565b506200027292915062000276565b5090565b5b8082111562000272576000815560010162000277565b600082601f8301126200029e578081fd5b81516001600160401b0380821115620002bb57620002bb62000429565b6040516020601f8401601f1916820181018381118382101715620002e357620002e362000429565b6040528382528584018101871015620002fa578485fd5b8492505b838310156200031d5785830181015182840182015291820191620002fe565b838311156200032e57848185840101525b5095945050505050565b600080600080608085870312156200034e578384fd5b84516001600160401b038082111562000365578586fd5b62000373888389016200028d565b9550602087015191508082111562000389578485fd5b62000397888389016200028d565b94506040870151915080821115620003ad578384fd5b620003bb888389016200028d565b93506060870151915080821115620003d1578283fd5b50620003e0878288016200028d565b91505092959194509250565b6002810460018216806200040157607f821691505b602082108114156200042357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b613bb0806200044f6000396000f3fe6080604052600436106103c35760003560e01c80637835c635116101f2578063c87b56dd1161010d578063e86ed963116100a0578063f2c4ce1e1161006f578063f2c4ce1e14610a74578063f2fde38b14610a94578063f5db3f1614610ab4578063f6a74ed714610ad4576103c3565b8063e86ed963146109ff578063e985e9c514610a14578063ed1bbe7e14610a34578063edec5f2714610a54576103c3565b8063d2f93809116100dc578063d2f938091461098a578063d5abeb01146109aa578063da3ef23f146109bf578063e13ce875146109df576103c3565b8063c87b56dd14610915578063ce22841014610935578063cfdc15d91461094a578063d0eb26b01461096a576103c3565b8063a7fc7a0711610185578063ba7d2c7611610154578063ba7d2c76146108c1578063bdec8bac146108d6578063c34b289d146108eb578063c668286214610900576103c3565b8063a7fc7a071461084e578063b3ab66b01461086e578063b5cba86d14610881578063b88d4fde146108a1576103c3565b8063940cd05b116101c1578063940cd05b146107e457806395d89b41146108045780639c70b51214610819578063a22cb4651461082e576103c3565b80637835c6351461077c5780637f00c7a61461078f5780638da5cb5b146107af5780639039903c146107c4576103c3565b80633360caa0116102e25780634f6ccce7116102755780636c0360eb116102445780636c0360eb146107125780636e5c8d781461072757806370a0823114610747578063715018a614610767576103c3565b80634f6ccce71461069d57806351830227146106bd57806355f804b3146106d25780636352211e146106f2576103c3565b806340fa89d9116102b157806340fa89d91461061057806342842e0e14610630578063438b63001461065057806344a0d68a1461067d576103c3565b80633360caa0146105a65780633af32abf146105bb5780633c952764146105db5780633ccfd60b146105fb576103c3565b806313faede61161035a578063239c70ae11610329578063239c70ae1461053157806323b872dd146105465780632ad20598146105665780632f745c5914610586576103c3565b806313faede6146104d057806318160ddd146104f25780631f0234d814610507578063222f28d71461051c576103c3565b8063081c8c4411610396578063081c8c4414610462578063095ea7b3146104775780630d5624b3146104995780630fcf2e75146104bb576103c3565b806301ffc9a7146103c8578063069cd573146103fe57806306fdde0314610413578063081812fc14610435575b600080fd5b3480156103d457600080fd5b506103e86103e3366004612f03565b610af4565b6040516103f59190613143565b60405180910390f35b34801561040a57600080fd5b506103e8610b21565b34801561041f57600080fd5b50610428610b31565b6040516103f5919061314e565b34801561044157600080fd5b50610455610450366004612f81565b610bc3565b6040516103f591906130ae565b34801561046e57600080fd5b50610428610c0f565b34801561048357600080fd5b50610497610492366004612d93565b610c9d565b005b3480156104a557600080fd5b506104ae610d35565b6040516103f591906139bf565b3480156104c757600080fd5b506103e8610d49565b3480156104dc57600080fd5b506104e5610d75565b6040516103f591906139b6565b3480156104fe57600080fd5b506104e5610d7b565b34801561051357600080fd5b506103e8610d81565b34801561052857600080fd5b506104e5610db2565b34801561053d57600080fd5b506104e5610db8565b34801561055257600080fd5b50610497610561366004612cb6565b610dbe565b34801561057257600080fd5b50610497610581366004612ee9565b610df6565b34801561059257600080fd5b506104e56105a1366004612d93565b610e43565b3480156105b257600080fd5b506104ae610e95565b3480156105c757600080fd5b506103e86105d6366004612c6a565b610ea1565b3480156105e757600080fd5b506104976105f6366004612ee9565b610f1a565b34801561060757600080fd5b50610497610f67565b34801561061c57600080fd5b5061049761062b366004612f99565b611012565b34801561063c57600080fd5b5061049761064b366004612cb6565b611069565b34801561065c57600080fd5b5061067061066b366004612c6a565b611084565b6040516103f591906130ff565b34801561068957600080fd5b50610497610698366004612f81565b611142565b3480156106a957600080fd5b506104e56106b8366004612f81565b611176565b3480156106c957600080fd5b506103e86111d1565b3480156106de57600080fd5b506104976106ed366004612f3b565b6111e1565b3480156106fe57600080fd5b5061045561070d366004612f81565b611227565b34801561071e57600080fd5b5061042861125c565b34801561073357600080fd5b50610497610742366004612ee9565b611269565b34801561075357600080fd5b506104e5610762366004612c6a565b6112b6565b34801561077357600080fd5b506104976112fa565b61049761078a366004612f81565b611345565b34801561079b57600080fd5b506104976107aa366004612f81565b611566565b3480156107bb57600080fd5b5061045561159a565b3480156107d057600080fd5b506104976107df366004612f99565b6115a9565b3480156107f057600080fd5b506104976107ff366004612ee9565b6115f4565b34801561081057600080fd5b50610428611641565b34801561082557600080fd5b506103e8611650565b34801561083a57600080fd5b50610497610849366004612d6a565b611660565b34801561085a57600080fd5b50610497610869366004612c6a565b61172e565b61049761087c366004612f81565b611791565b34801561088d57600080fd5b5061049761089c366004612f99565b6119a6565b3480156108ad57600080fd5b506104976108bc366004612cf1565b611a00565b3480156108cd57600080fd5b506104e5611a3f565b3480156108e257600080fd5b506104ae611a45565b3480156108f757600080fd5b506103e8611a58565b34801561090c57600080fd5b50610428611a68565b34801561092157600080fd5b50610428610930366004612f81565b611a75565b34801561094157600080fd5b506103e8611b9e565b34801561095657600080fd5b50610497610965366004612ee9565b611bae565b34801561097657600080fd5b50610497610985366004612f81565b611bfb565b34801561099657600080fd5b506104976109a5366004612f81565b611c2f565b3480156109b657600080fd5b506104e5611c63565b3480156109cb57600080fd5b506104976109da366004612f3b565b611c69565b3480156109eb57600080fd5b506104976109fa366004612f81565b611cab565b348015610a0b57600080fd5b506103e8611ea3565b348015610a2057600080fd5b506103e8610a2f366004612c84565b611ed3565b348015610a4057600080fd5b506104e5610a4f366004612c6a565b611f01565b348015610a6057600080fd5b50610497610a6f366004612dbc565b611f1c565b348015610a8057600080fd5b50610497610a8f366004612f3b565b611f63565b348015610aa057600080fd5b50610497610aaf366004612c6a565b611fa5565b348015610ac057600080fd5b50610497610acf366004612e2b565b612013565b348015610ae057600080fd5b50610497610aef366004612c6a565b6120f8565b60006001600160e01b0319821663780e9d6360e01b1480610b195750610b1982612158565b90505b919050565b601354600160601b900460ff1681565b606060008054610b4090613ab8565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6c90613ab8565b8015610bb95780601f10610b8e57610100808354040283529160200191610bb9565b820191906000526020600020905b815481529060010190602001808311610b9c57829003601f168201915b5050505050905090565b6000610bce82612198565b610bf35760405162461bcd60e51b8152600401610bea9061366d565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600d8054610c1c90613ab8565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4890613ab8565b8015610c955780601f10610c6a57610100808354040283529160200191610c95565b820191906000526020600020905b815481529060010190602001808311610c7857829003601f168201915b505050505081565b6000610ca882611227565b9050806001600160a01b0316836001600160a01b03161415610cdc5760405162461bcd60e51b8152600401610bea90613786565b806001600160a01b0316610cee6121b5565b6001600160a01b03161480610d0a5750610d0a81610a2f6121b5565b610d265760405162461bcd60e51b8152600401610bea90613491565b610d3083836121b9565b505050565b601354640100000000900463ffffffff1681565b6013546000904263ffffffff90911611801590610d705750601354600160601b900460ff16155b905090565b600e5481565b60085490565b6013546000904264010000000090910463ffffffff1611801590610d70575050601354600160681b900460ff161590565b60125481565b60105481565b610dcf610dc96121b5565b82612227565b610deb5760405162461bcd60e51b8152600401610bea9061383d565b610d308383836122ac565b3360009081526017602052604090205460ff16610e255760405162461bcd60e51b8152600401610bea90613161565b60138054911515600160701b0260ff60701b19909216919091179055565b6000610e4e836112b6565b8210610e6c5760405162461bcd60e51b8152600401610bea906131ab565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b60135463ffffffff1681565b6000805b601454811015610f1157826001600160a01b031660148281548110610eda57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415610eff576001915050610b1c565b80610f0981613af3565b915050610ea5565b50600092915050565b3360009081526017602052604090205460ff16610f495760405162461bcd60e51b8152600401610bea90613161565b60138054911515600160801b0260ff60801b19909216919091179055565b610f6f6121b5565b6001600160a01b0316610f8061159a565b6001600160a01b031614610fa65760405162461bcd60e51b8152600401610bea906136b9565b6000336001600160a01b031647604051610fbf906130ab565b60006040518083038185875af1925050503d8060008114610ffc576040519150601f19603f3d011682016040523d82523d6000602084013e611001565b606091505b505090508061100f57600080fd5b50565b3360009081526017602052604090205460ff166110415760405162461bcd60e51b8152600401610bea90613161565b6013805463ffffffff9092166401000000000267ffffffff0000000019909216919091179055565b610d3083838360405180602001604052806000815250611a00565b60606000611091836112b6565b905060008167ffffffffffffffff8111156110bc57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156110e5578160200160208202803683370190505b50905060005b8281101561113a576110fd8582610e43565b82828151811061111d57634e487b7160e01b600052603260045260246000fd5b60209081029190910101528061113281613af3565b9150506110eb565b509392505050565b3360009081526017602052604090205460ff166111715760405162461bcd60e51b8152600401610bea90613161565b600e55565b6000611180610d7b565b821061119e5760405162461bcd60e51b8152600401610bea906138fc565b600882815481106111bf57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b601354600160781b900460ff1681565b3360009081526017602052604090205460ff166112105760405162461bcd60e51b8152600401610bea90613161565b805161122390600b906020840190612a75565b5050565b6000818152600260205260408120546001600160a01b031680610b195760405162461bcd60e51b8152600401610bea90613538565b600b8054610c1c90613ab8565b3360009081526017602052604090205460ff166112985760405162461bcd60e51b8152600401610bea90613161565b60138054911515600160601b0260ff60601b19909216919091179055565b60006001600160a01b0382166112de5760405162461bcd60e51b8152600401610bea906134ee565b506001600160a01b031660009081526003602052604090205490565b6113026121b5565b6001600160a01b031661131361159a565b6001600160a01b0316146113395760405162461bcd60e51b8152600401610bea906136b9565b61134360006123d9565b565b600081116113655760405162461bcd60e51b8152600401610bea906135f5565b601354600160681b900460ff1615801561139057506013544264010000000090910463ffffffff1611155b6113ac5760405162461bcd60e51b8152600401610bea906132ee565b60006113b6610d7b565b9050600082116113d85760405162461bcd60e51b8152600401610bea9061397f565b6010548211156113fa5760405162461bcd60e51b8152600401610bea906135b1565b6012546114078383613a2a565b11156114255760405162461bcd60e51b8152600401610bea906138c5565b600f546114328383613a2a565b11156114505760405162461bcd60e51b8152600401610bea90613581565b61145861159a565b6001600160a01b0316336001600160a01b03161461151657601354600160801b900460ff161515600114156114e95761149033610ea1565b6114ac5760405162461bcd60e51b8152600401610bea90613948565b336000908152601560205260409020546011546114c98483613a2a565b11156114e75760405162461bcd60e51b8152600401610bea90613325565b505b81600e546114f79190613a56565b3410156115165760405162461bcd60e51b8152600401610bea90613811565b60015b828111610d305733600090815260156020526040812080549161153b83613af3565b9091555061155490503361154f8385613a2a565b61242b565b8061155e81613af3565b915050611519565b3360009081526017602052604090205460ff166115955760405162461bcd60e51b8152600401610bea90613161565b601055565b600a546001600160a01b031690565b3360009081526017602052604090205460ff166115d85760405162461bcd60e51b8152600401610bea90613161565b6013805463ffffffff191663ffffffff92909216919091179055565b3360009081526017602052604090205460ff166116235760405162461bcd60e51b8152600401610bea90613161565b60138054911515600160781b0260ff60781b19909216919091179055565b606060018054610b4090613ab8565b601354600160801b900460ff1681565b6116686121b5565b6001600160a01b0316826001600160a01b031614156116995760405162461bcd60e51b8152600401610bea906133a0565b80600560006116a66121b5565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556116ea6121b5565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117229190613143565b60405180910390a35050565b6117366121b5565b6001600160a01b031661174761159a565b6001600160a01b03161461176d5760405162461bcd60e51b8152600401610bea906136b9565b6001600160a01b03166000908152601760205260409020805460ff19166001179055565b600081116117b15760405162461bcd60e51b8152600401610bea906135f5565b601354600160601b900460ff161580156117d557506013544263ffffffff90911611155b6117f15760405162461bcd60e51b8152600401610bea906133d7565b60006117fb610d7b565b90506000821161181d5760405162461bcd60e51b8152600401610bea9061397f565b60105482111561183f5760405162461bcd60e51b8152600401610bea906135b1565b60125461184c8383613a2a565b111561186a5760405162461bcd60e51b8152600401610bea906138c5565b600f546118778383613a2a565b11156118955760405162461bcd60e51b8152600401610bea90613581565b61189d61159a565b6001600160a01b0316336001600160a01b03161461195b57601354600160801b900460ff1615156001141561192e576118d533610ea1565b6118f15760405162461bcd60e51b8152600401610bea90613948565b3360009081526015602052604090205460115461190e8483613a2a565b111561192c5760405162461bcd60e51b8152600401610bea90613325565b505b81600e5461193c9190613a56565b34101561195b5760405162461bcd60e51b8152600401610bea90613811565b60015b828111610d305733600090815260156020526040812080549161198083613af3565b9091555061199490503361154f8385613a2a565b8061199e81613af3565b91505061195e565b3360009081526017602052604090205460ff166119d55760405162461bcd60e51b8152600401610bea90613161565b6013805463ffffffff909216600160401b026bffffffff000000000000000019909216919091179055565b611a11611a0b6121b5565b83612227565b611a2d5760405162461bcd60e51b8152600401610bea9061383d565b611a3984848484612445565b50505050565b60115481565b601354600160401b900463ffffffff1681565b601354600160681b900460ff1681565b600c8054610c1c90613ab8565b6060611a8082612198565b611a9c5760405162461bcd60e51b8152600401610bea90613737565b601354600160781b900460ff16611b3f57600d8054611aba90613ab8565b80601f0160208091040260200160405190810160405280929190818152602001828054611ae690613ab8565b8015611b335780601f10611b0857610100808354040283529160200191611b33565b820191906000526020600020905b815481529060010190602001808311611b1657829003601f168201915b50505050509050610b1c565b6000611b49612478565b90506000815111611b695760405180602001604052806000815250611b97565b80611b7384612487565b600c604051602001611b8793929190612fe9565b6040516020818303038152906040525b9392505050565b601354600160701b900460ff1681565b3360009081526017602052604090205460ff16611bdd5760405162461bcd60e51b8152600401610bea90613161565b60138054911515600160681b0260ff60681b19909216919091179055565b3360009081526017602052604090205460ff16611c2a5760405162461bcd60e51b8152600401610bea90613161565b601155565b3360009081526017602052604090205460ff16611c5e5760405162461bcd60e51b8152600401610bea90613161565b601255565b600f5481565b3360009081526017602052604090205460ff16611c985760405162461bcd60e51b8152600401610bea90613161565b805161122390600c906020840190612a75565b60008111611ccb5760405162461bcd60e51b8152600401610bea906135f5565b601354600160701b900460ff16158015611cf5575060135442600160401b90910463ffffffff1611155b611d115760405162461bcd60e51b8152600401610bea9061345a565b6000611d1b610d7b565b905060008211611d3d5760405162461bcd60e51b8152600401610bea9061397f565b601054821115611d5f5760405162461bcd60e51b8152600401610bea906135b1565b601254611d6c8383613a2a565b1115611d8a5760405162461bcd60e51b8152600401610bea906138c5565b600f54611d978383613a2a565b1115611db55760405162461bcd60e51b8152600401610bea90613581565b33600090815260166020526040902054611de15760405162461bcd60e51b8152600401610bea9061328e565b3360009081526015602090815260408083205460169092529091205480611e088584613a2a565b1115611e265760405162461bcd60e51b8152600401610bea9061388e565b601154611e338584613a2a565b1115611e515760405162461bcd60e51b8152600401610bea90613325565b60015b848111611e9c57336000908152601560205260408120805491611e7683613af3565b90915550611e8a90503361154f8387613a2a565b80611e9481613af3565b915050611e54565b5050505050565b60135460009042600160401b90910463ffffffff1611801590610d70575050601354600160701b900460ff161590565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6001600160a01b031660009081526016602052604090205490565b3360009081526017602052604090205460ff16611f4b5760405162461bcd60e51b8152600401610bea90613161565b611f5760146000612af9565b610d3060148383612b17565b3360009081526017602052604090205460ff16611f925760405162461bcd60e51b8152600401610bea90613161565b805161122390600d906020840190612a75565b611fad6121b5565b6001600160a01b0316611fbe61159a565b6001600160a01b031614611fe45760405162461bcd60e51b8152600401610bea906136b9565b6001600160a01b03811661200a5760405162461bcd60e51b8152600401610bea90613248565b61100f816123d9565b3360009081526017602052604090205460ff166120425760405162461bcd60e51b8152600401610bea90613161565b80518251146120635760405162461bcd60e51b8152600401610bea906137c7565b60005b8251811015610d305781818151811061208f57634e487b7160e01b600052603260045260246000fd5b6020026020010151601660008584815181106120bb57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550806120f190613af3565b9050612066565b6121006121b5565b6001600160a01b031661211161159a565b6001600160a01b0316146121375760405162461bcd60e51b8152600401610bea906136b9565b6001600160a01b03166000908152601760205260409020805460ff19169055565b60006001600160e01b031982166380ac58cd60e01b148061218957506001600160e01b03198216635b5e139f60e01b145b80610b195750610b19826125a2565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906121ee82611227565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061223282612198565b61224e5760405162461bcd60e51b8152600401610bea9061340e565b600061225983611227565b9050806001600160a01b0316846001600160a01b031614806122945750836001600160a01b031661228984610bc3565b6001600160a01b0316145b806122a457506122a48185611ed3565b949350505050565b826001600160a01b03166122bf82611227565b6001600160a01b0316146122e55760405162461bcd60e51b8152600401610bea906136ee565b6001600160a01b03821661230b5760405162461bcd60e51b8152600401610bea9061335c565b6123168383836125bb565b6123216000826121b9565b6001600160a01b038316600090815260036020526040812080546001929061234a908490613a75565b90915550506001600160a01b0382166000908152600360205260408120805460019290612378908490613a2a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611223828260405180602001604052806000815250612644565b6124508484846122ac565b61245c84848484612677565b611a395760405162461bcd60e51b8152600401610bea906131f6565b6060600b8054610b4090613ab8565b6060816124ac57506040805180820190915260018152600360fc1b6020820152610b1c565b8160005b81156124d657806124c081613af3565b91506124cf9050600a83613a42565b91506124b0565b60008167ffffffffffffffff8111156124ff57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612529576020820181803683370190505b5090505b84156122a45761253e600183613a75565b915061254b600a86613b0e565b612556906030613a2a565b60f81b81838151811061257957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061259b600a86613a42565b945061252d565b6001600160e01b031981166301ffc9a760e01b14919050565b6125c6838383610d30565b6001600160a01b0383166125e2576125dd81612792565b612605565b816001600160a01b0316836001600160a01b0316146126055761260583826127d6565b6001600160a01b0382166126215761261c81612873565b610d30565b826001600160a01b0316826001600160a01b031614610d3057610d30828261294c565b61264e8383612990565b61265b6000848484612677565b610d305760405162461bcd60e51b8152600401610bea906131f6565b600061268b846001600160a01b0316612a6f565b1561278757836001600160a01b031663150b7a026126a76121b5565b8786866040518563ffffffff1660e01b81526004016126c994939291906130c2565b602060405180830381600087803b1580156126e357600080fd5b505af1925050508015612713575060408051601f3d908101601f1916820190925261271091810190612f1f565b60015b61276d573d808015612741576040519150601f19603f3d011682016040523d82523d6000602084013e612746565b606091505b5080516127655760405162461bcd60e51b8152600401610bea906131f6565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506122a4565b506001949350505050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b600060016127e3846112b6565b6127ed9190613a75565b600083815260076020526040902054909150808214612840576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061288590600190613a75565b600083815260096020526040812054600880549394509092849081106128bb57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600883815481106128ea57634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061293057634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612957836112b6565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166129b65760405162461bcd60e51b8152600401610bea90613638565b6129bf81612198565b156129dc5760405162461bcd60e51b8152600401610bea906132b7565b6129e8600083836125bb565b6001600160a01b0382166000908152600360205260408120805460019290612a11908490613a2a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b828054612a8190613ab8565b90600052602060002090601f016020900481019282612aa35760008555612ae9565b82601f10612abc57805160ff1916838001178555612ae9565b82800160010185558215612ae9579182015b82811115612ae9578251825591602001919060010190612ace565b50612af5929150612b6a565b5090565b508054600082559060005260206000209081019061100f9190612b6a565b828054828255906000526020600020908101928215612ae9579160200282015b82811115612ae95781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612b37565b5b80821115612af55760008155600101612b6b565b600067ffffffffffffffff831115612b9957612b99613b4e565b612bac601f8401601f19166020016139d0565b9050828152838383011115612bc057600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114610b1c57600080fd5b600082601f830112612bfe578081fd5b81356020612c13612c0e836139fa565b6139d0565b8281528181019085830183850287018401881015612c2f578586fd5b855b85811015612c4d57813584529284019290840190600101612c31565b5090979650505050505050565b80358015158114610b1c57600080fd5b600060208284031215612c7b578081fd5b611b9782612bd7565b60008060408385031215612c96578081fd5b612c9f83612bd7565b9150612cad60208401612bd7565b90509250929050565b600080600060608486031215612cca578081fd5b612cd384612bd7565b9250612ce160208501612bd7565b9150604084013590509250925092565b60008060008060808587031215612d06578081fd5b612d0f85612bd7565b9350612d1d60208601612bd7565b925060408501359150606085013567ffffffffffffffff811115612d3f578182fd5b8501601f81018713612d4f578182fd5b612d5e87823560208401612b7f565b91505092959194509250565b60008060408385031215612d7c578182fd5b612d8583612bd7565b9150612cad60208401612c5a565b60008060408385031215612da5578182fd5b612dae83612bd7565b946020939093013593505050565b60008060208385031215612dce578182fd5b823567ffffffffffffffff80821115612de5578384fd5b818501915085601f830112612df8578384fd5b813581811115612e06578485fd5b8660208083028501011115612e19578485fd5b60209290920196919550909350505050565b60008060408385031215612e3d578182fd5b823567ffffffffffffffff80821115612e54578384fd5b818501915085601f830112612e67578384fd5b81356020612e77612c0e836139fa565b82815281810190858301838502870184018b1015612e93578889fd5b8896505b84871015612ebc57612ea881612bd7565b835260019690960195918301918301612e97565b5096505086013592505080821115612ed2578283fd5b50612edf85828601612bee565b9150509250929050565b600060208284031215612efa578081fd5b611b9782612c5a565b600060208284031215612f14578081fd5b8135611b9781613b64565b600060208284031215612f30578081fd5b8151611b9781613b64565b600060208284031215612f4c578081fd5b813567ffffffffffffffff811115612f62578182fd5b8201601f81018413612f72578182fd5b6122a484823560208401612b7f565b600060208284031215612f92578081fd5b5035919050565b600060208284031215612faa578081fd5b813563ffffffff81168114611b97578182fd5b60008151808452612fd5816020860160208601613a8c565b601f01601f19169290920160200192915050565b600084516020612ffc8285838a01613a8c565b85519184019161300f8184848a01613a8c565b855492019183906002810460018083168061302b57607f831692505b85831081141561304957634e487b7160e01b88526022600452602488fd5b80801561305d576001811461306e5761309a565b60ff1985168852838801955061309a565b6130778b613a1e565b895b858110156130925781548a820152908401908801613079565b505083880195505b50939b9a5050505050505050505050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906130f590830184612fbd565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156131375783518352928401929184019160010161311b565b50909695505050505050565b901515815260200190565b600060208252611b976020830184612fbd565b6020808252602a908201527f4f6e6c7920636f6e74726f6c6c6572732063616e206f706572617465207468696040820152693990333ab731ba34b7b760b11b606082015260800190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252600f908201526e075736572206973206e6f742056495608c1b604082015260600190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526017908201527f4e6f74205265616368205072652053616c652054696d65000000000000000000604082015260600190565b6020808252601c908201527f6d6178204e465420706572206164647265737320657863656564656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601a908201527f4e6f74205265616368205075626c69632053616c652054696d65000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526017908201527f4e6f74205265616368205649502053616c652054696d65000000000000000000604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252601690820152751b585e08139195081b1a5b5a5d08195e18d95959195960521b604082015260600190565b60208082526024908201527f6d6178206d696e7420616d6f756e74207065722073657373696f6e20657863656040820152631959195960e21b606082015260800190565b60208082526023908201527f4d696e7420416d6f756e742073686f756c64206265206269676765722074686160408201526206e20360ec1b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b6020808252602a908201527f6163636f756e747320616e6420616d6f756e7473206172726179206c656e67746040820152690d040dad2e6dac2e8c6d60b31b606082015260800190565b602080825260129082015271696e73756666696369656e742066756e647360701b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601c908201527f6d617820564950204d696e7420416d6f756e7420657863656564656400000000604082015260600190565b6020808252601d908201527f72656163682063757272656e74205068617365204e4654206c696d6974000000604082015260600190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b60208082526017908201527f75736572206973206e6f742077686974656c6973746564000000000000000000604082015260600190565b6020808252601b908201527f6e65656420746f206d696e74206174206c656173742031204e46540000000000604082015260600190565b90815260200190565b63ffffffff91909116815260200190565b60405181810167ffffffffffffffff811182821017156139f2576139f2613b4e565b604052919050565b600067ffffffffffffffff821115613a1457613a14613b4e565b5060209081020190565b60009081526020902090565b60008219821115613a3d57613a3d613b22565b500190565b600082613a5157613a51613b38565b500490565b6000816000190483118215151615613a7057613a70613b22565b500290565b600082821015613a8757613a87613b22565b500390565b60005b83811015613aa7578181015183820152602001613a8f565b83811115611a395750506000910152565b600281046001821680613acc57607f821691505b60208210811415613aed57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613b0757613b07613b22565b5060010190565b600082613b1d57613b1d613b38565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461100f57600080fdfea264697066735822122005af62952eaa62c6fe9c93b75f7c42c3982810f762d1c30b92f46c3e5044dfda64736f6c63430008000033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000104361724d616e5f4d6574617665727365000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003434d4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d5238506b4472756e4b6d334c417a4e7847757635587141787455396e337a35586d4b47457437686e6a6262362f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103c35760003560e01c80637835c635116101f2578063c87b56dd1161010d578063e86ed963116100a0578063f2c4ce1e1161006f578063f2c4ce1e14610a74578063f2fde38b14610a94578063f5db3f1614610ab4578063f6a74ed714610ad4576103c3565b8063e86ed963146109ff578063e985e9c514610a14578063ed1bbe7e14610a34578063edec5f2714610a54576103c3565b8063d2f93809116100dc578063d2f938091461098a578063d5abeb01146109aa578063da3ef23f146109bf578063e13ce875146109df576103c3565b8063c87b56dd14610915578063ce22841014610935578063cfdc15d91461094a578063d0eb26b01461096a576103c3565b8063a7fc7a0711610185578063ba7d2c7611610154578063ba7d2c76146108c1578063bdec8bac146108d6578063c34b289d146108eb578063c668286214610900576103c3565b8063a7fc7a071461084e578063b3ab66b01461086e578063b5cba86d14610881578063b88d4fde146108a1576103c3565b8063940cd05b116101c1578063940cd05b146107e457806395d89b41146108045780639c70b51214610819578063a22cb4651461082e576103c3565b80637835c6351461077c5780637f00c7a61461078f5780638da5cb5b146107af5780639039903c146107c4576103c3565b80633360caa0116102e25780634f6ccce7116102755780636c0360eb116102445780636c0360eb146107125780636e5c8d781461072757806370a0823114610747578063715018a614610767576103c3565b80634f6ccce71461069d57806351830227146106bd57806355f804b3146106d25780636352211e146106f2576103c3565b806340fa89d9116102b157806340fa89d91461061057806342842e0e14610630578063438b63001461065057806344a0d68a1461067d576103c3565b80633360caa0146105a65780633af32abf146105bb5780633c952764146105db5780633ccfd60b146105fb576103c3565b806313faede61161035a578063239c70ae11610329578063239c70ae1461053157806323b872dd146105465780632ad20598146105665780632f745c5914610586576103c3565b806313faede6146104d057806318160ddd146104f25780631f0234d814610507578063222f28d71461051c576103c3565b8063081c8c4411610396578063081c8c4414610462578063095ea7b3146104775780630d5624b3146104995780630fcf2e75146104bb576103c3565b806301ffc9a7146103c8578063069cd573146103fe57806306fdde0314610413578063081812fc14610435575b600080fd5b3480156103d457600080fd5b506103e86103e3366004612f03565b610af4565b6040516103f59190613143565b60405180910390f35b34801561040a57600080fd5b506103e8610b21565b34801561041f57600080fd5b50610428610b31565b6040516103f5919061314e565b34801561044157600080fd5b50610455610450366004612f81565b610bc3565b6040516103f591906130ae565b34801561046e57600080fd5b50610428610c0f565b34801561048357600080fd5b50610497610492366004612d93565b610c9d565b005b3480156104a557600080fd5b506104ae610d35565b6040516103f591906139bf565b3480156104c757600080fd5b506103e8610d49565b3480156104dc57600080fd5b506104e5610d75565b6040516103f591906139b6565b3480156104fe57600080fd5b506104e5610d7b565b34801561051357600080fd5b506103e8610d81565b34801561052857600080fd5b506104e5610db2565b34801561053d57600080fd5b506104e5610db8565b34801561055257600080fd5b50610497610561366004612cb6565b610dbe565b34801561057257600080fd5b50610497610581366004612ee9565b610df6565b34801561059257600080fd5b506104e56105a1366004612d93565b610e43565b3480156105b257600080fd5b506104ae610e95565b3480156105c757600080fd5b506103e86105d6366004612c6a565b610ea1565b3480156105e757600080fd5b506104976105f6366004612ee9565b610f1a565b34801561060757600080fd5b50610497610f67565b34801561061c57600080fd5b5061049761062b366004612f99565b611012565b34801561063c57600080fd5b5061049761064b366004612cb6565b611069565b34801561065c57600080fd5b5061067061066b366004612c6a565b611084565b6040516103f591906130ff565b34801561068957600080fd5b50610497610698366004612f81565b611142565b3480156106a957600080fd5b506104e56106b8366004612f81565b611176565b3480156106c957600080fd5b506103e86111d1565b3480156106de57600080fd5b506104976106ed366004612f3b565b6111e1565b3480156106fe57600080fd5b5061045561070d366004612f81565b611227565b34801561071e57600080fd5b5061042861125c565b34801561073357600080fd5b50610497610742366004612ee9565b611269565b34801561075357600080fd5b506104e5610762366004612c6a565b6112b6565b34801561077357600080fd5b506104976112fa565b61049761078a366004612f81565b611345565b34801561079b57600080fd5b506104976107aa366004612f81565b611566565b3480156107bb57600080fd5b5061045561159a565b3480156107d057600080fd5b506104976107df366004612f99565b6115a9565b3480156107f057600080fd5b506104976107ff366004612ee9565b6115f4565b34801561081057600080fd5b50610428611641565b34801561082557600080fd5b506103e8611650565b34801561083a57600080fd5b50610497610849366004612d6a565b611660565b34801561085a57600080fd5b50610497610869366004612c6a565b61172e565b61049761087c366004612f81565b611791565b34801561088d57600080fd5b5061049761089c366004612f99565b6119a6565b3480156108ad57600080fd5b506104976108bc366004612cf1565b611a00565b3480156108cd57600080fd5b506104e5611a3f565b3480156108e257600080fd5b506104ae611a45565b3480156108f757600080fd5b506103e8611a58565b34801561090c57600080fd5b50610428611a68565b34801561092157600080fd5b50610428610930366004612f81565b611a75565b34801561094157600080fd5b506103e8611b9e565b34801561095657600080fd5b50610497610965366004612ee9565b611bae565b34801561097657600080fd5b50610497610985366004612f81565b611bfb565b34801561099657600080fd5b506104976109a5366004612f81565b611c2f565b3480156109b657600080fd5b506104e5611c63565b3480156109cb57600080fd5b506104976109da366004612f3b565b611c69565b3480156109eb57600080fd5b506104976109fa366004612f81565b611cab565b348015610a0b57600080fd5b506103e8611ea3565b348015610a2057600080fd5b506103e8610a2f366004612c84565b611ed3565b348015610a4057600080fd5b506104e5610a4f366004612c6a565b611f01565b348015610a6057600080fd5b50610497610a6f366004612dbc565b611f1c565b348015610a8057600080fd5b50610497610a8f366004612f3b565b611f63565b348015610aa057600080fd5b50610497610aaf366004612c6a565b611fa5565b348015610ac057600080fd5b50610497610acf366004612e2b565b612013565b348015610ae057600080fd5b50610497610aef366004612c6a565b6120f8565b60006001600160e01b0319821663780e9d6360e01b1480610b195750610b1982612158565b90505b919050565b601354600160601b900460ff1681565b606060008054610b4090613ab8565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6c90613ab8565b8015610bb95780601f10610b8e57610100808354040283529160200191610bb9565b820191906000526020600020905b815481529060010190602001808311610b9c57829003601f168201915b5050505050905090565b6000610bce82612198565b610bf35760405162461bcd60e51b8152600401610bea9061366d565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600d8054610c1c90613ab8565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4890613ab8565b8015610c955780601f10610c6a57610100808354040283529160200191610c95565b820191906000526020600020905b815481529060010190602001808311610c7857829003601f168201915b505050505081565b6000610ca882611227565b9050806001600160a01b0316836001600160a01b03161415610cdc5760405162461bcd60e51b8152600401610bea90613786565b806001600160a01b0316610cee6121b5565b6001600160a01b03161480610d0a5750610d0a81610a2f6121b5565b610d265760405162461bcd60e51b8152600401610bea90613491565b610d3083836121b9565b505050565b601354640100000000900463ffffffff1681565b6013546000904263ffffffff90911611801590610d705750601354600160601b900460ff16155b905090565b600e5481565b60085490565b6013546000904264010000000090910463ffffffff1611801590610d70575050601354600160681b900460ff161590565b60125481565b60105481565b610dcf610dc96121b5565b82612227565b610deb5760405162461bcd60e51b8152600401610bea9061383d565b610d308383836122ac565b3360009081526017602052604090205460ff16610e255760405162461bcd60e51b8152600401610bea90613161565b60138054911515600160701b0260ff60701b19909216919091179055565b6000610e4e836112b6565b8210610e6c5760405162461bcd60e51b8152600401610bea906131ab565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b60135463ffffffff1681565b6000805b601454811015610f1157826001600160a01b031660148281548110610eda57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415610eff576001915050610b1c565b80610f0981613af3565b915050610ea5565b50600092915050565b3360009081526017602052604090205460ff16610f495760405162461bcd60e51b8152600401610bea90613161565b60138054911515600160801b0260ff60801b19909216919091179055565b610f6f6121b5565b6001600160a01b0316610f8061159a565b6001600160a01b031614610fa65760405162461bcd60e51b8152600401610bea906136b9565b6000336001600160a01b031647604051610fbf906130ab565b60006040518083038185875af1925050503d8060008114610ffc576040519150601f19603f3d011682016040523d82523d6000602084013e611001565b606091505b505090508061100f57600080fd5b50565b3360009081526017602052604090205460ff166110415760405162461bcd60e51b8152600401610bea90613161565b6013805463ffffffff9092166401000000000267ffffffff0000000019909216919091179055565b610d3083838360405180602001604052806000815250611a00565b60606000611091836112b6565b905060008167ffffffffffffffff8111156110bc57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156110e5578160200160208202803683370190505b50905060005b8281101561113a576110fd8582610e43565b82828151811061111d57634e487b7160e01b600052603260045260246000fd5b60209081029190910101528061113281613af3565b9150506110eb565b509392505050565b3360009081526017602052604090205460ff166111715760405162461bcd60e51b8152600401610bea90613161565b600e55565b6000611180610d7b565b821061119e5760405162461bcd60e51b8152600401610bea906138fc565b600882815481106111bf57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b601354600160781b900460ff1681565b3360009081526017602052604090205460ff166112105760405162461bcd60e51b8152600401610bea90613161565b805161122390600b906020840190612a75565b5050565b6000818152600260205260408120546001600160a01b031680610b195760405162461bcd60e51b8152600401610bea90613538565b600b8054610c1c90613ab8565b3360009081526017602052604090205460ff166112985760405162461bcd60e51b8152600401610bea90613161565b60138054911515600160601b0260ff60601b19909216919091179055565b60006001600160a01b0382166112de5760405162461bcd60e51b8152600401610bea906134ee565b506001600160a01b031660009081526003602052604090205490565b6113026121b5565b6001600160a01b031661131361159a565b6001600160a01b0316146113395760405162461bcd60e51b8152600401610bea906136b9565b61134360006123d9565b565b600081116113655760405162461bcd60e51b8152600401610bea906135f5565b601354600160681b900460ff1615801561139057506013544264010000000090910463ffffffff1611155b6113ac5760405162461bcd60e51b8152600401610bea906132ee565b60006113b6610d7b565b9050600082116113d85760405162461bcd60e51b8152600401610bea9061397f565b6010548211156113fa5760405162461bcd60e51b8152600401610bea906135b1565b6012546114078383613a2a565b11156114255760405162461bcd60e51b8152600401610bea906138c5565b600f546114328383613a2a565b11156114505760405162461bcd60e51b8152600401610bea90613581565b61145861159a565b6001600160a01b0316336001600160a01b03161461151657601354600160801b900460ff161515600114156114e95761149033610ea1565b6114ac5760405162461bcd60e51b8152600401610bea90613948565b336000908152601560205260409020546011546114c98483613a2a565b11156114e75760405162461bcd60e51b8152600401610bea90613325565b505b81600e546114f79190613a56565b3410156115165760405162461bcd60e51b8152600401610bea90613811565b60015b828111610d305733600090815260156020526040812080549161153b83613af3565b9091555061155490503361154f8385613a2a565b61242b565b8061155e81613af3565b915050611519565b3360009081526017602052604090205460ff166115955760405162461bcd60e51b8152600401610bea90613161565b601055565b600a546001600160a01b031690565b3360009081526017602052604090205460ff166115d85760405162461bcd60e51b8152600401610bea90613161565b6013805463ffffffff191663ffffffff92909216919091179055565b3360009081526017602052604090205460ff166116235760405162461bcd60e51b8152600401610bea90613161565b60138054911515600160781b0260ff60781b19909216919091179055565b606060018054610b4090613ab8565b601354600160801b900460ff1681565b6116686121b5565b6001600160a01b0316826001600160a01b031614156116995760405162461bcd60e51b8152600401610bea906133a0565b80600560006116a66121b5565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556116ea6121b5565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117229190613143565b60405180910390a35050565b6117366121b5565b6001600160a01b031661174761159a565b6001600160a01b03161461176d5760405162461bcd60e51b8152600401610bea906136b9565b6001600160a01b03166000908152601760205260409020805460ff19166001179055565b600081116117b15760405162461bcd60e51b8152600401610bea906135f5565b601354600160601b900460ff161580156117d557506013544263ffffffff90911611155b6117f15760405162461bcd60e51b8152600401610bea906133d7565b60006117fb610d7b565b90506000821161181d5760405162461bcd60e51b8152600401610bea9061397f565b60105482111561183f5760405162461bcd60e51b8152600401610bea906135b1565b60125461184c8383613a2a565b111561186a5760405162461bcd60e51b8152600401610bea906138c5565b600f546118778383613a2a565b11156118955760405162461bcd60e51b8152600401610bea90613581565b61189d61159a565b6001600160a01b0316336001600160a01b03161461195b57601354600160801b900460ff1615156001141561192e576118d533610ea1565b6118f15760405162461bcd60e51b8152600401610bea90613948565b3360009081526015602052604090205460115461190e8483613a2a565b111561192c5760405162461bcd60e51b8152600401610bea90613325565b505b81600e5461193c9190613a56565b34101561195b5760405162461bcd60e51b8152600401610bea90613811565b60015b828111610d305733600090815260156020526040812080549161198083613af3565b9091555061199490503361154f8385613a2a565b8061199e81613af3565b91505061195e565b3360009081526017602052604090205460ff166119d55760405162461bcd60e51b8152600401610bea90613161565b6013805463ffffffff909216600160401b026bffffffff000000000000000019909216919091179055565b611a11611a0b6121b5565b83612227565b611a2d5760405162461bcd60e51b8152600401610bea9061383d565b611a3984848484612445565b50505050565b60115481565b601354600160401b900463ffffffff1681565b601354600160681b900460ff1681565b600c8054610c1c90613ab8565b6060611a8082612198565b611a9c5760405162461bcd60e51b8152600401610bea90613737565b601354600160781b900460ff16611b3f57600d8054611aba90613ab8565b80601f0160208091040260200160405190810160405280929190818152602001828054611ae690613ab8565b8015611b335780601f10611b0857610100808354040283529160200191611b33565b820191906000526020600020905b815481529060010190602001808311611b1657829003601f168201915b50505050509050610b1c565b6000611b49612478565b90506000815111611b695760405180602001604052806000815250611b97565b80611b7384612487565b600c604051602001611b8793929190612fe9565b6040516020818303038152906040525b9392505050565b601354600160701b900460ff1681565b3360009081526017602052604090205460ff16611bdd5760405162461bcd60e51b8152600401610bea90613161565b60138054911515600160681b0260ff60681b19909216919091179055565b3360009081526017602052604090205460ff16611c2a5760405162461bcd60e51b8152600401610bea90613161565b601155565b3360009081526017602052604090205460ff16611c5e5760405162461bcd60e51b8152600401610bea90613161565b601255565b600f5481565b3360009081526017602052604090205460ff16611c985760405162461bcd60e51b8152600401610bea90613161565b805161122390600c906020840190612a75565b60008111611ccb5760405162461bcd60e51b8152600401610bea906135f5565b601354600160701b900460ff16158015611cf5575060135442600160401b90910463ffffffff1611155b611d115760405162461bcd60e51b8152600401610bea9061345a565b6000611d1b610d7b565b905060008211611d3d5760405162461bcd60e51b8152600401610bea9061397f565b601054821115611d5f5760405162461bcd60e51b8152600401610bea906135b1565b601254611d6c8383613a2a565b1115611d8a5760405162461bcd60e51b8152600401610bea906138c5565b600f54611d978383613a2a565b1115611db55760405162461bcd60e51b8152600401610bea90613581565b33600090815260166020526040902054611de15760405162461bcd60e51b8152600401610bea9061328e565b3360009081526015602090815260408083205460169092529091205480611e088584613a2a565b1115611e265760405162461bcd60e51b8152600401610bea9061388e565b601154611e338584613a2a565b1115611e515760405162461bcd60e51b8152600401610bea90613325565b60015b848111611e9c57336000908152601560205260408120805491611e7683613af3565b90915550611e8a90503361154f8387613a2a565b80611e9481613af3565b915050611e54565b5050505050565b60135460009042600160401b90910463ffffffff1611801590610d70575050601354600160701b900460ff161590565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6001600160a01b031660009081526016602052604090205490565b3360009081526017602052604090205460ff16611f4b5760405162461bcd60e51b8152600401610bea90613161565b611f5760146000612af9565b610d3060148383612b17565b3360009081526017602052604090205460ff16611f925760405162461bcd60e51b8152600401610bea90613161565b805161122390600d906020840190612a75565b611fad6121b5565b6001600160a01b0316611fbe61159a565b6001600160a01b031614611fe45760405162461bcd60e51b8152600401610bea906136b9565b6001600160a01b03811661200a5760405162461bcd60e51b8152600401610bea90613248565b61100f816123d9565b3360009081526017602052604090205460ff166120425760405162461bcd60e51b8152600401610bea90613161565b80518251146120635760405162461bcd60e51b8152600401610bea906137c7565b60005b8251811015610d305781818151811061208f57634e487b7160e01b600052603260045260246000fd5b6020026020010151601660008584815181106120bb57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550806120f190613af3565b9050612066565b6121006121b5565b6001600160a01b031661211161159a565b6001600160a01b0316146121375760405162461bcd60e51b8152600401610bea906136b9565b6001600160a01b03166000908152601760205260409020805460ff19169055565b60006001600160e01b031982166380ac58cd60e01b148061218957506001600160e01b03198216635b5e139f60e01b145b80610b195750610b19826125a2565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906121ee82611227565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061223282612198565b61224e5760405162461bcd60e51b8152600401610bea9061340e565b600061225983611227565b9050806001600160a01b0316846001600160a01b031614806122945750836001600160a01b031661228984610bc3565b6001600160a01b0316145b806122a457506122a48185611ed3565b949350505050565b826001600160a01b03166122bf82611227565b6001600160a01b0316146122e55760405162461bcd60e51b8152600401610bea906136ee565b6001600160a01b03821661230b5760405162461bcd60e51b8152600401610bea9061335c565b6123168383836125bb565b6123216000826121b9565b6001600160a01b038316600090815260036020526040812080546001929061234a908490613a75565b90915550506001600160a01b0382166000908152600360205260408120805460019290612378908490613a2a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611223828260405180602001604052806000815250612644565b6124508484846122ac565b61245c84848484612677565b611a395760405162461bcd60e51b8152600401610bea906131f6565b6060600b8054610b4090613ab8565b6060816124ac57506040805180820190915260018152600360fc1b6020820152610b1c565b8160005b81156124d657806124c081613af3565b91506124cf9050600a83613a42565b91506124b0565b60008167ffffffffffffffff8111156124ff57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612529576020820181803683370190505b5090505b84156122a45761253e600183613a75565b915061254b600a86613b0e565b612556906030613a2a565b60f81b81838151811061257957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061259b600a86613a42565b945061252d565b6001600160e01b031981166301ffc9a760e01b14919050565b6125c6838383610d30565b6001600160a01b0383166125e2576125dd81612792565b612605565b816001600160a01b0316836001600160a01b0316146126055761260583826127d6565b6001600160a01b0382166126215761261c81612873565b610d30565b826001600160a01b0316826001600160a01b031614610d3057610d30828261294c565b61264e8383612990565b61265b6000848484612677565b610d305760405162461bcd60e51b8152600401610bea906131f6565b600061268b846001600160a01b0316612a6f565b1561278757836001600160a01b031663150b7a026126a76121b5565b8786866040518563ffffffff1660e01b81526004016126c994939291906130c2565b602060405180830381600087803b1580156126e357600080fd5b505af1925050508015612713575060408051601f3d908101601f1916820190925261271091810190612f1f565b60015b61276d573d808015612741576040519150601f19603f3d011682016040523d82523d6000602084013e612746565b606091505b5080516127655760405162461bcd60e51b8152600401610bea906131f6565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506122a4565b506001949350505050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b600060016127e3846112b6565b6127ed9190613a75565b600083815260076020526040902054909150808214612840576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061288590600190613a75565b600083815260096020526040812054600880549394509092849081106128bb57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600883815481106128ea57634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061293057634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612957836112b6565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166129b65760405162461bcd60e51b8152600401610bea90613638565b6129bf81612198565b156129dc5760405162461bcd60e51b8152600401610bea906132b7565b6129e8600083836125bb565b6001600160a01b0382166000908152600360205260408120805460019290612a11908490613a2a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b828054612a8190613ab8565b90600052602060002090601f016020900481019282612aa35760008555612ae9565b82601f10612abc57805160ff1916838001178555612ae9565b82800160010185558215612ae9579182015b82811115612ae9578251825591602001919060010190612ace565b50612af5929150612b6a565b5090565b508054600082559060005260206000209081019061100f9190612b6a565b828054828255906000526020600020908101928215612ae9579160200282015b82811115612ae95781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612b37565b5b80821115612af55760008155600101612b6b565b600067ffffffffffffffff831115612b9957612b99613b4e565b612bac601f8401601f19166020016139d0565b9050828152838383011115612bc057600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114610b1c57600080fd5b600082601f830112612bfe578081fd5b81356020612c13612c0e836139fa565b6139d0565b8281528181019085830183850287018401881015612c2f578586fd5b855b85811015612c4d57813584529284019290840190600101612c31565b5090979650505050505050565b80358015158114610b1c57600080fd5b600060208284031215612c7b578081fd5b611b9782612bd7565b60008060408385031215612c96578081fd5b612c9f83612bd7565b9150612cad60208401612bd7565b90509250929050565b600080600060608486031215612cca578081fd5b612cd384612bd7565b9250612ce160208501612bd7565b9150604084013590509250925092565b60008060008060808587031215612d06578081fd5b612d0f85612bd7565b9350612d1d60208601612bd7565b925060408501359150606085013567ffffffffffffffff811115612d3f578182fd5b8501601f81018713612d4f578182fd5b612d5e87823560208401612b7f565b91505092959194509250565b60008060408385031215612d7c578182fd5b612d8583612bd7565b9150612cad60208401612c5a565b60008060408385031215612da5578182fd5b612dae83612bd7565b946020939093013593505050565b60008060208385031215612dce578182fd5b823567ffffffffffffffff80821115612de5578384fd5b818501915085601f830112612df8578384fd5b813581811115612e06578485fd5b8660208083028501011115612e19578485fd5b60209290920196919550909350505050565b60008060408385031215612e3d578182fd5b823567ffffffffffffffff80821115612e54578384fd5b818501915085601f830112612e67578384fd5b81356020612e77612c0e836139fa565b82815281810190858301838502870184018b1015612e93578889fd5b8896505b84871015612ebc57612ea881612bd7565b835260019690960195918301918301612e97565b5096505086013592505080821115612ed2578283fd5b50612edf85828601612bee565b9150509250929050565b600060208284031215612efa578081fd5b611b9782612c5a565b600060208284031215612f14578081fd5b8135611b9781613b64565b600060208284031215612f30578081fd5b8151611b9781613b64565b600060208284031215612f4c578081fd5b813567ffffffffffffffff811115612f62578182fd5b8201601f81018413612f72578182fd5b6122a484823560208401612b7f565b600060208284031215612f92578081fd5b5035919050565b600060208284031215612faa578081fd5b813563ffffffff81168114611b97578182fd5b60008151808452612fd5816020860160208601613a8c565b601f01601f19169290920160200192915050565b600084516020612ffc8285838a01613a8c565b85519184019161300f8184848a01613a8c565b855492019183906002810460018083168061302b57607f831692505b85831081141561304957634e487b7160e01b88526022600452602488fd5b80801561305d576001811461306e5761309a565b60ff1985168852838801955061309a565b6130778b613a1e565b895b858110156130925781548a820152908401908801613079565b505083880195505b50939b9a5050505050505050505050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906130f590830184612fbd565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156131375783518352928401929184019160010161311b565b50909695505050505050565b901515815260200190565b600060208252611b976020830184612fbd565b6020808252602a908201527f4f6e6c7920636f6e74726f6c6c6572732063616e206f706572617465207468696040820152693990333ab731ba34b7b760b11b606082015260800190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252600f908201526e075736572206973206e6f742056495608c1b604082015260600190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526017908201527f4e6f74205265616368205072652053616c652054696d65000000000000000000604082015260600190565b6020808252601c908201527f6d6178204e465420706572206164647265737320657863656564656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601a908201527f4e6f74205265616368205075626c69632053616c652054696d65000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526017908201527f4e6f74205265616368205649502053616c652054696d65000000000000000000604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252601690820152751b585e08139195081b1a5b5a5d08195e18d95959195960521b604082015260600190565b60208082526024908201527f6d6178206d696e7420616d6f756e74207065722073657373696f6e20657863656040820152631959195960e21b606082015260800190565b60208082526023908201527f4d696e7420416d6f756e742073686f756c64206265206269676765722074686160408201526206e20360ec1b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b6020808252602a908201527f6163636f756e747320616e6420616d6f756e7473206172726179206c656e67746040820152690d040dad2e6dac2e8c6d60b31b606082015260800190565b602080825260129082015271696e73756666696369656e742066756e647360701b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601c908201527f6d617820564950204d696e7420416d6f756e7420657863656564656400000000604082015260600190565b6020808252601d908201527f72656163682063757272656e74205068617365204e4654206c696d6974000000604082015260600190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b60208082526017908201527f75736572206973206e6f742077686974656c6973746564000000000000000000604082015260600190565b6020808252601b908201527f6e65656420746f206d696e74206174206c656173742031204e46540000000000604082015260600190565b90815260200190565b63ffffffff91909116815260200190565b60405181810167ffffffffffffffff811182821017156139f2576139f2613b4e565b604052919050565b600067ffffffffffffffff821115613a1457613a14613b4e565b5060209081020190565b60009081526020902090565b60008219821115613a3d57613a3d613b22565b500190565b600082613a5157613a51613b38565b500490565b6000816000190483118215151615613a7057613a70613b22565b500290565b600082821015613a8757613a87613b22565b500390565b60005b83811015613aa7578181015183820152602001613a8f565b83811115611a395750506000910152565b600281046001821680613acc57607f821691505b60208210811415613aed57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613b0757613b07613b22565b5060010190565b600082613b1d57613b1d613b38565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461100f57600080fdfea264697066735822122005af62952eaa62c6fe9c93b75f7c42c3982810f762d1c30b92f46c3e5044dfda64736f6c63430008000033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000104361724d616e5f4d6574617665727365000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003434d4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d5238506b4472756e4b6d334c417a4e7847757635587141787455396e337a35586d4b47457437686e6a6262362f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): CarMan_Metaverse
Arg [1] : _symbol (string): CMM
Arg [2] : _initBaseURI (string):
Arg [3] : _initNotRevealedUri (string): ipfs://QmR8PkDrunKm3LAzNxGuv5XqAxtU9n3z5XmKGEt7hnjbb6/hidden.json

-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [5] : 4361724d616e5f4d657461766572736500000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [7] : 434d4d0000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000041
Arg [10] : 697066733a2f2f516d5238506b4472756e4b6d334c417a4e7847757635587141
Arg [11] : 787455396e337a35586d4b47457437686e6a6262362f68696464656e2e6a736f
Arg [12] : 6e00000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

44473:10390:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36020:224;;;;;;;;;;-1:-1:-1;36020:224:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44999:35;;;;;;;;;;;;;:::i;23912:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25471:221::-;;;;;;;;;;-1:-1:-1;25471:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;44623:28::-;;;;;;;;;;;;;:::i;24994:411::-;;;;;;;;;;-1:-1:-1;24994:411:0;;;;;:::i;:::-;;:::i;:::-;;44909:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;50329:140::-;;;;;;;;;;;;;:::i;44656:31::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;36660:113::-;;;;;;;;;;;;;:::i;50475:131::-;;;;;;;;;;;;;:::i;44809:46::-;;;;;;;;;;;;;:::i;44728:33::-;;;;;;;;;;;;;:::i;26361:339::-;;;;;;;;;;-1:-1:-1;26361:339:0;;;;;:::i;:::-;;:::i;53115:165::-;;;;;;;;;;-1:-1:-1;53115:165:0;;;;;:::i;:::-;;:::i;36328:256::-;;;;;;;;;;-1:-1:-1;36328:256:0;;;;;:::i;:::-;;:::i;44862:42::-;;;;;;;;;;;;;:::i;49267:239::-;;;;;;;;;;-1:-1:-1;49267:239:0;;;;;:::i;:::-;;:::i;53858:170::-;;;;;;;;;;-1:-1:-1;53858:170:0;;;;;:::i;:::-;;:::i;54710:150::-;;;;;;;;;;;;;:::i;52002:172::-;;;;;;;;;;-1:-1:-1;52002:172:0;;;;;:::i;:::-;;:::i;26771:185::-;;;;;;;;;;-1:-1:-1;26771:185:0;;;;;:::i;:::-;;:::i;49512:333::-;;;;;;;;;;-1:-1:-1;49512:333:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;51241:155::-;;;;;;;;;;-1:-1:-1;51241:155:0;;;;;:::i;:::-;;:::i;36850:233::-;;;;;;;;;;-1:-1:-1;36850:233:0;;;;;:::i;:::-;;:::i;45117:28::-;;;;;;;;;;;;;:::i;52359:173::-;;;;;;;;;;-1:-1:-1;52359:173:0;;;;;:::i;:::-;;:::i;23606:239::-;;;;;;;;;;-1:-1:-1;23606:239:0;;;;;:::i;:::-;;:::i;44555:21::-;;;;;;;;;;;;;:::i;53679:171::-;;;;;;;;;;-1:-1:-1;53679:171:0;;;;;:::i;:::-;;:::i;23336:208::-;;;;;;;;;;-1:-1:-1;23336:208:0;;;;;:::i;:::-;;:::i;43809:94::-;;;;;;;;;;;;;:::i;46919:1161::-;;;;;;:::i;:::-;;:::i;51402:191::-;;;;;;;;;;-1:-1:-1;51402:191:0;;;;;:::i;:::-;;:::i;43158:87::-;;;;;;;;;;;;;:::i;51816:178::-;;;;;;;;;;-1:-1:-1;51816:178:0;;;;;:::i;:::-;;:::i;50895:151::-;;;;;;;;;;-1:-1:-1;50895:151:0;;;;;:::i;:::-;;:::i;24081:104::-;;;;;;;;;;;;;:::i;45150:34::-;;;;;;;;;;;;;:::i;25764:295::-;;;;;;;;;;-1:-1:-1;25764:295:0;;;;;:::i;:::-;;:::i;54381:105::-;;;;;;;;;;-1:-1:-1;54381:105:0;;;;;:::i;:::-;;:::i;48086:1173::-;;;;;;:::i;:::-;;:::i;52181:172::-;;;;;;;;;;-1:-1:-1;52181:172:0;;;;;:::i;:::-;;:::i;27027:328::-;;;;;;;;;;-1:-1:-1;27027:328:0;;;;;:::i;:::-;;:::i;44766:38::-;;;;;;;;;;;;;:::i;44953:39::-;;;;;;;;;;;;;:::i;45039:32::-;;;;;;;;;;;;;:::i;44581:37::-;;;;;;;;;;;;;:::i;49851:472::-;;;;;;;;;;-1:-1:-1;49851:472:0;;;;;:::i;:::-;;:::i;45076:32::-;;;;;;;;;;;;;:::i;52944:165::-;;;;;;;;;;-1:-1:-1;52944:165:0;;;;;:::i;:::-;;:::i;51054:179::-;;;;;;;;;;-1:-1:-1;51054:179:0;;;;;:::i;:::-;;:::i;51599:211::-;;;;;;;;;;-1:-1:-1;51599:211:0;;;;;:::i;:::-;;:::i;44692:31::-;;;;;;;;;;;;;:::i;52538:197::-;;;;;;;;;;-1:-1:-1;52538:197:0;;;;;:::i;:::-;;:::i;45799:1114::-;;;;;;;;;;-1:-1:-1;45799:1114:0;;;;;:::i;:::-;;:::i;50612:131::-;;;;;;;;;;;;;:::i;26130:164::-;;;;;;;;;;-1:-1:-1;26130:164:0;;;;;:::i;:::-;;:::i;50749:119::-;;;;;;;;;;-1:-1:-1;50749:119:0;;;;;:::i;:::-;;:::i;54036:219::-;;;;;;;;;;-1:-1:-1;54036:219:0;;;;;:::i;:::-;;:::i;52743:195::-;;;;;;;;;;-1:-1:-1;52743:195:0;;;;;:::i;:::-;;:::i;44058:192::-;;;;;;;;;;-1:-1:-1;44058:192:0;;;;;:::i;:::-;;:::i;53286:387::-;;;;;;;;;;-1:-1:-1;53286:387:0;;;;;:::i;:::-;;:::i;54594:109::-;;;;;;;;;;-1:-1:-1;54594:109:0;;;;;:::i;:::-;;:::i;36020:224::-;36122:4;-1:-1:-1;;;;;;36146:50:0;;-1:-1:-1;;;36146:50:0;;:90;;;36200:36;36224:11;36200:23;:36::i;:::-;36139:97;;36020:224;;;;:::o;44999:35::-;;;-1:-1:-1;;;44999:35:0;;;;;:::o;23912:100::-;23966:13;23999:5;23992:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23912:100;:::o;25471:221::-;25547:7;25575:16;25583:7;25575;:16::i;:::-;25567:73;;;;-1:-1:-1;;;25567:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;25660:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25660:24:0;;25471:221::o;44623:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24994:411::-;25075:13;25091:23;25106:7;25091:14;:23::i;:::-;25075:39;;25139:5;-1:-1:-1;;;;;25133:11:0;:2;-1:-1:-1;;;;;25133:11:0;;;25125:57;;;;-1:-1:-1;;;25125:57:0;;;;;;;:::i;:::-;25233:5;-1:-1:-1;;;;;25217:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;25217:21:0;;:62;;;;25242:37;25259:5;25266:12;:10;:12::i;25242:37::-;25195:168;;;;-1:-1:-1;;;25195:168:0;;;;;;;:::i;:::-;25376:21;25385:2;25389:7;25376:8;:21::i;:::-;24994:411;;;:::o;44909:39::-;;;;;;;;;:::o;50329:140::-;50403:15;;50380:4;;50422:15;50403;;;;:34;;;;50402:59;;-1:-1:-1;50444:16:0;;-1:-1:-1;;;50444:16:0;;;;50443:17;50402:59;50393:70;;50329:140;:::o;44656:31::-;;;;:::o;36660:113::-;36748:10;:17;36660:113;:::o;50475:131::-;50546:12;;50523:4;;50562:15;50546:12;;;;;;:31;;;;50545:53;;-1:-1:-1;;50584:13:0;;-1:-1:-1;;;50584:13:0;;;;50583:14;;50475:131::o;44809:46::-;;;;:::o;44728:33::-;;;;:::o;26361:339::-;26556:41;26575:12;:10;:12::i;:::-;26589:7;26556:18;:41::i;:::-;26548:103;;;;-1:-1:-1;;;26548:103:0;;;;;;;:::i;:::-;26664:28;26674:4;26680:2;26684:7;26664:9;:28::i;53115:165::-;53187:10;53175:23;;;;:11;:23;;;;;;;;53167:78;;;;-1:-1:-1;;;53167:78:0;;;;;;;:::i;:::-;53252:13;:22;;;;;-1:-1:-1;;;53252:22:0;-1:-1:-1;;;;53252:22:0;;;;;;;;;53115:165::o;36328:256::-;36425:7;36461:23;36478:5;36461:16;:23::i;:::-;36453:5;:31;36445:87;;;;-1:-1:-1;;;36445:87:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;36550:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;36328:256::o;44862:42::-;;;;;;:::o;49267:239::-;49326:4;;49339:143;49360:20;:27;49356:31;;49339:143;;;49434:5;-1:-1:-1;;;;;49407:32:0;:20;49428:1;49407:23;;;;;;-1:-1:-1;;;49407:23:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49407:23:0;:32;49403:72;;;49461:4;49454:11;;;;;49403:72;49389:3;;;;:::i;:::-;;;;49339:143;;;-1:-1:-1;49495:5:0;;49267:239;-1:-1:-1;;49267:239:0:o;53858:170::-;53933:10;53921:23;;;;:11;:23;;;;;;;;53913:78;;;;-1:-1:-1;;;53913:78:0;;;;;;;:::i;:::-;53998:15;:24;;;;;-1:-1:-1;;;53998:24:0;-1:-1:-1;;;;53998:24:0;;;;;;;;;53858:170::o;54710:150::-;43389:12;:10;:12::i;:::-;-1:-1:-1;;;;;43378:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43378:23:0;;43370:68;;;;-1:-1:-1;;;43370:68:0;;;;;;;:::i;:::-;54755:12:::1;54781:10;-1:-1:-1::0;;;;;54773:24:0::1;54805:21;54773:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54754:77;;;54846:7;54838:16;;;::::0;::::1;;43449:1;54710:150::o:0;52002:172::-;52079:10;52067:23;;;;:11;:23;;;;;;;;52059:78;;;;-1:-1:-1;;;52059:78:0;;;;;;;:::i;:::-;52144:12;:24;;;;;;;;-1:-1:-1;;52144:24:0;;;;;;;;;52002:172::o;26771:185::-;26909:39;26926:4;26932:2;26936:7;26909:39;;;;;;;;;;;;:16;:39::i;49512:333::-;49572:16;49600:23;49626:17;49636:6;49626:9;:17::i;:::-;49600:43;;49650:25;49692:15;49678:30;;;;;;-1:-1:-1;;;49678:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49678:30:0;;49650:58;;49720:9;49715:103;49735:15;49731:1;:19;49715:103;;;49780:30;49800:6;49808:1;49780:19;:30::i;:::-;49766:8;49775:1;49766:11;;;;;;-1:-1:-1;;;49766:11:0;;;;;;;;;;;;;;;;;;:44;49752:3;;;;:::i;:::-;;;;49715:103;;;-1:-1:-1;49831:8:0;49512:333;-1:-1:-1;;;49512:333:0:o;51241:155::-;51310:10;51298:23;;;;:11;:23;;;;;;;;51290:78;;;;-1:-1:-1;;;51290:78:0;;;;;;;:::i;:::-;51375:4;:15;51241:155::o;36850:233::-;36925:7;36961:30;:28;:30::i;:::-;36953:5;:38;36945:95;;;;-1:-1:-1;;;36945:95:0;;;;;;;:::i;:::-;37058:10;37069:5;37058:17;;;;;;-1:-1:-1;;;37058:17:0;;;;;;;;;;;;;;;;;37051:24;;36850:233;;;:::o;45117:28::-;;;-1:-1:-1;;;45117:28:0;;;;;:::o;52359:173::-;52440:10;52428:23;;;;:11;:23;;;;;;;;52420:78;;;;-1:-1:-1;;;52420:78:0;;;;;;;:::i;:::-;52505:21;;;;:7;;:21;;;;;:::i;:::-;;52359:173;:::o;23606:239::-;23678:7;23714:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23714:16:0;23749:19;23741:73;;;;-1:-1:-1;;;23741:73:0;;;;;;;:::i;44555:21::-;;;;;;;:::i;53679:171::-;53754:10;53742:23;;;;:11;:23;;;;;;;;53734:78;;;;-1:-1:-1;;;53734:78:0;;;;;;;:::i;:::-;53819:16;:25;;;;;-1:-1:-1;;;53819:25:0;-1:-1:-1;;;;53819:25:0;;;;;;;;;53679:171::o;23336:208::-;23408:7;-1:-1:-1;;;;;23436:19:0;;23428:74;;;;-1:-1:-1;;;23428:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;23520:16:0;;;;;:9;:16;;;;;;;23336:208::o;43809:94::-;43389:12;:10;:12::i;:::-;-1:-1:-1;;;;;43378:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43378:23:0;;43370:68;;;;-1:-1:-1;;;43370:68:0;;;;;;;:::i;:::-;43874:21:::1;43892:1;43874:9;:21::i;:::-;43809:94::o:0;46919:1161::-;47005:1;46991:11;:15;46983:63;;;;-1:-1:-1;;;46983:63:0;;;;;;;:::i;:::-;47063:13;;-1:-1:-1;;;47063:13:0;;;;47062:14;47061:51;;;;-1:-1:-1;47080:12:0;;47096:15;47080:12;;;;;;:31;;47061:51;47053:87;;;;-1:-1:-1;;;47053:87:0;;;;;;;:::i;:::-;47151:14;47168:13;:11;:13::i;:::-;47151:30;;47210:1;47196:11;:15;47188:55;;;;-1:-1:-1;;;47188:55:0;;;;;;;:::i;:::-;47273:13;;47258:11;:28;;47250:77;;;;-1:-1:-1;;;47250:77:0;;;;;;;:::i;:::-;47366:25;;47342:20;47351:11;47342:6;:20;:::i;:::-;:49;;47334:91;;;;-1:-1:-1;;;47334:91:0;;;;;;;:::i;:::-;47464:9;;47440:20;47449:11;47440:6;:20;:::i;:::-;:33;;47432:68;;;;-1:-1:-1;;;47432:68:0;;;;;;;:::i;:::-;47527:7;:5;:7::i;:::-;-1:-1:-1;;;;;47513:21:0;:10;-1:-1:-1;;;;;47513:21:0;;47509:416;;47550:15;;-1:-1:-1;;;47550:15:0;;;;:23;;47569:4;47550:23;47547:298;;;47598:25;47612:10;47598:13;:25::i;:::-;47590:61;;;;-1:-1:-1;;;47590:61:0;;;;;;;:::i;:::-;47714:10;47666:24;47693:32;;;:20;:32;;;;;;47782:18;;47748:30;47767:11;47693:32;47748:30;:::i;:::-;:52;;47740:93;;;;-1:-1:-1;;;47740:93:0;;;;;;;:::i;:::-;47547:298;;47883:11;47876:4;;:18;;;;:::i;:::-;47863:9;:31;;47855:62;;;;-1:-1:-1;;;47855:62:0;;;;;;;:::i;:::-;47954:1;47937:138;47962:11;47957:1;:16;47937:138;;48012:10;47991:32;;;;:20;:32;;;;;:34;;;;;;:::i;:::-;;;;-1:-1:-1;48034:33:0;;-1:-1:-1;48044:10:0;48056;48065:1;48056:6;:10;:::i;:::-;48034:9;:33::i;:::-;47975:3;;;;:::i;:::-;;;;47937:138;;51402:191;51489:10;51477:23;;;;:11;:23;;;;;;;;51469:78;;;;-1:-1:-1;;;51469:78:0;;;;;;;:::i;:::-;51554:13;:33;51402:191::o;43158:87::-;43231:6;;-1:-1:-1;;;;;43231:6:0;43158:87;:::o;51816:178::-;51896:10;51884:23;;;;:11;:23;;;;;;;;51876:78;;;;-1:-1:-1;;;51876:78:0;;;;;;;:::i;:::-;51961:15;:27;;-1:-1:-1;;51961:27:0;;;;;;;;;;;;51816:178::o;50895:151::-;50958:10;50946:23;;;;:11;:23;;;;;;;;50938:78;;;;-1:-1:-1;;;50938:78:0;;;;;;;:::i;:::-;51023:8;:17;;;;;-1:-1:-1;;;51023:17:0;-1:-1:-1;;;;51023:17:0;;;;;;;;;50895:151::o;24081:104::-;24137:13;24170:7;24163:14;;;;;:::i;45150:34::-;;;-1:-1:-1;;;45150:34:0;;;;;:::o;25764:295::-;25879:12;:10;:12::i;:::-;-1:-1:-1;;;;;25867:24:0;:8;-1:-1:-1;;;;;25867:24:0;;;25859:62;;;;-1:-1:-1;;;25859:62:0;;;;;;;:::i;:::-;25979:8;25934:18;:32;25953:12;:10;:12::i;:::-;-1:-1:-1;;;;;25934:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;25934:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;25934:53:0;;;;;;;;;;;26018:12;:10;:12::i;:::-;-1:-1:-1;;;;;26003:48:0;;26042:8;26003:48;;;;;;:::i;:::-;;;;;;;;25764:295;;:::o;54381:105::-;43389:12;:10;:12::i;:::-;-1:-1:-1;;;;;43378:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43378:23:0;;43370:68;;;;-1:-1:-1;;;43370:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;54450:23:0::1;;::::0;;;:11:::1;:23;::::0;;;;:30;;-1:-1:-1;;54450:30:0::1;54476:4;54450:30;::::0;;54381:105::o;48086:1173::-;48175:1;48161:11;:15;48153:63;;;;-1:-1:-1;;;48153:63:0;;;;;;;:::i;:::-;48233:16;;-1:-1:-1;;;48233:16:0;;;;48232:17;48231:57;;;;-1:-1:-1;48253:15:0;;48272;48253;;;;:34;;48231:57;48223:96;;;;-1:-1:-1;;;48223:96:0;;;;;;;:::i;:::-;48330:14;48347:13;:11;:13::i;:::-;48330:30;;48389:1;48375:11;:15;48367:55;;;;-1:-1:-1;;;48367:55:0;;;;;;;:::i;:::-;48452:13;;48437:11;:28;;48429:77;;;;-1:-1:-1;;;48429:77:0;;;;;;;:::i;:::-;48545:25;;48521:20;48530:11;48521:6;:20;:::i;:::-;:49;;48513:91;;;;-1:-1:-1;;;48513:91:0;;;;;;;:::i;:::-;48643:9;;48619:20;48628:11;48619:6;:20;:::i;:::-;:33;;48611:68;;;;-1:-1:-1;;;48611:68:0;;;;;;;:::i;:::-;48706:7;:5;:7::i;:::-;-1:-1:-1;;;;;48692:21:0;:10;-1:-1:-1;;;;;48692:21:0;;48688:416;;48729:15;;-1:-1:-1;;;48729:15:0;;;;:23;;48748:4;48729:23;48726:298;;;48777:25;48791:10;48777:13;:25::i;:::-;48769:61;;;;-1:-1:-1;;;48769:61:0;;;;;;;:::i;:::-;48893:10;48845:24;48872:32;;;:20;:32;;;;;;48961:18;;48927:30;48946:11;48872:32;48927:30;:::i;:::-;:52;;48919:93;;;;-1:-1:-1;;;48919:93:0;;;;;;;:::i;:::-;48726:298;;49062:11;49055:4;;:18;;;;:::i;:::-;49042:9;:31;;49034:62;;;;-1:-1:-1;;;49034:62:0;;;;;;;:::i;:::-;49133:1;49116:138;49141:11;49136:1;:16;49116:138;;49191:10;49170:32;;;;:20;:32;;;;;:34;;;;;;:::i;:::-;;;;-1:-1:-1;49213:33:0;;-1:-1:-1;49223:10:0;49235;49244:1;49235:6;:10;:::i;49213:33::-;49154:3;;;;:::i;:::-;;;;49116:138;;52181:172;52258:10;52246:23;;;;:11;:23;;;;;;;;52238:78;;;;-1:-1:-1;;;52238:78:0;;;;;;;:::i;:::-;52323:12;:24;;;;;;-1:-1:-1;;;52323:24:0;-1:-1:-1;;52323:24:0;;;;;;;;;52181:172::o;27027:328::-;27202:41;27221:12;:10;:12::i;:::-;27235:7;27202:18;:41::i;:::-;27194:103;;;;-1:-1:-1;;;27194:103:0;;;;;;;:::i;:::-;27308:39;27322:4;27328:2;27332:7;27341:5;27308:13;:39::i;:::-;27027:328;;;;:::o;44766:38::-;;;;:::o;44953:39::-;;;-1:-1:-1;;;44953:39:0;;;;;:::o;45039:32::-;;;-1:-1:-1;;;45039:32:0;;;;;:::o;44581:37::-;;;;;;;:::i;49851:472::-;49924:13;49965:16;49973:7;49965;:16::i;:::-;49949:97;;;;-1:-1:-1;;;49949:97:0;;;;;;;:::i;:::-;50062:8;;-1:-1:-1;;;50062:8:0;;;;50059:62;;50099:14;50092:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50059:62;50129:28;50160:10;:8;:10::i;:::-;50129:41;;50215:1;50190:14;50184:28;:32;:133;;;;;;;;;;;;;;;;;50252:14;50268:18;:7;:16;:18::i;:::-;50288:13;50235:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50184:133;50177:140;49851:472;-1:-1:-1;;;49851:472:0:o;45076:32::-;;;-1:-1:-1;;;45076:32:0;;;;;:::o;52944:165::-;53016:10;53004:23;;;;:11;:23;;;;;;;;52996:78;;;;-1:-1:-1;;;52996:78:0;;;;;;;:::i;:::-;53081:13;:22;;;;;-1:-1:-1;;;53081:22:0;-1:-1:-1;;;;53081:22:0;;;;;;;;;52944:165::o;51054:179::-;51135:10;51123:23;;;;:11;:23;;;;;;;;51115:78;;;;-1:-1:-1;;;51115:78:0;;;;;;;:::i;:::-;51200:18;:27;51054:179::o;51599:211::-;51696:10;51684:23;;;;:11;:23;;;;;;;;51676:78;;;;-1:-1:-1;;;51676:78:0;;;;;;;:::i;:::-;51761:25;:43;51599:211::o;44692:31::-;;;;:::o;52538:197::-;52631:10;52619:23;;;;:11;:23;;;;;;;;52611:78;;;;-1:-1:-1;;;52611:78:0;;;;;;;:::i;:::-;52696:33;;;;:13;;:33;;;;;:::i;45799:1114::-;45877:1;45863:11;:15;45855:63;;;;-1:-1:-1;;;45855:63:0;;;;;;;:::i;:::-;45935:13;;-1:-1:-1;;;45935:13:0;;;;45934:14;45933:51;;;;-1:-1:-1;45952:12:0;;45968:15;-1:-1:-1;;;45952:12:0;;;;;:31;;45933:51;45925:87;;;;-1:-1:-1;;;45925:87:0;;;;;;;:::i;:::-;46023:14;46040:13;:11;:13::i;:::-;46023:30;;46082:1;46068:11;:15;46060:55;;;;-1:-1:-1;;;46060:55:0;;;;;;;:::i;:::-;46145:13;;46130:11;:28;;46122:77;;;;-1:-1:-1;;;46122:77:0;;;;;;;:::i;:::-;46238:25;;46214:20;46223:11;46214:6;:20;:::i;:::-;:49;;46206:91;;;;-1:-1:-1;;;46206:91:0;;;;;;;:::i;:::-;46336:9;;46312:20;46321:11;46312:6;:20;:::i;:::-;:33;;46304:68;;;;-1:-1:-1;;;46304:68:0;;;;;;;:::i;:::-;46403:10;46389:25;;;;:13;:25;;;;;;46381:58;;;;-1:-1:-1;;;46381:58:0;;;;;;;:::i;:::-;46494:10;46446:24;46473:32;;;:20;:32;;;;;;;;;46535:13;:25;;;;;;;;46578:30;46597:11;46473:32;46578:30;:::i;:::-;:46;;46570:87;;;;-1:-1:-1;;;46570:87:0;;;;;;;:::i;:::-;46706:18;;46672:30;46691:11;46672:16;:30;:::i;:::-;:52;;46664:93;;;;-1:-1:-1;;;46664:93:0;;;;;;;:::i;:::-;46787:1;46770:138;46795:11;46790:1;:16;46770:138;;46845:10;46824:32;;;;:20;:32;;;;;:34;;;;;;:::i;:::-;;;;-1:-1:-1;46867:33:0;;-1:-1:-1;46877:10:0;46889;46898:1;46889:6;:10;:::i;46867:33::-;46808:3;;;;:::i;:::-;;;;46770:138;;;;45799:1114;;;;:::o;50612:131::-;50683:12;;50660:4;;50699:15;-1:-1:-1;;;50683:12:0;;;;;:31;;;;50682:53;;-1:-1:-1;;50721:13:0;;-1:-1:-1;;;50721:13:0;;;;50720:14;;50612:131::o;26130:164::-;-1:-1:-1;;;;;26251:25:0;;;26227:4;26251:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26130:164::o;50749:119::-;-1:-1:-1;;;;;50839:23:0;50816:7;50839:23;;;:13;:23;;;;;;;50749:119::o;54036:219::-;54121:10;54109:23;;;;:11;:23;;;;;;;;54101:78;;;;-1:-1:-1;;;54101:78:0;;;;;;;:::i;:::-;54186:27;54193:20;;54186:27;:::i;:::-;54220:29;:20;54243:6;;54220:29;:::i;52743:195::-;52835:10;52823:23;;;;:11;:23;;;;;;;;52815:78;;;;-1:-1:-1;;;52815:78:0;;;;;;;:::i;:::-;52900:32;;;;:14;;:32;;;;;:::i;44058:192::-;43389:12;:10;:12::i;:::-;-1:-1:-1;;;;;43378:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43378:23:0;;43370:68;;;;-1:-1:-1;;;43370:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44147:22:0;::::1;44139:73;;;;-1:-1:-1::0;;;44139:73:0::1;;;;;;;:::i;:::-;44223:19;44233:8;44223:9;:19::i;53286:387::-:0;53401:10;53389:23;;;;:11;:23;;;;;;;;53381:78;;;;-1:-1:-1;;;53381:78:0;;;;;;;:::i;:::-;53494:8;:15;53474:9;:16;:35;53466:90;;;;-1:-1:-1;;;53466:90:0;;;;;;;:::i;:::-;53570:9;53565:103;53589:9;:16;53585:1;:20;53565:103;;;53649:8;53658:1;53649:11;;;;;;-1:-1:-1;;;53649:11:0;;;;;;;;;;;;;;;53621:13;:27;53635:9;53645:1;53635:12;;;;;;-1:-1:-1;;;53635:12:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;53621:27:0;-1:-1:-1;;;;;53621:27:0;;;;;;;;;;;;:39;;;;53607:3;;;;:::i;:::-;;;53565:103;;54594:109;43389:12;:10;:12::i;:::-;-1:-1:-1;;;;;43378:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43378:23:0;;43370:68;;;;-1:-1:-1;;;43370:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;54666:23:0::1;54692:5;54666:23:::0;;;:11:::1;:23;::::0;;;;:31;;-1:-1:-1;;54666:31:0::1;::::0;;54594:109::o;22967:305::-;23069:4;-1:-1:-1;;;;;;23106:40:0;;-1:-1:-1;;;23106:40:0;;:105;;-1:-1:-1;;;;;;;23163:48:0;;-1:-1:-1;;;23163:48:0;23106:105;:158;;;;23228:36;23252:11;23228:23;:36::i;28865:127::-;28930:4;28954:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28954:16:0;:30;;;28865:127::o;21441:98::-;21521:10;21441:98;:::o;32847:174::-;32922:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32922:29:0;-1:-1:-1;;;;;32922:29:0;;;;;;;;:24;;32976:23;32922:24;32976:14;:23::i;:::-;-1:-1:-1;;;;;32967:46:0;;;;;;;;;;;32847:174;;:::o;29159:348::-;29252:4;29277:16;29285:7;29277;:16::i;:::-;29269:73;;;;-1:-1:-1;;;29269:73:0;;;;;;;:::i;:::-;29353:13;29369:23;29384:7;29369:14;:23::i;:::-;29353:39;;29422:5;-1:-1:-1;;;;;29411:16:0;:7;-1:-1:-1;;;;;29411:16:0;;:51;;;;29455:7;-1:-1:-1;;;;;29431:31:0;:20;29443:7;29431:11;:20::i;:::-;-1:-1:-1;;;;;29431:31:0;;29411:51;:87;;;;29466:32;29483:5;29490:7;29466:16;:32::i;:::-;29403:96;29159:348;-1:-1:-1;;;;29159:348:0:o;32151:578::-;32310:4;-1:-1:-1;;;;;32283:31:0;:23;32298:7;32283:14;:23::i;:::-;-1:-1:-1;;;;;32283:31:0;;32275:85;;;;-1:-1:-1;;;32275:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32379:16:0;;32371:65;;;;-1:-1:-1;;;32371:65:0;;;;;;;:::i;:::-;32449:39;32470:4;32476:2;32480:7;32449:20;:39::i;:::-;32553:29;32570:1;32574:7;32553:8;:29::i;:::-;-1:-1:-1;;;;;32595:15:0;;;;;;:9;:15;;;;;:20;;32614:1;;32595:15;:20;;32614:1;;32595:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32626:13:0;;;;;;:9;:13;;;;;:18;;32643:1;;32626:13;:18;;32643:1;;32626:18;:::i;:::-;;;;-1:-1:-1;;32655:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32655:21:0;-1:-1:-1;;;;;32655:21:0;;;;;;;;;32694:27;;32655:16;;32694:27;;;;;;;32151:578;;;:::o;44258:173::-;44333:6;;;-1:-1:-1;;;;;44350:17:0;;;-1:-1:-1;;;;;;44350:17:0;;;;;;;44383:40;;44333:6;;;44350:17;44333:6;;44383:40;;44314:16;;44383:40;44258:173;;:::o;29849:110::-;29925:26;29935:2;29939:7;29925:26;;;;;;;;;;;;:9;:26::i;28237:315::-;28394:28;28404:4;28410:2;28414:7;28394:9;:28::i;:::-;28441:48;28464:4;28470:2;28474:7;28483:5;28441:22;:48::i;:::-;28433:111;;;;-1:-1:-1;;;28433:111:0;;;;;;;:::i;45678:102::-;45738:13;45767:7;45760:14;;;;;:::i;9273:723::-;9329:13;9550:10;9546:53;;-1:-1:-1;9577:10:0;;;;;;;;;;;;-1:-1:-1;;;9577:10:0;;;;;;9546:53;9624:5;9609:12;9665:78;9672:9;;9665:78;;9698:8;;;;:::i;:::-;;-1:-1:-1;9721:10:0;;-1:-1:-1;9729:2:0;9721:10;;:::i;:::-;;;9665:78;;;9753:19;9785:6;9775:17;;;;;;-1:-1:-1;;;9775:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9775:17:0;;9753:39;;9803:154;9810:10;;9803:154;;9837:11;9847:1;9837:11;;:::i;:::-;;-1:-1:-1;9906:10:0;9914:2;9906:5;:10;:::i;:::-;9893:24;;:2;:24;:::i;:::-;9880:39;;9863:6;9870;9863:14;;;;;;-1:-1:-1;;;9863:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;9863:56:0;;;;;;;;-1:-1:-1;9934:11:0;9943:2;9934:11;;:::i;:::-;;;9803:154;;8798:157;-1:-1:-1;;;;;;8907:40:0;;-1:-1:-1;;;8907:40:0;8798:157;;;:::o;37696:589::-;37840:45;37867:4;37873:2;37877:7;37840:26;:45::i;:::-;-1:-1:-1;;;;;37902:18:0;;37898:187;;37937:40;37969:7;37937:31;:40::i;:::-;37898:187;;;38007:2;-1:-1:-1;;;;;37999:10:0;:4;-1:-1:-1;;;;;37999:10:0;;37995:90;;38026:47;38059:4;38065:7;38026:32;:47::i;:::-;-1:-1:-1;;;;;38099:16:0;;38095:183;;38132:45;38169:7;38132:36;:45::i;:::-;38095:183;;;38205:4;-1:-1:-1;;;;;38199:10:0;:2;-1:-1:-1;;;;;38199:10:0;;38195:83;;38226:40;38254:2;38258:7;38226:27;:40::i;30186:321::-;30316:18;30322:2;30326:7;30316:5;:18::i;:::-;30367:54;30398:1;30402:2;30406:7;30415:5;30367:22;:54::i;:::-;30345:154;;;;-1:-1:-1;;;30345:154:0;;;;;;;:::i;33586:799::-;33741:4;33762:15;:2;-1:-1:-1;;;;;33762:13:0;;:15::i;:::-;33758:620;;;33814:2;-1:-1:-1;;;;;33798:36:0;;33835:12;:10;:12::i;:::-;33849:4;33855:7;33864:5;33798:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33798:72:0;;;;;;;;-1:-1:-1;;33798:72:0;;;;;;;;;;;;:::i;:::-;;;33794:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34040:13:0;;34036:272;;34083:60;;-1:-1:-1;;;34083:60:0;;;;;;;:::i;34036:272::-;34258:6;34252:13;34243:6;34239:2;34235:15;34228:38;33794:529;-1:-1:-1;;;;;;33921:51:0;-1:-1:-1;;;33921:51:0;;-1:-1:-1;33914:58:0;;33758:620;-1:-1:-1;34362:4:0;33586:799;;;;;;:::o;39008:164::-;39112:10;:17;;39085:24;;;;:15;:24;;;;;:44;;;39140:24;;;;;;;;;;;;39008:164::o;39799:988::-;40065:22;40115:1;40090:22;40107:4;40090:16;:22::i;:::-;:26;;;;:::i;:::-;40127:18;40148:26;;;:17;:26;;;;;;40065:51;;-1:-1:-1;40281:28:0;;;40277:328;;-1:-1:-1;;;;;40348:18:0;;40326:19;40348:18;;;:12;:18;;;;;;;;:34;;;;;;;;;40399:30;;;;;;:44;;;40516:30;;:17;:30;;;;;:43;;;40277:328;-1:-1:-1;40701:26:0;;;;:17;:26;;;;;;;;40694:33;;;-1:-1:-1;;;;;40745:18:0;;;;;:12;:18;;;;;:34;;;;;;;40738:41;39799:988::o;41082:1079::-;41360:10;:17;41335:22;;41360:21;;41380:1;;41360:21;:::i;:::-;41392:18;41413:24;;;:15;:24;;;;;;41786:10;:26;;41335:46;;-1:-1:-1;41413:24:0;;41335:46;;41786:26;;;;-1:-1:-1;;;41786:26:0;;;;;;;;;;;;;;;;;41764:48;;41850:11;41825:10;41836;41825:22;;;;;;-1:-1:-1;;;41825:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;41930:28;;;:15;:28;;;;;;;:41;;;42102:24;;;;;42095:31;42137:10;:16;;;;;-1:-1:-1;;;42137:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;41082:1079;;;;:::o;38586:221::-;38671:14;38688:20;38705:2;38688:16;:20::i;:::-;-1:-1:-1;;;;;38719:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;38764:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;38586:221:0:o;30843:382::-;-1:-1:-1;;;;;30923:16:0;;30915:61;;;;-1:-1:-1;;;30915:61:0;;;;;;;:::i;:::-;30996:16;31004:7;30996;:16::i;:::-;30995:17;30987:58;;;;-1:-1:-1;;;30987:58:0;;;;;;;:::i;:::-;31058:45;31087:1;31091:2;31095:7;31058:20;:45::i;:::-;-1:-1:-1;;;;;31116:13:0;;;;;;:9;:13;;;;;:18;;31133:1;;31116:13;:18;;31133:1;;31116:18;:::i;:::-;;;;-1:-1:-1;;31145:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31145:21:0;-1:-1:-1;;;;;31145:21:0;;;;;;;;31184:33;;31145:16;;;31184:33;;31145:16;;31184:33;30843:382;;:::o;11798:387::-;12121:20;12169:8;;;11798:387::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:409:1;;114:18;106:6;103:30;100:2;;;136:18;;:::i;:::-;174:58;220:2;197:17;;-1:-1:-1;;193:31:1;226:4;189:42;174:58;:::i;:::-;165:67;;255:6;248:5;241:21;295:3;286:6;281:3;277:16;274:25;271:2;;;312:1;309;302:12;271:2;361:6;356:3;349:4;342:5;338:16;325:43;415:1;408:4;399:6;392:5;388:18;384:29;377:40;90:333;;;;;:::o;428:175::-;498:20;;-1:-1:-1;;;;;547:31:1;;537:42;;527:2;;593:1;590;583:12;608:705;;721:3;714:4;706:6;702:17;698:27;688:2;;743:5;736;729:20;688:2;783:6;770:20;809:4;833:65;848:49;894:2;848:49;:::i;:::-;833:65;:::i;:::-;932:15;;;963:12;;;;995:15;;;1041:11;;;1029:24;;1025:33;;1022:42;-1:-1:-1;1019:2:1;;;1081:5;1074;1067:20;1019:2;1107:5;1121:163;1135:2;1132:1;1129:9;1121:163;;;1192:17;;1180:30;;1230:12;;;;1262;;;;1153:1;1146:9;1121:163;;;-1:-1:-1;1302:5:1;;678:635;-1:-1:-1;;;;;;;678:635:1:o;1318:162::-;1385:20;;1441:13;;1434:21;1424:32;;1414:2;;1470:1;1467;1460:12;1485:198;;1597:2;1585:9;1576:7;1572:23;1568:32;1565:2;;;1618:6;1610;1603:22;1565:2;1646:31;1667:9;1646:31;:::i;1688:274::-;;;1817:2;1805:9;1796:7;1792:23;1788:32;1785:2;;;1838:6;1830;1823:22;1785:2;1866:31;1887:9;1866:31;:::i;:::-;1856:41;;1916:40;1952:2;1941:9;1937:18;1916:40;:::i;:::-;1906:50;;1775:187;;;;;:::o;1967:342::-;;;;2113:2;2101:9;2092:7;2088:23;2084:32;2081:2;;;2134:6;2126;2119:22;2081:2;2162:31;2183:9;2162:31;:::i;:::-;2152:41;;2212:40;2248:2;2237:9;2233:18;2212:40;:::i;:::-;2202:50;;2299:2;2288:9;2284:18;2271:32;2261:42;;2071:238;;;;;:::o;2314:702::-;;;;;2486:3;2474:9;2465:7;2461:23;2457:33;2454:2;;;2508:6;2500;2493:22;2454:2;2536:31;2557:9;2536:31;:::i;:::-;2526:41;;2586:40;2622:2;2611:9;2607:18;2586:40;:::i;:::-;2576:50;;2673:2;2662:9;2658:18;2645:32;2635:42;;2728:2;2717:9;2713:18;2700:32;2755:18;2747:6;2744:30;2741:2;;;2792:6;2784;2777:22;2741:2;2820:22;;2873:4;2865:13;;2861:27;-1:-1:-1;2851:2:1;;2907:6;2899;2892:22;2851:2;2935:75;3002:7;2997:2;2984:16;2979:2;2975;2971:11;2935:75;:::i;:::-;2925:85;;;2444:572;;;;;;;:::o;3021:268::-;;;3147:2;3135:9;3126:7;3122:23;3118:32;3115:2;;;3168:6;3160;3153:22;3115:2;3196:31;3217:9;3196:31;:::i;:::-;3186:41;;3246:37;3279:2;3268:9;3264:18;3246:37;:::i;3294:266::-;;;3423:2;3411:9;3402:7;3398:23;3394:32;3391:2;;;3444:6;3436;3429:22;3391:2;3472:31;3493:9;3472:31;:::i;:::-;3462:41;3550:2;3535:18;;;;3522:32;;-1:-1:-1;;;3381:179:1:o;3565:666::-;;;3712:2;3700:9;3691:7;3687:23;3683:32;3680:2;;;3733:6;3725;3718:22;3680:2;3778:9;3765:23;3807:18;3848:2;3840:6;3837:14;3834:2;;;3869:6;3861;3854:22;3834:2;3912:6;3901:9;3897:22;3887:32;;3957:7;3950:4;3946:2;3942:13;3938:27;3928:2;;3984:6;3976;3969:22;3928:2;4029;4016:16;4055:2;4047:6;4044:14;4041:2;;;4076:6;4068;4061:22;4041:2;4135:7;4130:2;4124;4116:6;4112:15;4108:2;4104:24;4100:33;4097:46;4094:2;;;4161:6;4153;4146:22;4094:2;4197;4189:11;;;;;4219:6;;-1:-1:-1;3670:561:1;;-1:-1:-1;;;;3670:561:1:o;4236:1226::-;;;4415:2;4403:9;4394:7;4390:23;4386:32;4383:2;;;4436:6;4428;4421:22;4383:2;4481:9;4468:23;4510:18;4551:2;4543:6;4540:14;4537:2;;;4572:6;4564;4557:22;4537:2;4615:6;4604:9;4600:22;4590:32;;4660:7;4653:4;4649:2;4645:13;4641:27;4631:2;;4687:6;4679;4672:22;4631:2;4728;4715:16;4750:4;4774:65;4789:49;4835:2;4789:49;:::i;4774:65::-;4873:15;;;4904:12;;;;4936:11;;;4974;;;4966:20;;4962:29;;4959:42;-1:-1:-1;4956:2:1;;;5019:6;5011;5004:22;4956:2;5046:6;5037:15;;5061:171;5075:2;5072:1;5069:9;5061:171;;;5132:25;5153:3;5132:25;:::i;:::-;5120:38;;5093:1;5086:9;;;;;5178:12;;;;5210;;5061:171;;;-1:-1:-1;5251:5:1;-1:-1:-1;;5294:18:1;;5281:32;;-1:-1:-1;;5325:16:1;;;5322:2;;;5359:6;5351;5344:22;5322:2;;5387:69;5448:7;5437:8;5426:9;5422:24;5387:69;:::i;:::-;5377:79;;;4373:1089;;;;;:::o;5467:192::-;;5576:2;5564:9;5555:7;5551:23;5547:32;5544:2;;;5597:6;5589;5582:22;5544:2;5625:28;5643:9;5625:28;:::i;5664:257::-;;5775:2;5763:9;5754:7;5750:23;5746:32;5743:2;;;5796:6;5788;5781:22;5743:2;5840:9;5827:23;5859:32;5885:5;5859:32;:::i;5926:261::-;;6048:2;6036:9;6027:7;6023:23;6019:32;6016:2;;;6069:6;6061;6054:22;6016:2;6106:9;6100:16;6125:32;6151:5;6125:32;:::i;6192:482::-;;6314:2;6302:9;6293:7;6289:23;6285:32;6282:2;;;6335:6;6327;6320:22;6282:2;6380:9;6367:23;6413:18;6405:6;6402:30;6399:2;;;6450:6;6442;6435:22;6399:2;6478:22;;6531:4;6523:13;;6519:27;-1:-1:-1;6509:2:1;;6565:6;6557;6550:22;6509:2;6593:75;6660:7;6655:2;6642:16;6637:2;6633;6629:11;6593:75;:::i;6679:190::-;;6791:2;6779:9;6770:7;6766:23;6762:32;6759:2;;;6812:6;6804;6797:22;6759:2;-1:-1:-1;6840:23:1;;6749:120;-1:-1:-1;6749:120:1:o;6874:296::-;;6985:2;6973:9;6964:7;6960:23;6956:32;6953:2;;;7006:6;6998;6991:22;6953:2;7050:9;7037:23;7100:10;7093:5;7089:22;7082:5;7079:33;7069:2;;7131:6;7123;7116:22;7175:259;;7256:5;7250:12;7283:6;7278:3;7271:19;7299:63;7355:6;7348:4;7343:3;7339:14;7332:4;7325:5;7321:16;7299:63;:::i;:::-;7416:2;7395:15;-1:-1:-1;;7391:29:1;7382:39;;;;7423:4;7378:50;;7226:208;-1:-1:-1;;7226:208:1:o;7439:1532::-;;7701:6;7695:13;7727:4;7740:51;7784:6;7779:3;7774:2;7766:6;7762:15;7740:51;:::i;:::-;7854:13;;7813:16;;;;7876:55;7854:13;7813:16;7898:15;;;7876:55;:::i;:::-;8022:13;;7953:20;;;7993:3;;8099:1;8084:17;;8120:1;8156:18;;;;8183:2;;8261:4;8251:8;8247:19;8235:31;;8183:2;8324;8314:8;8311:16;8291:18;8288:40;8285:2;;;-1:-1:-1;;;8351:33:1;;8407:4;8404:1;8397:15;8437:4;8358:3;8425:17;8285:2;8468:18;8495:110;;;;8619:1;8614:332;;;;8461:485;;8495:110;-1:-1:-1;;8530:24:1;;8516:39;;8575:20;;;;-1:-1:-1;8495:110:1;;8614:332;8650:39;8682:6;8650:39;:::i;:::-;8711:3;8727:169;8741:8;8738:1;8735:15;8727:169;;;8823:14;;8808:13;;;8801:37;8866:16;;;;8758:10;;8727:169;;;8731:3;;8927:8;8920:5;8916:20;8909:27;;8461:485;-1:-1:-1;8962:3:1;;7671:1300;-1:-1:-1;;;;;;;;;;;7671:1300:1:o;8976:205::-;9176:3;9167:14::o;9186:203::-;-1:-1:-1;;;;;9350:32:1;;;;9332:51;;9320:2;9305:18;;9287:102::o;9394:490::-;-1:-1:-1;;;;;9663:15:1;;;9645:34;;9715:15;;9710:2;9695:18;;9688:43;9762:2;9747:18;;9740:34;;;9810:3;9805:2;9790:18;;9783:31;;;9394:490;;9831:47;;9858:19;;9850:6;9831:47;:::i;:::-;9823:55;9597:287;-1:-1:-1;;;;;;9597:287:1:o;9889:635::-;10060:2;10112:21;;;10182:13;;10085:18;;;10204:22;;;9889:635;;10060:2;10283:15;;;;10257:2;10242:18;;;9889:635;10329:169;10343:6;10340:1;10337:13;10329:169;;;10404:13;;10392:26;;10473:15;;;;10438:12;;;;10365:1;10358:9;10329:169;;;-1:-1:-1;10515:3:1;;10040:484;-1:-1:-1;;;;;;10040:484:1:o;10529:187::-;10694:14;;10687:22;10669:41;;10657:2;10642:18;;10624:92::o;10721:221::-;;10870:2;10859:9;10852:21;10890:46;10932:2;10921:9;10917:18;10909:6;10890:46;:::i;10947:406::-;11149:2;11131:21;;;11188:2;11168:18;;;11161:30;11227:34;11222:2;11207:18;;11200:62;-1:-1:-1;;;11293:2:1;11278:18;;11271:40;11343:3;11328:19;;11121:232::o;11358:407::-;11560:2;11542:21;;;11599:2;11579:18;;;11572:30;11638:34;11633:2;11618:18;;11611:62;-1:-1:-1;;;11704:2:1;11689:18;;11682:41;11755:3;11740:19;;11532:233::o;11770:414::-;11972:2;11954:21;;;12011:2;11991:18;;;11984:30;12050:34;12045:2;12030:18;;12023:62;-1:-1:-1;;;12116:2:1;12101:18;;12094:48;12174:3;12159:19;;11944:240::o;12189:402::-;12391:2;12373:21;;;12430:2;12410:18;;;12403:30;12469:34;12464:2;12449:18;;12442:62;-1:-1:-1;;;12535:2:1;12520:18;;12513:36;12581:3;12566:19;;12363:228::o;12596:339::-;12798:2;12780:21;;;12837:2;12817:18;;;12810:30;-1:-1:-1;;;12871:2:1;12856:18;;12849:45;12926:2;12911:18;;12770:165::o;12940:352::-;13142:2;13124:21;;;13181:2;13161:18;;;13154:30;13220;13215:2;13200:18;;13193:58;13283:2;13268:18;;13114:178::o;13297:347::-;13499:2;13481:21;;;13538:2;13518:18;;;13511:30;13577:25;13572:2;13557:18;;13550:53;13635:2;13620:18;;13471:173::o;13649:352::-;13851:2;13833:21;;;13890:2;13870:18;;;13863:30;13929;13924:2;13909:18;;13902:58;13992:2;13977:18;;13823:178::o;14006:400::-;14208:2;14190:21;;;14247:2;14227:18;;;14220:30;14286:34;14281:2;14266:18;;14259:62;-1:-1:-1;;;14352:2:1;14337:18;;14330:34;14396:3;14381:19;;14180:226::o;14411:349::-;14613:2;14595:21;;;14652:2;14632:18;;;14625:30;14691:27;14686:2;14671:18;;14664:55;14751:2;14736:18;;14585:175::o;14765:350::-;14967:2;14949:21;;;15006:2;14986:18;;;14979:30;15045:28;15040:2;15025:18;;15018:56;15106:2;15091:18;;14939:176::o;15120:408::-;15322:2;15304:21;;;15361:2;15341:18;;;15334:30;15400:34;15395:2;15380:18;;15373:62;-1:-1:-1;;;15466:2:1;15451:18;;15444:42;15518:3;15503:19;;15294:234::o;15533:347::-;15735:2;15717:21;;;15774:2;15754:18;;;15747:30;15813:25;15808:2;15793:18;;15786:53;15871:2;15856:18;;15707:173::o;15885:420::-;16087:2;16069:21;;;16126:2;16106:18;;;16099:30;16165:34;16160:2;16145:18;;16138:62;16236:26;16231:2;16216:18;;16209:54;16295:3;16280:19;;16059:246::o;16310:406::-;16512:2;16494:21;;;16551:2;16531:18;;;16524:30;16590:34;16585:2;16570:18;;16563:62;-1:-1:-1;;;16656:2:1;16641:18;;16634:40;16706:3;16691:19;;16484:232::o;16721:405::-;16923:2;16905:21;;;16962:2;16942:18;;;16935:30;17001:34;16996:2;16981:18;;16974:62;-1:-1:-1;;;17067:2:1;17052:18;;17045:39;17116:3;17101:19;;16895:231::o;17131:346::-;17333:2;17315:21;;;17372:2;17352:18;;;17345:30;-1:-1:-1;;;17406:2:1;17391:18;;17384:52;17468:2;17453:18;;17305:172::o;17482:400::-;17684:2;17666:21;;;17723:2;17703:18;;;17696:30;17762:34;17757:2;17742:18;;17735:62;-1:-1:-1;;;17828:2:1;17813:18;;17806:34;17872:3;17857:19;;17656:226::o;17887:399::-;18089:2;18071:21;;;18128:2;18108:18;;;18101:30;18167:34;18162:2;18147:18;;18140:62;-1:-1:-1;;;18233:2:1;18218:18;;18211:33;18276:3;18261:19;;18061:225::o;18291:356::-;18493:2;18475:21;;;18512:18;;;18505:30;18571:34;18566:2;18551:18;;18544:62;18638:2;18623:18;;18465:182::o;18652:408::-;18854:2;18836:21;;;18893:2;18873:18;;;18866:30;18932:34;18927:2;18912:18;;18905:62;-1:-1:-1;;;18998:2:1;18983:18;;18976:42;19050:3;19035:19;;18826:234::o;19065:356::-;19267:2;19249:21;;;19286:18;;;19279:30;19345:34;19340:2;19325:18;;19318:62;19412:2;19397:18;;19239:182::o;19426:405::-;19628:2;19610:21;;;19667:2;19647:18;;;19640:30;19706:34;19701:2;19686:18;;19679:62;-1:-1:-1;;;19772:2:1;19757:18;;19750:39;19821:3;19806:19;;19600:231::o;19836:411::-;20038:2;20020:21;;;20077:2;20057:18;;;20050:30;20116:34;20111:2;20096:18;;20089:62;-1:-1:-1;;;20182:2:1;20167:18;;20160:45;20237:3;20222:19;;20010:237::o;20252:397::-;20454:2;20436:21;;;20493:2;20473:18;;;20466:30;20532:34;20527:2;20512:18;;20505:62;-1:-1:-1;;;20598:2:1;20583:18;;20576:31;20639:3;20624:19;;20426:223::o;20654:406::-;20856:2;20838:21;;;20895:2;20875:18;;;20868:30;20934:34;20929:2;20914:18;;20907:62;-1:-1:-1;;;21000:2:1;20985:18;;20978:40;21050:3;21035:19;;20828:232::o;21065:342::-;21267:2;21249:21;;;21306:2;21286:18;;;21279:30;-1:-1:-1;;;21340:2:1;21325:18;;21318:48;21398:2;21383:18;;21239:168::o;21412:413::-;21614:2;21596:21;;;21653:2;21633:18;;;21626:30;21692:34;21687:2;21672:18;;21665:62;-1:-1:-1;;;21758:2:1;21743:18;;21736:47;21815:3;21800:19;;21586:239::o;21830:352::-;22032:2;22014:21;;;22071:2;22051:18;;;22044:30;22110;22105:2;22090:18;;22083:58;22173:2;22158:18;;22004:178::o;22187:353::-;22389:2;22371:21;;;22428:2;22408:18;;;22401:30;22467:31;22462:2;22447:18;;22440:59;22531:2;22516:18;;22361:179::o;22545:408::-;22747:2;22729:21;;;22786:2;22766:18;;;22759:30;22825:34;22820:2;22805:18;;22798:62;-1:-1:-1;;;22891:2:1;22876:18;;22869:42;22943:3;22928:19;;22719:234::o;22958:347::-;23160:2;23142:21;;;23199:2;23179:18;;;23172:30;23238:25;23233:2;23218:18;;23211:53;23296:2;23281:18;;23132:173::o;23310:351::-;23512:2;23494:21;;;23551:2;23531:18;;;23524:30;23590:29;23585:2;23570:18;;23563:57;23652:2;23637:18;;23484:177::o;23666:::-;23812:25;;;23800:2;23785:18;;23767:76::o;23848:192::-;24022:10;24010:23;;;;23992:42;;23980:2;23965:18;;23947:93::o;24045:251::-;24115:2;24109:9;24145:17;;;24192:18;24177:34;;24213:22;;;24174:62;24171:2;;;24239:18;;:::i;:::-;24275:2;24268:22;24089:207;;-1:-1:-1;24089:207:1:o;24301:192::-;;24400:18;24392:6;24389:30;24386:2;;;24422:18;;:::i;:::-;-1:-1:-1;24482:4:1;24463:17;;;24459:28;;24376:117::o;24498:129::-;;24566:17;;;24616:4;24600:21;;;24556:71::o;24632:128::-;;24703:1;24699:6;24696:1;24693:13;24690:2;;;24709:18;;:::i;:::-;-1:-1:-1;24745:9:1;;24680:80::o;24765:120::-;;24831:1;24821:2;;24836:18;;:::i;:::-;-1:-1:-1;24870:9:1;;24811:74::o;24890:168::-;;24996:1;24992;24988:6;24984:14;24981:1;24978:21;24973:1;24966:9;24959:17;24955:45;24952:2;;;25003:18;;:::i;:::-;-1:-1:-1;25043:9:1;;24942:116::o;25063:125::-;;25131:1;25128;25125:8;25122:2;;;25136:18;;:::i;:::-;-1:-1:-1;25173:9:1;;25112:76::o;25193:258::-;25265:1;25275:113;25289:6;25286:1;25283:13;25275:113;;;25365:11;;;25359:18;25346:11;;;25339:39;25311:2;25304:10;25275:113;;;25406:6;25403:1;25400:13;25397:2;;;-1:-1:-1;;25441:1:1;25423:16;;25416:27;25246:205::o;25456:380::-;25541:1;25531:12;;25588:1;25578:12;;;25599:2;;25653:4;25645:6;25641:17;25631:27;;25599:2;25706;25698:6;25695:14;25675:18;25672:38;25669:2;;;25752:10;25747:3;25743:20;25740:1;25733:31;25787:4;25784:1;25777:15;25815:4;25812:1;25805:15;25669:2;;25511:325;;;:::o;25841:135::-;;-1:-1:-1;;25901:17:1;;25898:2;;;25921:18;;:::i;:::-;-1:-1:-1;25968:1:1;25957:13;;25888:88::o;25981:112::-;;26039:1;26029:2;;26044:18;;:::i;:::-;-1:-1:-1;26078:9:1;;26019:74::o;26098:127::-;26159:10;26154:3;26150:20;26147:1;26140:31;26190:4;26187:1;26180:15;26214:4;26211:1;26204:15;26230:127;26291:10;26286:3;26282:20;26279:1;26272:31;26322:4;26319:1;26312:15;26346:4;26343:1;26336:15;26362:127;26423:10;26418:3;26414:20;26411:1;26404:31;26454:4;26451:1;26444:15;26478:4;26475:1;26468:15;26494:133;-1:-1:-1;;;;;;26570:32:1;;26560:43;;26550:2;;26617:1;26614;26607:12

Swarm Source

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