ETH Price: $2,354.96 (+0.29%)

Token

MetaIdol (MI)
 

Overview

Max Total Supply

1,111 MI

Holders

335

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 MI
0x81c6f7159a48895e327581edeb8ab6dbd0474b31
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Token

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
pragma solidity >=0.8.7 <0.9.0;

//import "@openzeppelin/contracts/utils/Strings.sol";
/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}


//import "../utils/Context.sol";
/**
 * @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;
    }
}


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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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


//import "./IERC165.sol";
/**
 * @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);
}


//import "./IERC721.sol";
/**
 * @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`.
     *
     * 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;

    /**
     * @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 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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


//import "./IERC721Receiver.sol";
/**
 * @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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


//import "./extensions/IERC721Metadata.sol";
/**
 * @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);
}



//import "../../utils/introspection/ERC165.sol";
/**
 * @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;
    }
}


//import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
/**
 * @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: address zero is not a valid owner");
        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: invalid token ID");
        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) {
        _requireMinted(tokenId);

        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 overridden 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 token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token 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: caller is not token 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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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


//import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

//import "./Common/IPurchasedChecker.sol";
//--------------------------------------------
// PurchasedChecker interface
//--------------------------------------------
interface IPurchasedChecker {
    //--------------------
    // function
    //--------------------
    function checkPurchased( address target ) external view returns (uint256);
    function checkPurchasedOnPrivate( address target ) external view returns (uint256);
    function checkPurchasedOnPublic( address target ) external view returns (uint256);
}


//import "./Common/IWhitelist.sol";
//--------------------------------------------
// WHITELIST intterface
//--------------------------------------------
interface IWhitelist {
    //--------------------
    // function
    //--------------------
    function check( address target ) external view returns (bool);
}

//------------------------------------------------------------
// Token(ERC721)
//------------------------------------------------------------
contract Token is Ownable, ERC721, ReentrancyGuard, IPurchasedChecker {
    //--------------------------------------------------------
    // 定数
    //--------------------------------------------------------
    string constant private TOKEN_NAME = "MetaIdol";
    string constant private TOKEN_SYMBOL = "MI";

    // mainnet
    address constant private OWNER_ADDRESS = 0xE2E577A889f2EB52C84c34E4539D33798987B6d2;

    // constant
    uint256 constant private TOKEN_ID_OFS = 1;
    uint256 constant private BLOCK_SEC_MARGIN = 30;

    // enum
    uint256 constant private INFO_SALE_SUSPENDED = 0;
    uint256 constant private INFO_SALE_START = 1;
    uint256 constant private INFO_SALE_END = 2;
    uint256 constant private INFO_SALE_PRICE = 3;
    uint256 constant private INFO_SALE_WHITELISTED = 4;
    uint256 constant private INFO_SALE_USER_MINTED = 5;
    uint256 constant private INFO_SALE_USER_MINTABLE = 6;
    uint256 constant private INFO_MAX = 7;
    uint256 constant private USER_INFO_SALE_TYPE = INFO_MAX;
    uint256 constant private USER_INFO_TOTAL_SUPPLY = INFO_MAX + 1;
    uint256 constant private USER_INFO_TOKEN_MAX = INFO_MAX + 2;
    uint256 constant private USER_INFO_MINT_LIMIT = INFO_MAX + 3;
    uint256 constant private USER_INFO_MAX = INFO_MAX + 4;

    //--------------------------------------------------------
    // 管理
    //--------------------------------------------------------
    address private _manager;

    //--------------------------------------------------------
    // ストレージ
    //--------------------------------------------------------
    string private _base_uri_for_hidden;
    string private _base_uri_for_revealed;
    uint256 private _token_max;
    uint256 private _token_reserved;
    uint256 private _token_mint_limit;
    uint256 private _total_supply;

    // PRIVATE(whitelist)
    bool private _PRIVATE_SALE_is_suspended;
    uint256 private _PRIVATE_SALE_start;
    uint256 private _PRIVATE_SALE_end;
    uint256 private _PRIVATE_SALE_price;
    uint256 private _PRIVATE_SALE_mintable;
    IWhitelist[] private _PRIVATE_SALE_arr_whitelist;
    mapping( address => uint256 ) private _PRIVATE_SALE_map_user_minted;

    // PUBLIC
    bool private _PUBLIC_SALE_is_suspended;
    uint256 private _PUBLIC_SALE_start;
    uint256 private _PUBLIC_SALE_end;
    uint256 private _PUBLIC_SALE_price;
    uint256 private _PUBLIC_SALE_mintable;
    mapping( address => uint256 ) private _PUBLIC_SALE_map_user_minted;

    //--------------------------------------------------------
    // [modifier] onlyOwnerOrManager
    //--------------------------------------------------------
    modifier onlyOwnerOrManager() {
        require( msg.sender == owner() || msg.sender == manager(), "caller is not the owner neither manager" );
        _;
    }

    //--------------------------------------------------------
    // コンストラクタ
    //--------------------------------------------------------
    constructor() Ownable() ERC721( TOKEN_NAME, TOKEN_SYMBOL ) {
        transferOwnership( OWNER_ADDRESS );
        _manager = msg.sender;

        //-----------------------
        // mainnet
        //-----------------------
        _base_uri_for_hidden = "ipfs://QmX3S9CtNxNBGvy31rNcSCD6LCmwcH3JxTwhUXWzLXBnNJ/";
        //_base_uri_for_revealed = "";
        _token_max = 1111;
        _token_reserved = 50;
        _token_mint_limit = 20;

        //***********************
        // PRIVATE(whitelist)
        //***********************
        _PRIVATE_SALE_start = 1659013200;               // 2022-07-28 22:00:00(JST)
        _PRIVATE_SALE_end   = 1659099600;               // 2022-07-29 22:00:00(JST)
        _PRIVATE_SALE_price = 22000000000000000;        // 0.022 ETH
        _PRIVATE_SALE_mintable = 5;                     // 5 nft
        _PRIVATE_SALE_arr_whitelist.push( IWhitelist(0xc30Be91bDB2B8211eB7225ecfF7C49E61F6F26f6) );
        
        //~~~~~~~~~~~~~~~~~~~~~~~
        // PUBLIC
        //~~~~~~~~~~~~~~~~~~~~~~~
        _PUBLIC_SALE_start = 1659099600;                // 2022-07-29 22:00:00(JST)
        _PUBLIC_SALE_end   = 1659186000;                // 2022-07-30 22:00:00(JST)
        _PUBLIC_SALE_price = 23000000000000000;         // 0.023 ETH
        _PUBLIC_SALE_mintable = 0;                      // no limitation
    }

    //--------------------------------------------------------
    // [public] manager
    //--------------------------------------------------------
    function manager() public view returns (address) {
        return( _manager );
    }

    //--------------------------------------------------------
    // [external/onlyOwner] setManager
    //--------------------------------------------------------
    function setManager( address target ) external onlyOwner {
        _manager = target;
    }

    //--------------------------------------------------------
    // [external] get
    //--------------------------------------------------------
    function baseUriForHidden() external view returns (string memory) { return( _base_uri_for_hidden ); }
    function baseUriForRevealed() external view returns (string memory) { return( _base_uri_for_revealed ); }
    function tokenMax() external view returns (uint256) { return( _token_max ); }
    function tokenReserved() external view returns (uint256) { return( _token_reserved ); }
    function tokenMintLimit() external view returns (uint256) { return( _token_mint_limit ); }    
    function totalSupply() external view returns (uint256) { return( _total_supply ); }

    //--------------------------------------------------------
    // [external/onlyOwnerOrManager] set
    //--------------------------------------------------------
    function setBaseUriForHidden( string calldata uri ) external onlyOwnerOrManager { _base_uri_for_hidden = uri; }
    function setBaseUriForRevealed( string calldata uri ) external onlyOwnerOrManager { _base_uri_for_revealed = uri; }
    function setTokenMax( uint256 max ) external onlyOwnerOrManager { _token_max = max; }
    function setTokenReserved( uint256 reserved ) external onlyOwnerOrManager { _token_reserved = reserved; }
    function setTokenMintLimit( uint256 limit ) external onlyOwnerOrManager { _token_mint_limit = limit; }

    //--------------------------------------------------------
    // [public/override] tokenURI
    //--------------------------------------------------------
    function tokenURI( uint256 tokenId ) public view override returns (string memory) {
        require( _exists( tokenId ), "nonexistent token" );

        if( bytes(_base_uri_for_revealed).length > 0 ){
            return( string( abi.encodePacked( _base_uri_for_revealed, Strings.toString( tokenId ) ) ) );            
        }

        return( string( abi.encodePacked( _base_uri_for_hidden, Strings.toString( tokenId ) ) ) );
    }

    //********************************************************
    // [public] getInfo - PRIVATE(whitelist)
    //********************************************************
    function PRIVATE_SALE_getInfo( address target ) public view returns (uint256[INFO_MAX] memory) {
        uint256[INFO_MAX] memory arrRet;

        if( _PRIVATE_SALE_is_suspended ){ arrRet[INFO_SALE_SUSPENDED] = 1; }
        arrRet[INFO_SALE_START] = _PRIVATE_SALE_start;
        arrRet[INFO_SALE_END] = _PRIVATE_SALE_end;
        arrRet[INFO_SALE_PRICE] = _PRIVATE_SALE_price;
        if( _checkWhitelist( _PRIVATE_SALE_arr_whitelist, target ) ){ arrRet[INFO_SALE_WHITELISTED] = 1; }
        arrRet[INFO_SALE_USER_MINTED] = _PRIVATE_SALE_map_user_minted[target];
        arrRet[INFO_SALE_USER_MINTABLE] = _PRIVATE_SALE_mintable;

        return( arrRet );
    }

    //********************************************************
    // [external/onlyOwnerOrManager] write - PRIVATE(whitelist)
    //********************************************************
    // is_suspended
    function PRIVATE_SALE_suspend( bool flag ) external onlyOwnerOrManager {
        _PRIVATE_SALE_is_suspended = flag;
    }

    // start-end
    function PRIVATE_SALE_setStartEnd( uint256 start, uint256 end ) external onlyOwnerOrManager {
        _PRIVATE_SALE_start = start;
        _PRIVATE_SALE_end = end;
    }

    // price
    function PRIVATE_SALE_setPrice( uint256 price ) external onlyOwnerOrManager {
        _PRIVATE_SALE_price = price;
    }

    // mintable
    function PRIVATE_SALE_setMintable( uint256 mintable ) external onlyOwnerOrManager {
        _PRIVATE_SALE_mintable = mintable;
    }

    // whitelist
    function PRIVATE_SALE_setWhiteList( address[] calldata lists ) external onlyOwnerOrManager {
        delete _PRIVATE_SALE_arr_whitelist;

        for( uint256 i=0; i<lists.length; i++ ){
            require( lists[i] != address(0), "PRIVATE: invalid list"  );
            _PRIVATE_SALE_arr_whitelist.push( IWhitelist(lists[i]) );
        }
    }

    //********************************************************
    // [external/payable/nonReentrant] mint - PRIVATE(whitelist)
    //********************************************************
    function PRIVATE_SALE_mint( uint256 num ) external payable nonReentrant {
        uint256[INFO_MAX] memory arrInfo = PRIVATE_SALE_getInfo( msg.sender );

        require( arrInfo[INFO_SALE_SUSPENDED] == 0, "PRIVATE SALE: suspended" );
        require( arrInfo[INFO_SALE_START] == 0 || arrInfo[INFO_SALE_START] <= (block.timestamp+BLOCK_SEC_MARGIN), "PRIVATE SALE: not opend" );
        require( arrInfo[INFO_SALE_END] == 0 || (arrInfo[INFO_SALE_END]+BLOCK_SEC_MARGIN) > block.timestamp, "PRIVATE SALE: finished" );
        require( arrInfo[INFO_SALE_WHITELISTED] == 1, "PRIVATE SALE: not whitelisted" );
        require( arrInfo[INFO_SALE_USER_MINTABLE] == 0 || arrInfo[INFO_SALE_USER_MINTABLE] >= (arrInfo[INFO_SALE_USER_MINTED]+num), "PRIVATE SALE: reached the limit" );

        _checkPayment( msg.sender, arrInfo[INFO_SALE_PRICE]*num, msg.value );

        _mintTokens( msg.sender, num );
        _PRIVATE_SALE_map_user_minted[msg.sender] += num;
    }

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // [public] getInfo - PUBLIC
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    function PUBLIC_SALE_getInfo( address target ) public view returns (uint256[INFO_MAX] memory) {
        uint256[INFO_MAX] memory arrRet;

        if( _PUBLIC_SALE_is_suspended ){ arrRet[INFO_SALE_SUSPENDED] = 1; }
        arrRet[INFO_SALE_START] = _PUBLIC_SALE_start;
        arrRet[INFO_SALE_END] = _PUBLIC_SALE_end;
        arrRet[INFO_SALE_PRICE] = _PUBLIC_SALE_price;
        arrRet[INFO_SALE_WHITELISTED] = 1;
        arrRet[INFO_SALE_USER_MINTED] = _PUBLIC_SALE_map_user_minted[target];
        arrRet[INFO_SALE_USER_MINTABLE] = _PUBLIC_SALE_mintable;

        return( arrRet );
    }

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // [external/onlyOwnerOrManager] write - PUBLIC
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // is_suspended
    function PUBLIC_SALE_suspend( bool flag ) external onlyOwnerOrManager {
        _PUBLIC_SALE_is_suspended = flag;
    }

    // start-end
    function PUBLIC_SALE_setStartEnd( uint256 start, uint256 end ) external onlyOwnerOrManager {
        _PUBLIC_SALE_start = start;
        _PUBLIC_SALE_end = end;
    }

    // price
    function PUBLIC_SALE_setPrice( uint256 price ) external onlyOwnerOrManager {
        _PUBLIC_SALE_price = price;
    }

    // mintable
    function PUBLIC_SALE_setMintable( uint256 mintable ) external onlyOwnerOrManager {
        _PUBLIC_SALE_mintable = mintable;
    }

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // [external/payable/nonReentrant] mint - PUBLIC
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    function PUBLIC_SALE_mint( uint256 num ) external payable nonReentrant {
        uint256[INFO_MAX] memory arrInfo = PUBLIC_SALE_getInfo( msg.sender );

        require( arrInfo[INFO_SALE_SUSPENDED] == 0, "PUBLIC SALE: suspended" );
        require( arrInfo[INFO_SALE_START] == 0 || arrInfo[INFO_SALE_START] <= (block.timestamp+BLOCK_SEC_MARGIN), "PUBLIC SALE: not opend" );
        require( arrInfo[INFO_SALE_END] == 0 || (arrInfo[INFO_SALE_END]+BLOCK_SEC_MARGIN) > block.timestamp, "PUBLIC SALE: finished" );
        require( arrInfo[INFO_SALE_USER_MINTABLE] == 0 || arrInfo[INFO_SALE_USER_MINTABLE] >= (arrInfo[INFO_SALE_USER_MINTED]+num), "PUBLIC SALE: reached the limit" );

        _checkPayment( msg.sender, arrInfo[INFO_SALE_PRICE]*num, msg.value );

        _mintTokens( msg.sender, num );
        _PUBLIC_SALE_map_user_minted[msg.sender] += num;
    }

    //--------------------------------------------------------
    // [internal] _checkWhitelist
    //--------------------------------------------------------
    function _checkWhitelist( IWhitelist[] storage lists, address target ) internal view returns (bool) {
        for( uint256 i=0; i<lists.length; i++ ){
            if( lists[i].check(target) ){
                return( true );
            }
        }

        return( false );        
    }

    //--------------------------------------------------------
    // [internal] _checkPayment
    //--------------------------------------------------------
    function _checkPayment( address msgSender, uint256 price, uint256 payment ) internal {
        require( price <= payment, "insufficient value" );

        // refund if overpaymented
        if( price < payment ){
            uint256 change = payment - price;
            address payable target = payable( msgSender );
            target.transfer( change );
        }
    }

    //--------------------------------------------------------
    // [internal] _mintTokens
    //--------------------------------------------------------
    function _mintTokens( address to, uint256 num ) internal {
        require( _total_supply >= _token_reserved, "reservation not finished" );
        require( (_total_supply+num) <= _token_max, "exceeded the supply range" );
        require( _token_mint_limit == 0 || _token_mint_limit >= num, "reached mint limitation" );

        for( uint256 i=0; i<num; i++ ){
            _mint( to, _total_supply+(TOKEN_ID_OFS+i) );
        }
        _total_supply += num;
    }

    //--------------------------------------------------------
    // [external/onlyOwnerOrManager] reserveTokens
    //--------------------------------------------------------
    function reserveTokens( uint256 num ) external onlyOwnerOrManager {
        require( (_total_supply+num) <= _token_reserved, "exceeded the reservation range" );

        for( uint256 i=0; i<num; i++ ){
            _mint( owner(), _total_supply+(TOKEN_ID_OFS+i) );
        }
        _total_supply += num;
    }

    //--------------------------------------------------------
    // [external] getUserInfo
    //--------------------------------------------------------
    function getUserInfo( address target ) external view returns (uint256[USER_INFO_MAX] memory) {
        uint256[USER_INFO_MAX] memory userInfo;
        uint256[INFO_MAX] memory info;

        // PRIVATE(whitelist)
        if( _checkWhitelist( _PRIVATE_SALE_arr_whitelist, target ) && (_PRIVATE_SALE_end == 0 || _PRIVATE_SALE_end > (block.timestamp+BLOCK_SEC_MARGIN/2)) ){
            userInfo[USER_INFO_SALE_TYPE] = 1;
            info = PRIVATE_SALE_getInfo( target );
        }
        // PUBLIC
        else{
            userInfo[USER_INFO_SALE_TYPE] = 2;
            info = PUBLIC_SALE_getInfo( target );
        }

        for( uint256 i=0; i<INFO_MAX; i++ ){
            userInfo[i] = info[i];
        }

        userInfo[USER_INFO_TOTAL_SUPPLY] = _total_supply;
        userInfo[USER_INFO_TOKEN_MAX] = _token_max;
        userInfo[USER_INFO_MINT_LIMIT] = _token_mint_limit;

        return( userInfo );
    }

    //--------------------------------------------------------
    // [external] for PurchasedChecker
    //--------------------------------------------------------
    function checkPurchased( address target ) external view override returns (uint256) { return( _PRIVATE_SALE_map_user_minted[target] + _PUBLIC_SALE_map_user_minted[target] ); }
    function checkPurchasedOnPrivate( address target ) external override view returns (uint256){ return( _PRIVATE_SALE_map_user_minted[target] ); }
    function checkPurchasedOnPublic( address target ) external override view returns (uint256){ return( _PUBLIC_SALE_map_user_minted[target] ); }

    //--------------------------------------------------------
    // [external] checkBalance
    //--------------------------------------------------------
    function checkBalance() external view returns (uint256) {
        return( address(this).balance );
    }

    //--------------------------------------------------------
    // [external/onlyOwnerOrManager] withdraw
    //--------------------------------------------------------
    function withdraw( uint256 amount ) external onlyOwnerOrManager {
        require( amount <= address(this).balance, "insufficient balance" );

        address payable target = payable( owner() );
        target.transfer( amount );
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"PRIVATE_SALE_getInfo","outputs":[{"internalType":"uint256[7]","name":"","type":"uint256[7]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"PRIVATE_SALE_mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintable","type":"uint256"}],"name":"PRIVATE_SALE_setMintable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"PRIVATE_SALE_setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"PRIVATE_SALE_setStartEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"lists","type":"address[]"}],"name":"PRIVATE_SALE_setWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"PRIVATE_SALE_suspend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"PUBLIC_SALE_getInfo","outputs":[{"internalType":"uint256[7]","name":"","type":"uint256[7]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"PUBLIC_SALE_mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintable","type":"uint256"}],"name":"PUBLIC_SALE_setMintable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"PUBLIC_SALE_setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"PUBLIC_SALE_setStartEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"PUBLIC_SALE_suspend","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":"baseUriForHidden","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUriForRevealed","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"checkPurchased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"checkPurchasedOnPrivate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"checkPurchasedOnPublic","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":"target","type":"address"}],"name":"getUserInfo","outputs":[{"internalType":"uint256[11]","name":"","type":"uint256[11]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseUriForHidden","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseUriForRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setTokenMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setTokenMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reserved","type":"uint256"}],"name":"setTokenReserved","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":[],"name":"tokenMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenReserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600881526020016713595d1852591bdb60c21b815250604051806040016040528060028152602001614d4960f01b8152506200006862000062620001a260201b60201c565b620001a6565b81516200007d906001906020850190620002d7565b50805162000093906002906020840190620002d7565b5050600160075550620000ba73e2e577a889f2eb52c84c34e4539d33798987b6d2620001f6565b600880546001600160a01b0319163317905560408051606081019091526036808252620032d460208301398051620000fb91600991602090910190620002d7565b50610457600b556032600c556014600d8190556362e288506010556362e3d9d06011819055664e28e2290f00006012556005601355815460018101835560009283527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec0180546001600160a01b03191673c30be91bdb2b8211eb7225ecff7c49e61f6f26f61790556017556362e52b506018556651b660cdd58000601955601a55620003ba565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6200020062000279565b6001600160a01b0381166200026b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6200027681620001a6565b50565b6000546001600160a01b03163314620002d55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000262565b565b828054620002e5906200037d565b90600052602060002090601f01602090048101928262000309576000855562000354565b82601f106200032457805160ff191683800117855562000354565b8280016001018555821562000354579182015b828111156200035457825182559160200191906001019062000337565b506200036292915062000366565b5090565b5b8082111562000362576000815560010162000367565b600181811c908216806200039257607f821691505b60208210811415620003b457634e487b7160e01b600052602260045260246000fd5b50919050565b612f0a80620003ca6000396000f3fe6080604052600436106102ae5760003560e01c8063715018a611610175578063be900d40116100dc578063e195d09611610095578063f34e1ea11161006f578063f34e1ea11461085c578063f7ee70681461087c578063f92e4ba514610891578063ff4b629e146108b157600080fd5b8063e195d09614610807578063e985e9c51461081c578063f2fde38b1461083c57600080fd5b8063be900d4014610754578063c71daccb14610774578063c87b56dd14610787578063d031370b146107a7578063d0ebdbe7146107c7578063d1e5aa51146107e757600080fd5b8063a22cb4651161012e578063a22cb46514610694578063ac1349a1146106b4578063b01d98a7146106d4578063b1077d40146106f4578063b6202ef914610714578063b88d4fde1461073457600080fd5b8063715018a6146105e15780637c34441e146105f65780638da5cb5b146106165780639400bac21461063457806395d89b411461066a578063a04e5f7f1461067f57600080fd5b80633953015b1161021957806352c0295f116101d257806352c0295f1461052c5780635d8ceea9146105415780635e59da6b146105615780636352211e146105745780636386c1c71461059457806370a08231146105c157600080fd5b80633953015b1461044b5780633ef4400f1461048157806342842e0e146104a15780634648b01a146104c157806347f40f84146104e1578063481c6a751461050e57600080fd5b806318160ddd1161026b57806318160ddd146103965780631c58eec5146103ab57806323b872dd146103cb5780632e1a7d4d146103eb5780632ff2b8361461040b578063375926181461042b57600080fd5b806301ffc9a7146102b357806304540d37146102e857806306fdde0314610307578063081812fc14610329578063095ea7b314610361578063109065b014610383575b600080fd5b3480156102bf57600080fd5b506102d36102ce366004612a0b565b6108d1565b60405190151581526020015b60405180910390f35b3480156102f457600080fd5b50600d545b6040519081526020016102df565b34801561031357600080fd5b5061031c610923565b6040516102df9190612c66565b34801561033557600080fd5b50610349610344366004612aa5565b6109b5565b6040516001600160a01b0390911681526020016102df565b34801561036d57600080fd5b5061038161037c366004612932565b6109dc565b005b610381610391366004612aa5565b610af7565b3480156103a257600080fd5b50600e546102f9565b3480156103b757600080fd5b506103816103c6366004612abe565b610d96565b3480156103d757600080fd5b506103816103e63660046127e3565b610de0565b3480156103f757600080fd5b50610381610406366004612aa5565b610e11565b34801561041757600080fd5b50610381610426366004612aa5565b610ed3565b34801561043757600080fd5b50610381610446366004612aa5565b610f17565b34801561045757600080fd5b506102f961046636600461278e565b6001600160a01b03166000908152601b602052604090205490565b34801561048d57600080fd5b5061038161049c366004612abe565b610f5b565b3480156104ad57600080fd5b506103816104bc3660046127e3565b610fa5565b3480156104cd57600080fd5b506103816104dc36600461295c565b610fc0565b3480156104ed57600080fd5b506105016104fc36600461278e565b6110fb565b6040516102df9190612c3e565b34801561051a57600080fd5b506008546001600160a01b0316610349565b34801561053857600080fd5b5061031c61117b565b34801561054d57600080fd5b5061038161055c366004612a45565b61118a565b61038161056f366004612aa5565b6111d5565b34801561058057600080fd5b5061034961058f366004612aa5565b6113f2565b3480156105a057600080fd5b506105b46105af36600461278e565b611452565b6040516102df9190612c0c565b3480156105cd57600080fd5b506102f96105dc36600461278e565b611593565b3480156105ed57600080fd5b50610381611619565b34801561060257600080fd5b50610381610611366004612aa5565b61162d565b34801561062257600080fd5b506000546001600160a01b0316610349565b34801561064057600080fd5b506102f961064f36600461278e565b6001600160a01b031660009081526015602052604090205490565b34801561067657600080fd5b5061031c611671565b34801561068b57600080fd5b5061031c611680565b3480156106a057600080fd5b506103816106af3660046128fb565b61168f565b3480156106c057600080fd5b506103816106cf366004612a45565b61169e565b3480156106e057600080fd5b506103816106ef366004612aa5565b6116e9565b34801561070057600080fd5b5061038161070f366004612aa5565b61172d565b34801561072057600080fd5b5061038161072f366004612aa5565b611771565b34801561074057600080fd5b5061038161074f36600461281f565b6117b5565b34801561076057600080fd5b5061038161076f366004612aa5565b6117ed565b34801561078057600080fd5b50476102f9565b34801561079357600080fd5b5061031c6107a2366004612aa5565b611831565b3480156107b357600080fd5b506103816107c2366004612aa5565b6118e0565b3480156107d357600080fd5b506103816107e236600461278e565b6119e8565b3480156107f357600080fd5b506102f961080236600461278e565b611a12565b34801561081357600080fd5b50600c546102f9565b34801561082857600080fd5b506102d36108373660046127b0565b611a40565b34801561084857600080fd5b5061038161085736600461278e565b611a6e565b34801561086857600080fd5b506103816108773660046129d1565b611ae7565b34801561088857600080fd5b50600b546102f9565b34801561089d57600080fd5b506103816108ac3660046129d1565b611b39565b3480156108bd57600080fd5b506105016108cc36600461278e565b611b8b565b60006001600160e01b031982166380ac58cd60e01b148061090257506001600160e01b03198216635b5e139f60e01b145b8061091d57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606001805461093290612dee565b80601f016020809104026020016040519081016040528092919081815260200182805461095e90612dee565b80156109ab5780601f10610980576101008083540402835291602001916109ab565b820191906000526020600020905b81548152906001019060200180831161098e57829003601f168201915b5050505050905090565b60006109c082611bf9565b506000908152600560205260409020546001600160a01b031690565b60006109e7826113f2565b9050806001600160a01b0316836001600160a01b03161415610a5a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610a765750610a768133611a40565b610ae85760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610a51565b610af28383611c58565b505050565b60026007541415610b4a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a51565b60026007556000610b5a336110fb565b805190915015610bac5760405162461bcd60e51b815260206004820152601760248201527f505249564154452053414c453a2073757370656e6465640000000000000000006044820152606401610a51565b60208101511580610bcb5750610bc3601e42612d60565b602082015111155b610c175760405162461bcd60e51b815260206004820152601760248201527f505249564154452053414c453a206e6f74206f70656e640000000000000000006044820152606401610a51565b60408101511580610c38575060408101514290610c3690601e90612d60565b115b610c7d5760405162461bcd60e51b8152602060048201526016602482015275141492559055114814d053114e88199a5b9a5cda195960521b6044820152606401610a51565b6080810151600114610cd15760405162461bcd60e51b815260206004820152601d60248201527f505249564154452053414c453a206e6f742077686974656c69737465640000006044820152606401610a51565b60c08101511580610cf5575060a0810151610ced908390612d60565b60c082015110155b610d415760405162461bcd60e51b815260206004820152601f60248201527f505249564154452053414c453a207265616368656420746865206c696d6974006044820152606401610a51565b610d5f33838360035b6020020151610d599190612d8c565b34611cc6565b610d693383611d62565b3360009081526015602052604081208054849290610d88908490612d60565b909155505060016007555050565b6000546001600160a01b0316331480610db957506008546001600160a01b031633145b610dd55760405162461bcd60e51b8152600401610a5190612ccb565b601791909155601855565b610dea3382611eba565b610e065760405162461bcd60e51b8152600401610a5190612d12565b610af2838383611f19565b6000546001600160a01b0316331480610e3457506008546001600160a01b031633145b610e505760405162461bcd60e51b8152600401610a5190612ccb565b47811115610e975760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b6044820152606401610a51565b600080546040516001600160a01b039091169182916108fc85150291859190818181858888f19350505050158015610af2573d6000803e3d6000fd5b6000546001600160a01b0316331480610ef657506008546001600160a01b031633145b610f125760405162461bcd60e51b8152600401610a5190612ccb565b601a55565b6000546001600160a01b0316331480610f3a57506008546001600160a01b031633145b610f565760405162461bcd60e51b8152600401610a5190612ccb565b600b55565b6000546001600160a01b0316331480610f7e57506008546001600160a01b031633145b610f9a5760405162461bcd60e51b8152600401610a5190612ccb565b601091909155601155565b610af2838383604051806020016040528060008152506117b5565b6000546001600160a01b0316331480610fe357506008546001600160a01b031633145b610fff5760405162461bcd60e51b8152600401610a5190612ccb565b61100b6014600061267e565b60005b81811015610af257600083838381811061102a5761102a612e84565b905060200201602081019061103f919061278e565b6001600160a01b0316141561108e5760405162461bcd60e51b8152602060048201526015602482015274141492559055114e881a5b9d985b1a59081b1a5cdd605a1b6044820152606401610a51565b60148383838181106110a2576110a2612e84565b90506020020160208101906110b7919061278e565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b03909216919091179055806110f381612e29565b91505061100e565b61110361269c565b61110b61269c565b600f5460ff161561111b57600181525b60105460208201526011546040820152601254606082015261113e6014846120b5565b1561114b57600160808201525b6001600160a01b03831660009081526015602052604090205460a08201526013548160065b602002015292915050565b60606009805461093290612dee565b6000546001600160a01b03163314806111ad57506008546001600160a01b031633145b6111c95760405162461bcd60e51b8152600401610a5190612ccb565b610af2600a83836126ba565b600260075414156112285760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a51565b6002600755600061123833611b8b565b8051909150156112835760405162461bcd60e51b8152602060048201526016602482015275141550931250c814d053114e881cdd5cdc195b99195960521b6044820152606401610a51565b602081015115806112a2575061129a601e42612d60565b602082015111155b6112e75760405162461bcd60e51b8152602060048201526016602482015275141550931250c814d053114e881b9bdd081bdc195b9960521b6044820152606401610a51565b6040810151158061130857506040810151429061130690601e90612d60565b115b61134c5760405162461bcd60e51b8152602060048201526015602482015274141550931250c814d053114e88199a5b9a5cda1959605a1b6044820152606401610a51565b60c08101511580611370575060a0810151611368908390612d60565b60c082015110155b6113bc5760405162461bcd60e51b815260206004820152601e60248201527f5055424c49432053414c453a207265616368656420746865206c696d697400006044820152606401610a51565b6113c93383836003610d4a565b6113d33383611d62565b336000908152601b602052604081208054849290610d88908490612d60565b6000818152600360205260408120546001600160a01b03168061091d5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610a51565b61145a61273e565b61146261273e565b61146a61269c565b6114756014856120b5565b80156114a1575060115415806114a157506114926002601e612d78565b61149c9042612d60565b601154115b156114bd57600160e08301526114b6846110fb565b90506114d0565b600260e08301526114cd84611b8b565b90505b60005b600781101561151c578181600781106114ee576114ee612e84565b60200201518382600b811061150557611505612e84565b60200201528061151481612e29565b9150506114d3565b50600e548261152d60076001612d60565b600b811061153d5761153d612e84565b6020020152600b548261155260076002612d60565b600b811061156257611562612e84565b6020020152600d548261157760076003612d60565b600b811061158757611587612e84565b60200201525092915050565b60006001600160a01b0382166115fd5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610a51565b506001600160a01b031660009081526004602052604090205490565b611621612185565b61162b60006121df565b565b6000546001600160a01b031633148061165057506008546001600160a01b031633145b61166c5760405162461bcd60e51b8152600401610a5190612ccb565b601255565b60606002805461093290612dee565b6060600a805461093290612dee565b61169a33838361222f565b5050565b6000546001600160a01b03163314806116c157506008546001600160a01b031633145b6116dd5760405162461bcd60e51b8152600401610a5190612ccb565b610af2600983836126ba565b6000546001600160a01b031633148061170c57506008546001600160a01b031633145b6117285760405162461bcd60e51b8152600401610a5190612ccb565b601355565b6000546001600160a01b031633148061175057506008546001600160a01b031633145b61176c5760405162461bcd60e51b8152600401610a5190612ccb565b600d55565b6000546001600160a01b031633148061179457506008546001600160a01b031633145b6117b05760405162461bcd60e51b8152600401610a5190612ccb565b600c55565b6117bf3383611eba565b6117db5760405162461bcd60e51b8152600401610a5190612d12565b6117e7848484846122fe565b50505050565b6000546001600160a01b031633148061181057506008546001600160a01b031633145b61182c5760405162461bcd60e51b8152600401610a5190612ccb565b601955565b6000818152600360205260409020546060906001600160a01b031661188c5760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b6044820152606401610a51565b6000600a805461189b90612dee565b905011156118d557600a6118ae83612331565b6040516020016118bf929190612b28565b6040516020818303038152906040529050919050565b60096118ae83612331565b6000546001600160a01b031633148061190357506008546001600160a01b031633145b61191f5760405162461bcd60e51b8152600401610a5190612ccb565b600c5481600e546119309190612d60565b111561197e5760405162461bcd60e51b815260206004820152601e60248201527f657863656564656420746865207265736572766174696f6e2072616e676500006044820152606401610a51565b60005b818110156119cd576119bb61199e6000546001600160a01b031690565b6119a9836001612d60565b600e546119b69190612d60565b61242f565b806119c581612e29565b915050611981565b5080600e60008282546119e09190612d60565b909155505050565b6119f0612185565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152601b6020908152604080832054601590925282205461091d9190612d60565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b611a76612185565b6001600160a01b038116611adb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a51565b611ae4816121df565b50565b6000546001600160a01b0316331480611b0a57506008546001600160a01b031633145b611b265760405162461bcd60e51b8152600401610a5190612ccb565b6016805460ff1916911515919091179055565b6000546001600160a01b0316331480611b5c57506008546001600160a01b031633145b611b785760405162461bcd60e51b8152600401610a5190612ccb565b600f805460ff1916911515919091179055565b611b9361269c565b611b9b61269c565b60165460ff1615611bab57600181525b6017546020808301919091526018546040808401919091526019546060840152600160808401526001600160a01b0385166000908152601b90925290205460a0820152601a54816006611170565b6000818152600360205260409020546001600160a01b0316611ae45760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610a51565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611c8d826113f2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b80821115611d0b5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742076616c756560701b6044820152606401610a51565b80821015610af2576000611d1f8383612dab565b60405190915084906001600160a01b0382169083156108fc029084906000818181858888f19350505050158015611d5a573d6000803e3d6000fd5b505050505050565b600c54600e541015611db65760405162461bcd60e51b815260206004820152601860248201527f7265736572766174696f6e206e6f742066696e697368656400000000000000006044820152606401610a51565b600b5481600e54611dc79190612d60565b1115611e155760405162461bcd60e51b815260206004820152601960248201527f65786365656465642074686520737570706c792072616e6765000000000000006044820152606401610a51565b600d541580611e26575080600d5410155b611e725760405162461bcd60e51b815260206004820152601760248201527f72656163686564206d696e74206c696d69746174696f6e0000000000000000006044820152606401610a51565b60005b81811015611e9e57611e8c836119a9836001612d60565b80611e9681612e29565b915050611e75565b5080600e6000828254611eb19190612d60565b90915550505050565b600080611ec6836113f2565b9050806001600160a01b0316846001600160a01b03161480611eed5750611eed8185611a40565b80611f115750836001600160a01b0316611f06846109b5565b6001600160a01b0316145b949350505050565b826001600160a01b0316611f2c826113f2565b6001600160a01b031614611f905760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610a51565b6001600160a01b038216611ff25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a51565b611ffd600082611c58565b6001600160a01b0383166000908152600460205260408120805460019290612026908490612dab565b90915550506001600160a01b0382166000908152600460205260408120805460019290612054908490612d60565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000805b835481101561217b578381815481106120d4576120d4612e84565b600091825260209091200154604051631846d2f560e31b81526001600160a01b0385811660048301529091169063c23697a89060240160206040518083038186803b15801561212257600080fd5b505afa158015612136573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215a91906129ee565b1561216957600191505061091d565b8061217381612e29565b9150506120b9565b5060009392505050565b6000546001600160a01b0316331461162b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a51565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031614156122915760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a51565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612309848484611f19565b61231584848484612571565b6117e75760405162461bcd60e51b8152600401610a5190612c79565b6060816123555750506040805180820190915260018152600360fc1b602082015290565b8160005b811561237f578061236981612e29565b91506123789050600a83612d78565b9150612359565b60008167ffffffffffffffff81111561239a5761239a612e9a565b6040519080825280601f01601f1916602001820160405280156123c4576020820181803683370190505b5090505b8415611f11576123d9600183612dab565b91506123e6600a86612e44565b6123f1906030612d60565b60f81b81838151811061240657612406612e84565b60200101906001600160f81b031916908160001a905350612428600a86612d78565b94506123c8565b6001600160a01b0382166124855760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a51565b6000818152600360205260409020546001600160a01b0316156124ea5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a51565b6001600160a01b0382166000908152600460205260408120805460019290612513908490612d60565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561267357604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906125b5903390899088908890600401612bcf565b602060405180830381600087803b1580156125cf57600080fd5b505af19250505080156125ff575060408051601f3d908101601f191682019092526125fc91810190612a28565b60015b612659573d80801561262d576040519150601f19603f3d011682016040523d82523d6000602084013e612632565b606091505b5080516126515760405162461bcd60e51b8152600401610a5190612c79565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f11565b506001949350505050565b5080546000825590600052602060002090810190611ae4919061275d565b6040518060e001604052806007906020820280368337509192915050565b8280546126c690612dee565b90600052602060002090601f0160209004810192826126e8576000855561272e565b82601f106127015782800160ff1982351617855561272e565b8280016001018555821561272e579182015b8281111561272e578235825591602001919060010190612713565b5061273a92915061275d565b5090565b604051806101600160405280600b906020820280368337509192915050565b5b8082111561273a576000815560010161275e565b80356001600160a01b038116811461278957600080fd5b919050565b6000602082840312156127a057600080fd5b6127a982612772565b9392505050565b600080604083850312156127c357600080fd5b6127cc83612772565b91506127da60208401612772565b90509250929050565b6000806000606084860312156127f857600080fd5b61280184612772565b925061280f60208501612772565b9150604084013590509250925092565b6000806000806080858703121561283557600080fd5b61283e85612772565b935061284c60208601612772565b925060408501359150606085013567ffffffffffffffff8082111561287057600080fd5b818701915087601f83011261288457600080fd5b81358181111561289657612896612e9a565b604051601f8201601f19908116603f011681019083821181831017156128be576128be612e9a565b816040528281528a60208487010111156128d757600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561290e57600080fd5b61291783612772565b9150602083013561292781612eb0565b809150509250929050565b6000806040838503121561294557600080fd5b61294e83612772565b946020939093013593505050565b6000806020838503121561296f57600080fd5b823567ffffffffffffffff8082111561298757600080fd5b818501915085601f83011261299b57600080fd5b8135818111156129aa57600080fd5b8660208260051b85010111156129bf57600080fd5b60209290920196919550909350505050565b6000602082840312156129e357600080fd5b81356127a981612eb0565b600060208284031215612a0057600080fd5b81516127a981612eb0565b600060208284031215612a1d57600080fd5b81356127a981612ebe565b600060208284031215612a3a57600080fd5b81516127a981612ebe565b60008060208385031215612a5857600080fd5b823567ffffffffffffffff80821115612a7057600080fd5b818501915085601f830112612a8457600080fd5b813581811115612a9357600080fd5b8660208285010111156129bf57600080fd5b600060208284031215612ab757600080fd5b5035919050565b60008060408385031215612ad157600080fd5b50508035926020909101359150565b60008151808452612af8816020860160208601612dc2565b601f01601f19169290920160200192915050565b60008151612b1e818560208601612dc2565b9290920192915050565b600080845481600182811c915080831680612b4457607f831692505b6020808410821415612b6457634e487b7160e01b86526022600452602486fd5b818015612b785760018114612b8957612bb6565b60ff19861689528489019650612bb6565b60008b81526020902060005b86811015612bae5781548b820152908501908301612b95565b505084890196505b505050505050612bc68185612b0c565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612c0290830184612ae0565b9695505050505050565b6101608101818360005b600b811015612c35578151835260209283019290910190600101612c16565b50505092915050565b60e08101818360005b6007811015612c35578151835260209283019290910190600101612c47565b6020815260006127a96020830184612ae0565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526027908201527f63616c6c6572206973206e6f7420746865206f776e6572206e6569746865722060408201526636b0b730b3b2b960c91b606082015260800190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b60008219821115612d7357612d73612e58565b500190565b600082612d8757612d87612e6e565b500490565b6000816000190483118215151615612da657612da6612e58565b500290565b600082821015612dbd57612dbd612e58565b500390565b60005b83811015612ddd578181015183820152602001612dc5565b838111156117e75750506000910152565b600181811c90821680612e0257607f821691505b60208210811415612e2357634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612e3d57612e3d612e58565b5060010190565b600082612e5357612e53612e6e565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114611ae457600080fd5b6001600160e01b031981168114611ae457600080fdfea2646970667358221220b75328d053c3848af8b6dc5f0200e16d278364accd36047020992757e22d56ef64736f6c63430008070033697066733a2f2f516d5833533943744e784e424776793331724e63534344364c436d776348334a785477685558577a4c58426e4e4a2f

Deployed Bytecode

0x6080604052600436106102ae5760003560e01c8063715018a611610175578063be900d40116100dc578063e195d09611610095578063f34e1ea11161006f578063f34e1ea11461085c578063f7ee70681461087c578063f92e4ba514610891578063ff4b629e146108b157600080fd5b8063e195d09614610807578063e985e9c51461081c578063f2fde38b1461083c57600080fd5b8063be900d4014610754578063c71daccb14610774578063c87b56dd14610787578063d031370b146107a7578063d0ebdbe7146107c7578063d1e5aa51146107e757600080fd5b8063a22cb4651161012e578063a22cb46514610694578063ac1349a1146106b4578063b01d98a7146106d4578063b1077d40146106f4578063b6202ef914610714578063b88d4fde1461073457600080fd5b8063715018a6146105e15780637c34441e146105f65780638da5cb5b146106165780639400bac21461063457806395d89b411461066a578063a04e5f7f1461067f57600080fd5b80633953015b1161021957806352c0295f116101d257806352c0295f1461052c5780635d8ceea9146105415780635e59da6b146105615780636352211e146105745780636386c1c71461059457806370a08231146105c157600080fd5b80633953015b1461044b5780633ef4400f1461048157806342842e0e146104a15780634648b01a146104c157806347f40f84146104e1578063481c6a751461050e57600080fd5b806318160ddd1161026b57806318160ddd146103965780631c58eec5146103ab57806323b872dd146103cb5780632e1a7d4d146103eb5780632ff2b8361461040b578063375926181461042b57600080fd5b806301ffc9a7146102b357806304540d37146102e857806306fdde0314610307578063081812fc14610329578063095ea7b314610361578063109065b014610383575b600080fd5b3480156102bf57600080fd5b506102d36102ce366004612a0b565b6108d1565b60405190151581526020015b60405180910390f35b3480156102f457600080fd5b50600d545b6040519081526020016102df565b34801561031357600080fd5b5061031c610923565b6040516102df9190612c66565b34801561033557600080fd5b50610349610344366004612aa5565b6109b5565b6040516001600160a01b0390911681526020016102df565b34801561036d57600080fd5b5061038161037c366004612932565b6109dc565b005b610381610391366004612aa5565b610af7565b3480156103a257600080fd5b50600e546102f9565b3480156103b757600080fd5b506103816103c6366004612abe565b610d96565b3480156103d757600080fd5b506103816103e63660046127e3565b610de0565b3480156103f757600080fd5b50610381610406366004612aa5565b610e11565b34801561041757600080fd5b50610381610426366004612aa5565b610ed3565b34801561043757600080fd5b50610381610446366004612aa5565b610f17565b34801561045757600080fd5b506102f961046636600461278e565b6001600160a01b03166000908152601b602052604090205490565b34801561048d57600080fd5b5061038161049c366004612abe565b610f5b565b3480156104ad57600080fd5b506103816104bc3660046127e3565b610fa5565b3480156104cd57600080fd5b506103816104dc36600461295c565b610fc0565b3480156104ed57600080fd5b506105016104fc36600461278e565b6110fb565b6040516102df9190612c3e565b34801561051a57600080fd5b506008546001600160a01b0316610349565b34801561053857600080fd5b5061031c61117b565b34801561054d57600080fd5b5061038161055c366004612a45565b61118a565b61038161056f366004612aa5565b6111d5565b34801561058057600080fd5b5061034961058f366004612aa5565b6113f2565b3480156105a057600080fd5b506105b46105af36600461278e565b611452565b6040516102df9190612c0c565b3480156105cd57600080fd5b506102f96105dc36600461278e565b611593565b3480156105ed57600080fd5b50610381611619565b34801561060257600080fd5b50610381610611366004612aa5565b61162d565b34801561062257600080fd5b506000546001600160a01b0316610349565b34801561064057600080fd5b506102f961064f36600461278e565b6001600160a01b031660009081526015602052604090205490565b34801561067657600080fd5b5061031c611671565b34801561068b57600080fd5b5061031c611680565b3480156106a057600080fd5b506103816106af3660046128fb565b61168f565b3480156106c057600080fd5b506103816106cf366004612a45565b61169e565b3480156106e057600080fd5b506103816106ef366004612aa5565b6116e9565b34801561070057600080fd5b5061038161070f366004612aa5565b61172d565b34801561072057600080fd5b5061038161072f366004612aa5565b611771565b34801561074057600080fd5b5061038161074f36600461281f565b6117b5565b34801561076057600080fd5b5061038161076f366004612aa5565b6117ed565b34801561078057600080fd5b50476102f9565b34801561079357600080fd5b5061031c6107a2366004612aa5565b611831565b3480156107b357600080fd5b506103816107c2366004612aa5565b6118e0565b3480156107d357600080fd5b506103816107e236600461278e565b6119e8565b3480156107f357600080fd5b506102f961080236600461278e565b611a12565b34801561081357600080fd5b50600c546102f9565b34801561082857600080fd5b506102d36108373660046127b0565b611a40565b34801561084857600080fd5b5061038161085736600461278e565b611a6e565b34801561086857600080fd5b506103816108773660046129d1565b611ae7565b34801561088857600080fd5b50600b546102f9565b34801561089d57600080fd5b506103816108ac3660046129d1565b611b39565b3480156108bd57600080fd5b506105016108cc36600461278e565b611b8b565b60006001600160e01b031982166380ac58cd60e01b148061090257506001600160e01b03198216635b5e139f60e01b145b8061091d57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606001805461093290612dee565b80601f016020809104026020016040519081016040528092919081815260200182805461095e90612dee565b80156109ab5780601f10610980576101008083540402835291602001916109ab565b820191906000526020600020905b81548152906001019060200180831161098e57829003601f168201915b5050505050905090565b60006109c082611bf9565b506000908152600560205260409020546001600160a01b031690565b60006109e7826113f2565b9050806001600160a01b0316836001600160a01b03161415610a5a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610a765750610a768133611a40565b610ae85760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610a51565b610af28383611c58565b505050565b60026007541415610b4a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a51565b60026007556000610b5a336110fb565b805190915015610bac5760405162461bcd60e51b815260206004820152601760248201527f505249564154452053414c453a2073757370656e6465640000000000000000006044820152606401610a51565b60208101511580610bcb5750610bc3601e42612d60565b602082015111155b610c175760405162461bcd60e51b815260206004820152601760248201527f505249564154452053414c453a206e6f74206f70656e640000000000000000006044820152606401610a51565b60408101511580610c38575060408101514290610c3690601e90612d60565b115b610c7d5760405162461bcd60e51b8152602060048201526016602482015275141492559055114814d053114e88199a5b9a5cda195960521b6044820152606401610a51565b6080810151600114610cd15760405162461bcd60e51b815260206004820152601d60248201527f505249564154452053414c453a206e6f742077686974656c69737465640000006044820152606401610a51565b60c08101511580610cf5575060a0810151610ced908390612d60565b60c082015110155b610d415760405162461bcd60e51b815260206004820152601f60248201527f505249564154452053414c453a207265616368656420746865206c696d6974006044820152606401610a51565b610d5f33838360035b6020020151610d599190612d8c565b34611cc6565b610d693383611d62565b3360009081526015602052604081208054849290610d88908490612d60565b909155505060016007555050565b6000546001600160a01b0316331480610db957506008546001600160a01b031633145b610dd55760405162461bcd60e51b8152600401610a5190612ccb565b601791909155601855565b610dea3382611eba565b610e065760405162461bcd60e51b8152600401610a5190612d12565b610af2838383611f19565b6000546001600160a01b0316331480610e3457506008546001600160a01b031633145b610e505760405162461bcd60e51b8152600401610a5190612ccb565b47811115610e975760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b6044820152606401610a51565b600080546040516001600160a01b039091169182916108fc85150291859190818181858888f19350505050158015610af2573d6000803e3d6000fd5b6000546001600160a01b0316331480610ef657506008546001600160a01b031633145b610f125760405162461bcd60e51b8152600401610a5190612ccb565b601a55565b6000546001600160a01b0316331480610f3a57506008546001600160a01b031633145b610f565760405162461bcd60e51b8152600401610a5190612ccb565b600b55565b6000546001600160a01b0316331480610f7e57506008546001600160a01b031633145b610f9a5760405162461bcd60e51b8152600401610a5190612ccb565b601091909155601155565b610af2838383604051806020016040528060008152506117b5565b6000546001600160a01b0316331480610fe357506008546001600160a01b031633145b610fff5760405162461bcd60e51b8152600401610a5190612ccb565b61100b6014600061267e565b60005b81811015610af257600083838381811061102a5761102a612e84565b905060200201602081019061103f919061278e565b6001600160a01b0316141561108e5760405162461bcd60e51b8152602060048201526015602482015274141492559055114e881a5b9d985b1a59081b1a5cdd605a1b6044820152606401610a51565b60148383838181106110a2576110a2612e84565b90506020020160208101906110b7919061278e565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b03909216919091179055806110f381612e29565b91505061100e565b61110361269c565b61110b61269c565b600f5460ff161561111b57600181525b60105460208201526011546040820152601254606082015261113e6014846120b5565b1561114b57600160808201525b6001600160a01b03831660009081526015602052604090205460a08201526013548160065b602002015292915050565b60606009805461093290612dee565b6000546001600160a01b03163314806111ad57506008546001600160a01b031633145b6111c95760405162461bcd60e51b8152600401610a5190612ccb565b610af2600a83836126ba565b600260075414156112285760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a51565b6002600755600061123833611b8b565b8051909150156112835760405162461bcd60e51b8152602060048201526016602482015275141550931250c814d053114e881cdd5cdc195b99195960521b6044820152606401610a51565b602081015115806112a2575061129a601e42612d60565b602082015111155b6112e75760405162461bcd60e51b8152602060048201526016602482015275141550931250c814d053114e881b9bdd081bdc195b9960521b6044820152606401610a51565b6040810151158061130857506040810151429061130690601e90612d60565b115b61134c5760405162461bcd60e51b8152602060048201526015602482015274141550931250c814d053114e88199a5b9a5cda1959605a1b6044820152606401610a51565b60c08101511580611370575060a0810151611368908390612d60565b60c082015110155b6113bc5760405162461bcd60e51b815260206004820152601e60248201527f5055424c49432053414c453a207265616368656420746865206c696d697400006044820152606401610a51565b6113c93383836003610d4a565b6113d33383611d62565b336000908152601b602052604081208054849290610d88908490612d60565b6000818152600360205260408120546001600160a01b03168061091d5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610a51565b61145a61273e565b61146261273e565b61146a61269c565b6114756014856120b5565b80156114a1575060115415806114a157506114926002601e612d78565b61149c9042612d60565b601154115b156114bd57600160e08301526114b6846110fb565b90506114d0565b600260e08301526114cd84611b8b565b90505b60005b600781101561151c578181600781106114ee576114ee612e84565b60200201518382600b811061150557611505612e84565b60200201528061151481612e29565b9150506114d3565b50600e548261152d60076001612d60565b600b811061153d5761153d612e84565b6020020152600b548261155260076002612d60565b600b811061156257611562612e84565b6020020152600d548261157760076003612d60565b600b811061158757611587612e84565b60200201525092915050565b60006001600160a01b0382166115fd5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610a51565b506001600160a01b031660009081526004602052604090205490565b611621612185565b61162b60006121df565b565b6000546001600160a01b031633148061165057506008546001600160a01b031633145b61166c5760405162461bcd60e51b8152600401610a5190612ccb565b601255565b60606002805461093290612dee565b6060600a805461093290612dee565b61169a33838361222f565b5050565b6000546001600160a01b03163314806116c157506008546001600160a01b031633145b6116dd5760405162461bcd60e51b8152600401610a5190612ccb565b610af2600983836126ba565b6000546001600160a01b031633148061170c57506008546001600160a01b031633145b6117285760405162461bcd60e51b8152600401610a5190612ccb565b601355565b6000546001600160a01b031633148061175057506008546001600160a01b031633145b61176c5760405162461bcd60e51b8152600401610a5190612ccb565b600d55565b6000546001600160a01b031633148061179457506008546001600160a01b031633145b6117b05760405162461bcd60e51b8152600401610a5190612ccb565b600c55565b6117bf3383611eba565b6117db5760405162461bcd60e51b8152600401610a5190612d12565b6117e7848484846122fe565b50505050565b6000546001600160a01b031633148061181057506008546001600160a01b031633145b61182c5760405162461bcd60e51b8152600401610a5190612ccb565b601955565b6000818152600360205260409020546060906001600160a01b031661188c5760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b6044820152606401610a51565b6000600a805461189b90612dee565b905011156118d557600a6118ae83612331565b6040516020016118bf929190612b28565b6040516020818303038152906040529050919050565b60096118ae83612331565b6000546001600160a01b031633148061190357506008546001600160a01b031633145b61191f5760405162461bcd60e51b8152600401610a5190612ccb565b600c5481600e546119309190612d60565b111561197e5760405162461bcd60e51b815260206004820152601e60248201527f657863656564656420746865207265736572766174696f6e2072616e676500006044820152606401610a51565b60005b818110156119cd576119bb61199e6000546001600160a01b031690565b6119a9836001612d60565b600e546119b69190612d60565b61242f565b806119c581612e29565b915050611981565b5080600e60008282546119e09190612d60565b909155505050565b6119f0612185565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152601b6020908152604080832054601590925282205461091d9190612d60565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b611a76612185565b6001600160a01b038116611adb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a51565b611ae4816121df565b50565b6000546001600160a01b0316331480611b0a57506008546001600160a01b031633145b611b265760405162461bcd60e51b8152600401610a5190612ccb565b6016805460ff1916911515919091179055565b6000546001600160a01b0316331480611b5c57506008546001600160a01b031633145b611b785760405162461bcd60e51b8152600401610a5190612ccb565b600f805460ff1916911515919091179055565b611b9361269c565b611b9b61269c565b60165460ff1615611bab57600181525b6017546020808301919091526018546040808401919091526019546060840152600160808401526001600160a01b0385166000908152601b90925290205460a0820152601a54816006611170565b6000818152600360205260409020546001600160a01b0316611ae45760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610a51565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611c8d826113f2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b80821115611d0b5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742076616c756560701b6044820152606401610a51565b80821015610af2576000611d1f8383612dab565b60405190915084906001600160a01b0382169083156108fc029084906000818181858888f19350505050158015611d5a573d6000803e3d6000fd5b505050505050565b600c54600e541015611db65760405162461bcd60e51b815260206004820152601860248201527f7265736572766174696f6e206e6f742066696e697368656400000000000000006044820152606401610a51565b600b5481600e54611dc79190612d60565b1115611e155760405162461bcd60e51b815260206004820152601960248201527f65786365656465642074686520737570706c792072616e6765000000000000006044820152606401610a51565b600d541580611e26575080600d5410155b611e725760405162461bcd60e51b815260206004820152601760248201527f72656163686564206d696e74206c696d69746174696f6e0000000000000000006044820152606401610a51565b60005b81811015611e9e57611e8c836119a9836001612d60565b80611e9681612e29565b915050611e75565b5080600e6000828254611eb19190612d60565b90915550505050565b600080611ec6836113f2565b9050806001600160a01b0316846001600160a01b03161480611eed5750611eed8185611a40565b80611f115750836001600160a01b0316611f06846109b5565b6001600160a01b0316145b949350505050565b826001600160a01b0316611f2c826113f2565b6001600160a01b031614611f905760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610a51565b6001600160a01b038216611ff25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a51565b611ffd600082611c58565b6001600160a01b0383166000908152600460205260408120805460019290612026908490612dab565b90915550506001600160a01b0382166000908152600460205260408120805460019290612054908490612d60565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000805b835481101561217b578381815481106120d4576120d4612e84565b600091825260209091200154604051631846d2f560e31b81526001600160a01b0385811660048301529091169063c23697a89060240160206040518083038186803b15801561212257600080fd5b505afa158015612136573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215a91906129ee565b1561216957600191505061091d565b8061217381612e29565b9150506120b9565b5060009392505050565b6000546001600160a01b0316331461162b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a51565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031614156122915760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a51565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612309848484611f19565b61231584848484612571565b6117e75760405162461bcd60e51b8152600401610a5190612c79565b6060816123555750506040805180820190915260018152600360fc1b602082015290565b8160005b811561237f578061236981612e29565b91506123789050600a83612d78565b9150612359565b60008167ffffffffffffffff81111561239a5761239a612e9a565b6040519080825280601f01601f1916602001820160405280156123c4576020820181803683370190505b5090505b8415611f11576123d9600183612dab565b91506123e6600a86612e44565b6123f1906030612d60565b60f81b81838151811061240657612406612e84565b60200101906001600160f81b031916908160001a905350612428600a86612d78565b94506123c8565b6001600160a01b0382166124855760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a51565b6000818152600360205260409020546001600160a01b0316156124ea5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a51565b6001600160a01b0382166000908152600460205260408120805460019290612513908490612d60565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561267357604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906125b5903390899088908890600401612bcf565b602060405180830381600087803b1580156125cf57600080fd5b505af19250505080156125ff575060408051601f3d908101601f191682019092526125fc91810190612a28565b60015b612659573d80801561262d576040519150601f19603f3d011682016040523d82523d6000602084013e612632565b606091505b5080516126515760405162461bcd60e51b8152600401610a5190612c79565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f11565b506001949350505050565b5080546000825590600052602060002090810190611ae4919061275d565b6040518060e001604052806007906020820280368337509192915050565b8280546126c690612dee565b90600052602060002090601f0160209004810192826126e8576000855561272e565b82601f106127015782800160ff1982351617855561272e565b8280016001018555821561272e579182015b8281111561272e578235825591602001919060010190612713565b5061273a92915061275d565b5090565b604051806101600160405280600b906020820280368337509192915050565b5b8082111561273a576000815560010161275e565b80356001600160a01b038116811461278957600080fd5b919050565b6000602082840312156127a057600080fd5b6127a982612772565b9392505050565b600080604083850312156127c357600080fd5b6127cc83612772565b91506127da60208401612772565b90509250929050565b6000806000606084860312156127f857600080fd5b61280184612772565b925061280f60208501612772565b9150604084013590509250925092565b6000806000806080858703121561283557600080fd5b61283e85612772565b935061284c60208601612772565b925060408501359150606085013567ffffffffffffffff8082111561287057600080fd5b818701915087601f83011261288457600080fd5b81358181111561289657612896612e9a565b604051601f8201601f19908116603f011681019083821181831017156128be576128be612e9a565b816040528281528a60208487010111156128d757600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561290e57600080fd5b61291783612772565b9150602083013561292781612eb0565b809150509250929050565b6000806040838503121561294557600080fd5b61294e83612772565b946020939093013593505050565b6000806020838503121561296f57600080fd5b823567ffffffffffffffff8082111561298757600080fd5b818501915085601f83011261299b57600080fd5b8135818111156129aa57600080fd5b8660208260051b85010111156129bf57600080fd5b60209290920196919550909350505050565b6000602082840312156129e357600080fd5b81356127a981612eb0565b600060208284031215612a0057600080fd5b81516127a981612eb0565b600060208284031215612a1d57600080fd5b81356127a981612ebe565b600060208284031215612a3a57600080fd5b81516127a981612ebe565b60008060208385031215612a5857600080fd5b823567ffffffffffffffff80821115612a7057600080fd5b818501915085601f830112612a8457600080fd5b813581811115612a9357600080fd5b8660208285010111156129bf57600080fd5b600060208284031215612ab757600080fd5b5035919050565b60008060408385031215612ad157600080fd5b50508035926020909101359150565b60008151808452612af8816020860160208601612dc2565b601f01601f19169290920160200192915050565b60008151612b1e818560208601612dc2565b9290920192915050565b600080845481600182811c915080831680612b4457607f831692505b6020808410821415612b6457634e487b7160e01b86526022600452602486fd5b818015612b785760018114612b8957612bb6565b60ff19861689528489019650612bb6565b60008b81526020902060005b86811015612bae5781548b820152908501908301612b95565b505084890196505b505050505050612bc68185612b0c565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612c0290830184612ae0565b9695505050505050565b6101608101818360005b600b811015612c35578151835260209283019290910190600101612c16565b50505092915050565b60e08101818360005b6007811015612c35578151835260209283019290910190600101612c47565b6020815260006127a96020830184612ae0565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526027908201527f63616c6c6572206973206e6f7420746865206f776e6572206e6569746865722060408201526636b0b730b3b2b960c91b606082015260800190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b60008219821115612d7357612d73612e58565b500190565b600082612d8757612d87612e6e565b500490565b6000816000190483118215151615612da657612da6612e58565b500290565b600082821015612dbd57612dbd612e58565b500390565b60005b83811015612ddd578181015183820152602001612dc5565b838111156117e75750506000910152565b600181811c90821680612e0257607f821691505b60208210811415612e2357634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612e3d57612e3d612e58565b5060010190565b600082612e5357612e53612e6e565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114611ae457600080fd5b6001600160e01b031981168114611ae457600080fdfea2646970667358221220b75328d053c3848af8b6dc5f0200e16d278364accd36047020992757e22d56ef64736f6c63430008070033

Deployed Bytecode Sourcemap

40448:17536:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23587:305;;;;;;;;;;-1:-1:-1;23587:305:0;;;;;:::i;:::-;;:::i;:::-;;;8857:14:1;;8850:22;8832:41;;8820:2;8805:18;23587:305:0;;;;;;;;45945:90;;;;;;;;;;-1:-1:-1;46013:17:0;;45945:90;;;21097:25:1;;;21085:2;21070:18;45945:90:0;20951:177:1;24514:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26027:171::-;;;;;;;;;;-1:-1:-1;26027:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7153:32:1;;;7135:51;;7123:2;7108:18;26027:171:0;6989:203:1;25544:417:0;;;;;;;;;;-1:-1:-1;25544:417:0;;;;;:::i;:::-;;:::i;:::-;;49741:969;;;;;;:::i;:::-;;:::i;46045:83::-;;;;;;;;;;-1:-1:-1;46110:13:0;;46045:83;;51839:169;;;;;;;;;;-1:-1:-1;51839:169:0;;;;;:::i;:::-;;:::i;26727:336::-;;;;;;;;;;-1:-1:-1;26727:336:0;;;;;:::i;:::-;;:::i;57738:241::-;;;;;;;;;;-1:-1:-1;57738:241:0;;;;;:::i;:::-;;:::i;52175:132::-;;;;;;;;;;-1:-1:-1;52175:132:0;;;;;:::i;:::-;;:::i;46544:85::-;;;;;;;;;;-1:-1:-1;46544:85:0;;;;;:::i;:::-;;:::i;57140:141::-;;;;;;;;;;-1:-1:-1;57140:141:0;;;;;:::i;:::-;-1:-1:-1;;;;;57240:36:0;57222:7;57240:36;;;:28;:36;;;;;;;57140:141;48686:172;;;;;;;;;;-1:-1:-1;48686:172:0;;;;;:::i;:::-;;:::i;27134:185::-;;;;;;;;;;-1:-1:-1;27134:185:0;;;;;:::i;:::-;;:::i;49187:352::-;;;;;;;;;;-1:-1:-1;49187:352:0;;;;;:::i;:::-;;:::i;47642:673::-;;;;;;;;;;-1:-1:-1;47642:673:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;45037:86::-;;;;;;;;;;-1:-1:-1;45105:8:0;;-1:-1:-1;;;;;45105:8:0;45037:86;;45551:101;;;;;;;;;;;;;:::i;46423:115::-;;;;;;;;;;-1:-1:-1;46423:115:0;;;;;:::i;:::-;;:::i;52497:872::-;;;;;;:::i;:::-;;:::i;24225:222::-;;;;;;;;;;-1:-1:-1;24225:222:0;;;;;:::i;:::-;;:::i;55697:938::-;;;;;;;;;;-1:-1:-1;55697:938:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23956:207::-;;;;;;;;;;-1:-1:-1;23956:207:0;;;;;:::i;:::-;;:::i;13477:103::-;;;;;;;;;;;;;:::i;48880:122::-;;;;;;;;;;-1:-1:-1;48880:122:0;;;;;:::i;:::-;;:::i;12829:87::-;;;;;;;;;;-1:-1:-1;12875:7:0;12902:6;-1:-1:-1;;;;;12902:6:0;12829:87;;56991:143;;;;;;;;;;-1:-1:-1;56991:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;57092:37:0;57074:7;57092:37;;;:29;:37;;;;;;;56991:143;24683:104;;;;;;;;;;;;;:::i;45658:105::-;;;;;;;;;;;;;:::i;26270:155::-;;;;;;;;;;-1:-1:-1;26270:155:0;;;;;:::i;:::-;;:::i;46306:111::-;;;;;;;;;;-1:-1:-1;46306:111:0;;;;;:::i;:::-;;:::i;49027:134::-;;;;;;;;;;-1:-1:-1;49027:134:0;;;;;:::i;:::-;;:::i;46746:102::-;;;;;;;;;;-1:-1:-1;46746:102:0;;;;;:::i;:::-;;:::i;46635:105::-;;;;;;;;;;-1:-1:-1;46635:105:0;;;;;:::i;:::-;;:::i;27390:323::-;;;;;;;;;;-1:-1:-1;27390:323:0;;;;;:::i;:::-;;:::i;52030:120::-;;;;;;;;;;-1:-1:-1;52030:120:0;;;;;:::i;:::-;;:::i;57449:106::-;;;;;;;;;;-1:-1:-1;57524:21:0;57449:106;;47019:441;;;;;;;;;;-1:-1:-1;47019:441:0;;;;;:::i;:::-;;:::i;55214:316::-;;;;;;;;;;-1:-1:-1;55214:316:0;;;;;:::i;:::-;;:::i;45299:93::-;;;;;;;;;;-1:-1:-1;45299:93:0;;;;;:::i;:::-;;:::i;56811:174::-;;;;;;;;;;-1:-1:-1;56811:174:0;;;;;:::i;:::-;;:::i;45852:87::-;;;;;;;;;;-1:-1:-1;45919:15:0;;45852:87;;26496:164;;;;;;;;;;-1:-1:-1;26496:164:0;;;;;:::i;:::-;;:::i;13735:201::-;;;;;;;;;;-1:-1:-1;13735:201:0;;;;;:::i;:::-;;:::i;51692:121::-;;;;;;;;;;-1:-1:-1;51692:121:0;;;;;:::i;:::-;;:::i;45769:77::-;;;;;;;;;;-1:-1:-1;45831:10:0;;45769:77;;48537:123;;;;;;;;;;-1:-1:-1;48537:123:0;;;;;:::i;:::-;;:::i;50880:602::-;;;;;;;;;;-1:-1:-1;50880:602:0;;;;;:::i;:::-;;:::i;23587:305::-;23689:4;-1:-1:-1;;;;;;23726:40:0;;-1:-1:-1;;;23726:40:0;;:105;;-1:-1:-1;;;;;;;23783:48:0;;-1:-1:-1;;;23783:48:0;23726:105;:158;;;-1:-1:-1;;;;;;;;;;22242:40:0;;;23848:36;23706:178;23587:305;-1:-1:-1;;23587:305:0:o;24514:100::-;24568:13;24601:5;24594:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24514:100;:::o;26027:171::-;26103:7;26123:23;26138:7;26123:14;:23::i;:::-;-1:-1:-1;26166:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;26166:24:0;;26027:171::o;25544:417::-;25625:13;25641:23;25656:7;25641:14;:23::i;:::-;25625:39;;25689:5;-1:-1:-1;;;;;25683:11:0;:2;-1:-1:-1;;;;;25683:11:0;;;25675:57;;;;-1:-1:-1;;;25675:57:0;;17803:2:1;25675:57:0;;;17785:21:1;17842:2;17822:18;;;17815:30;17881:34;17861:18;;;17854:62;-1:-1:-1;;;17932:18:1;;;17925:31;17973:19;;25675:57:0;;;;;;;;;3122:10;-1:-1:-1;;;;;25767:21:0;;;;:62;;-1:-1:-1;25792:37:0;25809:5;3122:10;26496:164;:::i;25792:37::-;25745:174;;;;-1:-1:-1;;;25745:174:0;;15602:2:1;25745:174:0;;;15584:21:1;15641:2;15621:18;;;15614:30;15680:34;15660:18;;;15653:62;15751:32;15731:18;;;15724:60;15801:19;;25745:174:0;15400:426:1;25745:174:0;25932:21;25941:2;25945:7;25932:8;:21::i;:::-;25614:347;25544:417;;:::o;49741:969::-;38488:1;39086:7;;:19;;39078:63;;;;-1:-1:-1;;;39078:63:0;;20793:2:1;39078:63:0;;;20775:21:1;20832:2;20812:18;;;20805:30;20871:33;20851:18;;;20844:61;20922:18;;39078:63:0;20591:355:1;39078:63:0;38488:1;39219:7;:18;49824:32:::1;49859:34;49881:10;49859:20;:34::i;:::-;49915:28:::0;;49824:69;;-1:-1:-1;49915:33:0;49906:71:::1;;;::::0;-1:-1:-1;;;49906:71:0;;18205:2:1;49906:71:0::1;::::0;::::1;18187:21:1::0;18244:2;18224:18;;;18217:30;18283:25;18263:18;;;18256:53;18326:18;;49906:71:0::1;18003:347:1::0;49906:71:0::1;49997:24;::::0;::::1;::::0;:29;;:95:::1;;-1:-1:-1::0;50059:32:0::1;40991:2;50059:15;:32;:::i;:::-;50030:24;::::0;::::1;::::0;:62:::1;;49997:95;49988:133;;;::::0;-1:-1:-1;;;49988:133:0;;13024:2:1;49988:133:0::1;::::0;::::1;13006:21:1::0;13063:2;13043:18;;;13036:30;13102:25;13082:18;;;13075:53;13145:18;;49988:133:0::1;12822:347:1::0;49988:133:0::1;50141:22:::0;;::::1;::::0;:27;;:90:::1;;-1:-1:-1::0;50173:22:0;;::::1;::::0;50216:15:::1;::::0;50173:39:::1;::::0;40991:2:::1;::::0;50173:39:::1;:::i;:::-;50172:59;50141:90;50132:127;;;::::0;-1:-1:-1;;;50132:127:0;;18557:2:1;50132:127:0::1;::::0;::::1;18539:21:1::0;18596:2;18576:18;;;18569:30;-1:-1:-1;;;18615:18:1;;;18608:52;18677:18;;50132:127:0::1;18355:346:1::0;50132:127:0::1;50279:30:::0;;::::1;::::0;50313:1:::1;50279:35;50270:79;;;::::0;-1:-1:-1;;;50270:79:0;;9310:2:1;50270:79:0::1;::::0;::::1;9292:21:1::0;9349:2;9329:18;;;9322:30;9388:31;9368:18;;;9361:59;9437:18;;50270:79:0::1;9108:353:1::0;50270:79:0::1;50369:32:::0;;::::1;::::0;:37;;:113:::1;;-1:-1:-1::0;50447:30:0;;::::1;::::0;:34:::1;::::0;50478:3;;50447:34:::1;:::i;:::-;50410:32:::0;;::::1;::::0;:72:::1;;50369:113;50360:159;;;::::0;-1:-1:-1;;;50360:159:0;;11075:2:1;50360:159:0::1;::::0;::::1;11057:21:1::0;11114:2;11094:18;;;11087:30;11153:33;11133:18;;;11126:61;11204:18;;50360:159:0::1;10873:355:1::0;50360:159:0::1;50532:68;50547:10;50584:3:::0;50559:7;41213:1:::1;50559:24;;;;;:28;;;;:::i;:::-;50589:9;50532:13;:68::i;:::-;50613:30;50626:10;50638:3;50613:11;:30::i;:::-;50684:10;50654:41;::::0;;;:29:::1;:41;::::0;;;;:48;;50699:3;;50654:41;:48:::1;::::0;50699:3;;50654:48:::1;:::i;:::-;::::0;;;-1:-1:-1;;38444:1:0;39398:7;:22;-1:-1:-1;;49741:969:0:o;51839:169::-;12875:7;12902:6;-1:-1:-1;;;;;12902:6:0;43216:10;:21;;:48;;-1:-1:-1;45105:8:0;;-1:-1:-1;;;;;45105:8:0;43241:10;:23;43216:48;43207:102;;;;-1:-1:-1;;;43207:102:0;;;;;;;:::i;:::-;51941:18:::1;:26:::0;;;;51978:16:::1;:22:::0;51839:169::o;26727:336::-;26922:41;3122:10;26955:7;26922:18;:41::i;:::-;26914:100;;;;-1:-1:-1;;;26914:100:0;;;;;;;:::i;:::-;27027:28;27037:4;27043:2;27047:7;27027:9;:28::i;57738:241::-;12875:7;12902:6;-1:-1:-1;;;;;12902:6:0;43216:10;:21;;:48;;-1:-1:-1;45105:8:0;;-1:-1:-1;;;;;45105:8:0;43241:10;:23;43216:48;43207:102;;;;-1:-1:-1;;;43207:102:0;;;;;;;:::i;:::-;57832:21:::1;57822:6;:31;;57813:66;;;::::0;-1:-1:-1;;;57813:66:0;;17101:2:1;57813:66:0::1;::::0;::::1;17083:21:1::0;17140:2;17120:18;;;17113:30;-1:-1:-1;;;17159:18:1;;;17152:50;17219:18;;57813:66:0::1;16899:344:1::0;57813:66:0::1;57892:22;12902:6:::0;;57946:25:::1;::::0;-1:-1:-1;;;;;12902:6:0;;;;;;57946:25:::1;::::0;::::1;;::::0;;;;;57892:22;57946:25;;12902:6;57946:25;::::1;;;;;;;;;;;;;::::0;::::1;;;;52175:132:::0;12875:7;12902:6;-1:-1:-1;;;;;12902:6:0;43216:10;:21;;:48;;-1:-1:-1;45105:8:0;;-1:-1:-1;;;;;45105:8:0;43241:10;:23;43216:48;43207:102;;;;-1:-1:-1;;;43207:102:0;;;;;;;:::i;:::-;52267:21:::1;:32:::0;52175:132::o;46544:85::-;12875:7;12902:6;-1:-1:-1;;;;;12902:6:0;43216:10;:21;;:48;;-1:-1:-1;45105:8:0;;-1:-1:-1;;;;;45105:8:0;43241:10;:23;43216:48;43207:102;;;;-1:-1:-1;;;43207:102:0;;;;;;;:::i;:::-;46610:10:::1;:16:::0;46544:85::o;48686:172::-;12875:7;12902:6;-1:-1:-1;;;;;12902:6:0;43216:10;:21;;:48;;-1:-1:-1;45105:8:0;;-1:-1:-1;;;;;45105:8:0;43241:10;:23;43216:48;43207:102;;;;-1:-1:-1;;;43207:102:0;;;;;;;:::i;:::-;48789:19:::1;:27:::0;;;;48827:17:::1;:23:::0;48686:172::o;27134:185::-;27272:39;27289:4;27295:2;27299:7;27272:39;;;;;;;;;;;;:16;:39::i;49187:352::-;12875:7;12902:6;-1:-1:-1;;;;;12902:6:0;43216:10;:21;;:48;;-1:-1:-1;45105:8:0;;-1:-1:-1;;;;;45105:8:0;43241:10;:23;43216:48;43207:102;;;;-1:-1:-1;;;43207:102:0;;;;;;;:::i;:::-;49289:34:::1;49296:27;;49289:34;:::i;:::-;49341:9;49336:196;49354:14:::0;;::::1;49336:196;;;49419:1;49399:5:::0;;49405:1;49399:8;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;49399:22:0::1;;;49390:59;;;::::0;-1:-1:-1;;;49390:59:0;;10725:2:1;49390:59:0::1;::::0;::::1;10707:21:1::0;10764:2;10744:18;;;10737:30;-1:-1:-1;;;10783:18:1;;;10776:51;10844:18;;49390:59:0::1;10523:345:1::0;49390:59:0::1;49464:27;49509:5;;49515:1;49509:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;49464:56:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;49464:56:0;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;49464:56:0::1;-1:-1:-1::0;;;;;49464:56:0;;::::1;::::0;;;::::1;::::0;;49370:3;::::1;::::0;::::1;:::i;:::-;;;;49336:196;;47642:673:::0;47711:24;;:::i;:::-;47748:31;;:::i;:::-;47796:26;;;;47792:68;;;47856:1;47826:31;;47792:68;47896:19;;47870:23;;;:45;47950:17;;47926:21;;;:41;48004:19;;47978:23;;;:45;48038:54;48055:27;48084:6;48038:15;:54::i;:::-;48034:98;;;48128:1;48096:29;;;:33;48034:98;-1:-1:-1;;;;;48174:37:0;;;;;;:29;:37;;;;;;48142:29;;;:69;48256:22;;48142:6;41386:1;48222:31;;;;:56;48299:6;47642:673;-1:-1:-1;;47642:673:0:o;45551:101::-;45602:13;45627:20;45619:30;;;;;:::i;46423:115::-;12875:7;12902:6;-1:-1:-1;;;;;12902:6:0;43216:10;:21;;:48;;-1:-1:-1;45105:8:0;;-1:-1:-1;;;;;45105:8:0;43241:10;:23;43216:48;43207:102;;;;-1:-1:-1;;;43207:102:0;;;;;;;:::i;:::-;46507:28:::1;:22;46532:3:::0;;46507:28:::1;:::i;52497:872::-:0;38488:1;39086:7;;:19;;39078:63;;;;-1:-1:-1;;;39078:63:0;;20793:2:1;39078:63:0;;;20775:21:1;20832:2;20812:18;;;20805:30;20871:33;20851:18;;;20844:61;20922:18;;39078:63:0;20591:355:1;39078:63:0;38488:1;39219:7;:18;52579:32:::1;52614:33;52635:10;52614:19;:33::i;:::-;52669:28:::0;;52579:68;;-1:-1:-1;52669:33:0;52660:70:::1;;;::::0;-1:-1:-1;;;52660:70:0;;14482:2:1;52660:70:0::1;::::0;::::1;14464:21:1::0;14521:2;14501:18;;;14494:30;-1:-1:-1;;;14540:18:1;;;14533:52;14602:18;;52660:70:0::1;14280:346:1::0;52660:70:0::1;52750:24;::::0;::::1;::::0;:29;;:95:::1;;-1:-1:-1::0;52812:32:0::1;40991:2;52812:15;:32;:::i;:::-;52783:24;::::0;::::1;::::0;:62:::1;;52750:95;52741:132;;;::::0;-1:-1:-1;;;52741:132:0;;10374:2:1;52741:132:0::1;::::0;::::1;10356:21:1::0;10413:2;10393:18;;;10386:30;-1:-1:-1;;;10432:18:1;;;10425:52;10494:18;;52741:132:0::1;10172:346:1::0;52741:132:0::1;52893:22:::0;;::::1;::::0;:27;;:90:::1;;-1:-1:-1::0;52925:22:0;;::::1;::::0;52968:15:::1;::::0;52925:39:::1;::::0;40991:2:::1;::::0;52925:39:::1;:::i;:::-;52924:59;52893:90;52884:126;;;::::0;-1:-1:-1;;;52884:126:0;;20028:2:1;52884:126:0::1;::::0;::::1;20010:21:1::0;20067:2;20047:18;;;20040:30;-1:-1:-1;;;20086:18:1;;;20079:51;20147:18;;52884:126:0::1;19826:345:1::0;52884:126:0::1;53030:32:::0;;::::1;::::0;:37;;:113:::1;;-1:-1:-1::0;53108:30:0;;::::1;::::0;:34:::1;::::0;53139:3;;53108:34:::1;:::i;:::-;53071:32:::0;;::::1;::::0;:72:::1;;53030:113;53021:158;;;::::0;-1:-1:-1;;;53021:158:0;;19316:2:1;53021:158:0::1;::::0;::::1;19298:21:1::0;19355:2;19335:18;;;19328:30;19394:32;19374:18;;;19367:60;19444:18;;53021:158:0::1;19114:354:1::0;53021:158:0::1;53192:68;53207:10;53244:3:::0;53219:7;41213:1:::1;53219:24;::::0;53192:68:::1;53273:30;53286:10;53298:3;53273:11;:30::i;:::-;53343:10;53314:40;::::0;;;:28:::1;:40;::::0;;;;:47;;53358:3;;53314:40;:47:::1;::::0;53358:3;;53314:47:::1;:::i;24225:222::-:0;24297:7;24333:16;;;:7;:16;;;;;;-1:-1:-1;;;;;24333:16:0;24368:19;24360:56;;;;-1:-1:-1;;;24360:56:0;;17450:2:1;24360:56:0;;;17432:21:1;17489:2;17469:18;;;17462:30;-1:-1:-1;;;17508:18:1;;;17501:54;17572:18;;24360:56:0;17248:348:1;55697:938:0;55759:29;;:::i;:::-;55801:38;;:::i;:::-;55850:29;;:::i;:::-;55927:54;55944:27;55973:6;55927:15;:54::i;:::-;:142;;;;-1:-1:-1;55986:17:0;;:22;;:82;;-1:-1:-1;56049:18:0;56066:1;40991:2;56049:18;:::i;:::-;56033:34;;:15;:34;:::i;:::-;56012:17;;:56;55986:82;55923:404;;;56118:1;56086:29;;;:33;56141:30;56163:6;56141:20;:30::i;:::-;56134:37;;55923:404;;;56263:1;56231:29;;;:33;56286:29;56307:6;56286:19;:29::i;:::-;56279:36;;55923:404;56344:9;56339:83;41430:1;56357;:10;56339:83;;;56403:4;56408:1;56403:7;;;;;;;:::i;:::-;;;;;56389:8;56398:1;56389:11;;;;;;;:::i;:::-;;;;:21;56369:3;;;;:::i;:::-;;;;56339:83;;;-1:-1:-1;56469:13:0;;56434:8;41550:12;41430:1;41561;41550:12;:::i;:::-;56434:32;;;;;;;:::i;:::-;;;;:48;56525:10;;56493:8;41616:12;41430:1;41627;41616:12;:::i;:::-;56493:29;;;;;;;:::i;:::-;;;;:42;56579:17;;56546:8;41683:12;41430:1;41694;41683:12;:::i;:::-;56546:30;;;;;;;:::i;:::-;;;;:50;-1:-1:-1;56617:8:0;55697:938;-1:-1:-1;;55697:938:0:o;23956:207::-;24028:7;-1:-1:-1;;;;;24056:19:0;;24048:73;;;;-1:-1:-1;;;24048:73:0;;14833:2:1;24048:73:0;;;14815:21:1;14872:2;14852:18;;;14845:30;14911:34;14891:18;;;14884:62;-1:-1:-1;;;14962:18:1;;;14955:39;15011:19;;24048:73:0;14631:405:1;24048:73:0;-1:-1:-1;;;;;;24139:16:0;;;;;:9;:16;;;;;;;23956:207::o;13477:103::-;12715:13;:11;:13::i;:::-;13542:30:::1;13569:1;13542:18;:30::i;:::-;13477:103::o:0;48880:122::-;12875:7;12902:6;-1:-1:-1;;;;;12902:6:0;43216:10;:21;;:48;;-1:-1:-1;45105:8:0;;-1:-1:-1;;;;;45105:8:0;43241:10;:23;43216:48;43207:102;;;;-1:-1:-1;;;43207:102:0;;;;;;;:::i;:::-;48967:19:::1;:27:::0;48880:122::o;24683:104::-;24739:13;24772:7;24765:14;;;;;:::i;45658:105::-;45711:13;45736:22;45728:32;;;;;:::i;26270:155::-;26365:52;3122:10;26398:8;26408;26365:18;:52::i;:::-;26270:155;;:::o;46306:111::-;12875:7;12902:6;-1:-1:-1;;;;;12902:6:0;43216:10;:21;;:48;;-1:-1:-1;45105:8:0;;-1:-1:-1;;;;;45105:8:0;43241:10;:23;43216:48;43207:102;;;;-1:-1:-1;;;43207:102:0;;;;;;;:::i;:::-;46388:26:::1;:20;46411:3:::0;;46388:26:::1;:::i;49027:134::-:0;12875:7;12902:6;-1:-1:-1;;;;;12902:6:0;43216:10;:21;;:48;;-1:-1:-1;45105:8:0;;-1:-1:-1;;;;;45105:8:0;43241:10;:23;43216:48;43207:102;;;;-1:-1:-1;;;43207:102:0;;;;;;;:::i;:::-;49120:22:::1;:33:::0;49027:134::o;46746:102::-;12875:7;12902:6;-1:-1:-1;;;;;12902:6:0;43216:10;:21;;:48;;-1:-1:-1;45105:8:0;;-1:-1:-1;;;;;45105:8:0;43241:10;:23;43216:48;43207:102;;;;-1:-1:-1;;;43207:102:0;;;;;;;:::i;:::-;46820:17:::1;:25:::0;46746:102::o;46635:105::-;12875:7;12902:6;-1:-1:-1;;;;;12902:6:0;43216:10;:21;;:48;;-1:-1:-1;45105:8:0;;-1:-1:-1;;;;;45105:8:0;43241:10;:23;43216:48;43207:102;;;;-1:-1:-1;;;43207:102:0;;;;;;;:::i;:::-;46711:15:::1;:26:::0;46635:105::o;27390:323::-;27564:41;3122:10;27597:7;27564:18;:41::i;:::-;27556:100;;;;-1:-1:-1;;;27556:100:0;;;;;;;:::i;:::-;27667:38;27681:4;27687:2;27691:7;27700:4;27667:13;:38::i;:::-;27390:323;;;;:::o;52030:120::-;12875:7;12902:6;-1:-1:-1;;;;;12902:6:0;43216:10;:21;;:48;;-1:-1:-1;45105:8:0;;-1:-1:-1;;;;;45105:8:0;43241:10;:23;43216:48;43207:102;;;;-1:-1:-1;;;43207:102:0;;;;;;;:::i;:::-;52116:18:::1;:26:::0;52030:120::o;47019:441::-;29285:4;29309:16;;;:7;:16;;;;;;47086:13;;-1:-1:-1;;;;;29309:16:0;47112:50;;;;-1:-1:-1;;;47112:50:0;;16394:2:1;47112:50:0;;;16376:21:1;16433:2;16413:18;;;16406:30;-1:-1:-1;;;16452:18:1;;;16445:47;16509:18;;47112:50:0;16192:341:1;47112:50:0;47218:1;47185:22;47179:36;;;;;:::i;:::-;;;:40;47175:176;;;47270:22;47294:27;47312:7;47294:16;:27::i;:::-;47252:71;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47236:91;;47019:441;;;:::o;47175:176::-;47397:20;47419:27;47437:7;47419:16;:27::i;55214:316::-;12875:7;12902:6;-1:-1:-1;;;;;12902:6:0;43216:10;:21;;:48;;-1:-1:-1;45105:8:0;;-1:-1:-1;;;;;45105:8:0;43241:10;:23;43216:48;43207:102;;;;-1:-1:-1;;;43207:102:0;;;;;;;:::i;:::-;55323:15:::1;;55315:3;55301:13;;:17;;;;:::i;:::-;55300:38;;55291:83;;;::::0;-1:-1:-1;;;55291:83:0;;15243:2:1;55291:83:0::1;::::0;::::1;15225:21:1::0;15282:2;15262:18;;;15255:30;15321:32;15301:18;;;15294:60;15371:18;;55291:83:0::1;15041:354:1::0;55291:83:0::1;55392:9;55387:105;55407:3;55405:1;:5;55387:105;;;55432:48;55439:7;12875::::0;12902:6;-1:-1:-1;;;;;12902:6:0;;12829:87;55439:7:::1;55463:14;55476:1:::0;40939::::1;55463:14;:::i;:::-;55448:13;;:30;;;;:::i;:::-;55432:5;:48::i;:::-;55412:3:::0;::::1;::::0;::::1;:::i;:::-;;;;55387:105;;;;55519:3;55502:13;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;55214:316:0:o;45299:93::-;12715:13;:11;:13::i;:::-;45367:8:::1;:17:::0;;-1:-1:-1;;;;;;45367:17:0::1;-1:-1:-1::0;;;;;45367:17:0;;;::::1;::::0;;;::::1;::::0;;45299:93::o;56811:174::-;-1:-1:-1;;;;;56944:36:0;;56885:7;56944:36;;;:28;:36;;;;;;;;;56904:29;:37;;;;;;:76;;56944:36;56904:76;:::i;26496:164::-;-1:-1:-1;;;;;26617:25:0;;;26593:4;26617:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26496:164::o;13735:201::-;12715:13;:11;:13::i;:::-;-1:-1:-1;;;;;13824:22:0;::::1;13816:73;;;::::0;-1:-1:-1;;;13816:73:0;;11854:2:1;13816:73:0::1;::::0;::::1;11836:21:1::0;11893:2;11873:18;;;11866:30;11932:34;11912:18;;;11905:62;-1:-1:-1;;;11983:18:1;;;11976:36;12029:19;;13816:73:0::1;11652:402:1::0;13816:73:0::1;13900:28;13919:8;13900:18;:28::i;:::-;13735:201:::0;:::o;51692:121::-;12875:7;12902:6;-1:-1:-1;;;;;12902:6:0;43216:10;:21;;:48;;-1:-1:-1;45105:8:0;;-1:-1:-1;;;;;45105:8:0;43241:10;:23;43216:48;43207:102;;;;-1:-1:-1;;;43207:102:0;;;;;;;:::i;:::-;51773:25:::1;:32:::0;;-1:-1:-1;;51773:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;51692:121::o;48537:123::-;12875:7;12902:6;-1:-1:-1;;;;;12902:6:0;43216:10;:21;;:48;;-1:-1:-1;45105:8:0;;-1:-1:-1;;;;;45105:8:0;43241:10;:23;43216:48;43207:102;;;;-1:-1:-1;;;43207:102:0;;;;;;;:::i;:::-;48619:26:::1;:33:::0;;-1:-1:-1;;48619:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48537:123::o;50880:602::-;50948:24;;:::i;:::-;50985:31;;:::i;:::-;51033:25;;;;51029:67;;;51092:1;51062:31;;51029:67;51132:18;;51106:23;;;;:44;;;;51185:16;;51161:21;;;;:40;;;;51238:18;;51212:23;;;:44;41113:1;51267:29;;;:33;-1:-1:-1;;;;;51343:36:0;;-1:-1:-1;51343:36:0;;;:28;:36;;;;;;51311:29;;;:68;51424:21;;51106:6;41386:1;51390:31;;34002:135;29285:4;29309:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29309:16:0;34076:53;;;;-1:-1:-1;;;34076:53:0;;17450:2:1;34076:53:0;;;17432:21:1;17489:2;17469:18;;;17462:30;-1:-1:-1;;;17508:18:1;;;17501:54;17572:18;;34076:53:0;17248:348:1;33281:174:0;33356:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;33356:29:0;-1:-1:-1;;;;;33356:29:0;;;;;;;;:24;;33410:23;33356:24;33410:14;:23::i;:::-;-1:-1:-1;;;;;33401:46:0;;;;;;;;;;;33281:174;;:::o;54005:381::-;54119:7;54110:5;:16;;54101:49;;;;-1:-1:-1;;;54101:49:0;;13376:2:1;54101:49:0;;;13358:21:1;13415:2;13395:18;;;13388:30;-1:-1:-1;;;13434:18:1;;;13427:48;13492:18;;54101:49:0;13174:342:1;54101:49:0;54211:7;54203:5;:15;54199:180;;;54235:14;54252:15;54262:5;54252:7;:15;:::i;:::-;54342:25;;54235:32;;-1:-1:-1;54316:9:0;;-1:-1:-1;;;;;54342:15:0;;;:25;;;;;54235:32;;54282:22;54342:25;54282:22;54342:25;54235:32;54342:15;:25;;;;;;;;;;;;;;;;;;;;;54220:159;;54005:381;;;:::o;54553:473::-;54647:15;;54630:13;;:32;;54621:71;;;;-1:-1:-1;;;54621:71:0;;19675:2:1;54621:71:0;;;19657:21:1;19714:2;19694:18;;;19687:30;19753:26;19733:18;;;19726:54;19797:18;;54621:71:0;19473:348:1;54621:71:0;54735:10;;54727:3;54713:13;;:17;;;;:::i;:::-;54712:33;;54703:73;;;;-1:-1:-1;;;54703:73:0;;10020:2:1;54703:73:0;;;10002:21:1;10059:2;10039:18;;;10032:30;10098:27;10078:18;;;10071:55;10143:18;;54703:73:0;9818:349:1;54703:73:0;54796:17;;:22;;:50;;;54843:3;54822:17;;:24;;54796:50;54787:88;;;;-1:-1:-1;;;54787:88:0;;9668:2:1;54787:88:0;;;9650:21:1;9707:2;9687:18;;;9680:30;9746:25;9726:18;;;9719:53;9789:18;;54787:88:0;9466:347:1;54787:88:0;54893:9;54888:100;54908:3;54906:1;:5;54888:100;;;54933:43;54940:2;54959:14;54972:1;40939;54959:14;:::i;54933:43::-;54913:3;;;;:::i;:::-;;;;54888:100;;;;55015:3;54998:13;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;54553:473:0:o;29514:264::-;29607:4;29624:13;29640:23;29655:7;29640:14;:23::i;:::-;29624:39;;29693:5;-1:-1:-1;;;;;29682:16:0;:7;-1:-1:-1;;;;;29682:16:0;;:52;;;;29702:32;29719:5;29726:7;29702:16;:32::i;:::-;29682:87;;;;29762:7;-1:-1:-1;;;;;29738:31:0;:20;29750:7;29738:11;:20::i;:::-;-1:-1:-1;;;;;29738:31:0;;29682:87;29674:96;29514:264;-1:-1:-1;;;;29514:264:0:o;32537:625::-;32696:4;-1:-1:-1;;;;;32669:31:0;:23;32684:7;32669:14;:23::i;:::-;-1:-1:-1;;;;;32669:31:0;;32661:81;;;;-1:-1:-1;;;32661:81:0;;12261:2:1;32661:81:0;;;12243:21:1;12300:2;12280:18;;;12273:30;12339:34;12319:18;;;12312:62;-1:-1:-1;;;12390:18:1;;;12383:35;12435:19;;32661:81:0;12059:401:1;32661:81:0;-1:-1:-1;;;;;32761:16:0;;32753:65;;;;-1:-1:-1;;;32753:65:0;;13723:2:1;32753:65:0;;;13705:21:1;13762:2;13742:18;;;13735:30;13801:34;13781:18;;;13774:62;-1:-1:-1;;;13852:18:1;;;13845:34;13896:19;;32753:65:0;13521:400:1;32753:65:0;32935:29;32952:1;32956:7;32935:8;:29::i;:::-;-1:-1:-1;;;;;32977:15:0;;;;;;:9;:15;;;;;:20;;32996:1;;32977:15;:20;;32996:1;;32977:20;:::i;:::-;;;;-1:-1:-1;;;;;;;33008:13:0;;;;;;:9;:13;;;;;:18;;33025:1;;33008:13;:18;;33025:1;;33008:18;:::i;:::-;;;;-1:-1:-1;;33037:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;33037:21:0;-1:-1:-1;;;;;33037:21:0;;;;;;;;;33076:27;;33037:16;;33076:27;;;;;;;25614:347;25544:417;;:::o;53540:296::-;53634:4;;53651:142;53671:12;;53669:14;;53651:142;;;53709:5;53715:1;53709:8;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;-1:-1:-1;;;53709:22:0;;-1:-1:-1;;;;;7153:32:1;;;53709:22:0;;;7135:51:1;53709:8:0;;;;:14;;7108:18:1;;53709:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53705:77;;;53760:4;53752:14;;;;;53705:77;53685:3;;;;:::i;:::-;;;;53651:142;;;-1:-1:-1;53813:5:0;;53540:296;-1:-1:-1;;;53540:296:0:o;12994:132::-;12875:7;12902:6;-1:-1:-1;;;;;12902:6:0;3122:10;13058:23;13050:68;;;;-1:-1:-1;;;13050:68:0;;16740:2:1;13050:68:0;;;16722:21:1;;;16759:18;;;16752:30;16818:34;16798:18;;;16791:62;16870:18;;13050:68:0;16538:356:1;14096:191:0;14170:16;14189:6;;-1:-1:-1;;;;;14206:17:0;;;-1:-1:-1;;;;;;14206:17:0;;;;;;14239:40;;14189:6;;;;;;;14239:40;;14170:16;14239:40;14159:128;14096:191;:::o;33598:315::-;33753:8;-1:-1:-1;;;;;33744:17:0;:5;-1:-1:-1;;;;;33744:17:0;;;33736:55;;;;-1:-1:-1;;;33736:55:0;;14128:2:1;33736:55:0;;;14110:21:1;14167:2;14147:18;;;14140:30;14206:27;14186:18;;;14179:55;14251:18;;33736:55:0;13926:349:1;33736:55:0;-1:-1:-1;;;;;33802:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;33802:46:0;;;;;;;;;;33864:41;;8832::1;;;33864::0;;8805:18:1;33864:41:0;;;;;;;33598:315;;;:::o;28594:313::-;28750:28;28760:4;28766:2;28770:7;28750:9;:28::i;:::-;28797:47;28820:4;28826:2;28830:7;28839:4;28797:22;:47::i;:::-;28789:110;;;;-1:-1:-1;;;28789:110:0;;;;;;;:::i;399:723::-;455:13;676:10;672:53;;-1:-1:-1;;703:10:0;;;;;;;;;;;;-1:-1:-1;;;703:10:0;;;;;399:723::o;672:53::-;750:5;735:12;791:78;798:9;;791:78;;824:8;;;;:::i;:::-;;-1:-1:-1;847:10:0;;-1:-1:-1;855:2:0;847:10;;:::i;:::-;;;791:78;;;879:19;911:6;901:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;901:17:0;;879:39;;929:154;936:10;;929:154;;963:11;973:1;963:11;;:::i;:::-;;-1:-1:-1;1032:10:0;1040:2;1032:5;:10;:::i;:::-;1019:24;;:2;:24;:::i;:::-;1006:39;;989:6;996;989:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;989:56:0;;;;;;;;-1:-1:-1;1060:11:0;1069:2;1060:11;;:::i;:::-;;;929:154;;31112:439;-1:-1:-1;;;;;31192:16:0;;31184:61;;;;-1:-1:-1;;;31184:61:0;;16033:2:1;31184:61:0;;;16015:21:1;;;16052:18;;;16045:30;16111:34;16091:18;;;16084:62;16163:18;;31184:61:0;15831:356:1;31184:61:0;29285:4;29309:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29309:16:0;:30;31256:58;;;;-1:-1:-1;;;31256:58:0;;12667:2:1;31256:58:0;;;12649:21:1;12706:2;12686:18;;;12679:30;12745;12725:18;;;12718:58;12793:18;;31256:58:0;12465:352:1;31256:58:0;-1:-1:-1;;;;;31385:13:0;;;;;;:9;:13;;;;;:18;;31402:1;;31385:13;:18;;31402:1;;31385:18;:::i;:::-;;;;-1:-1:-1;;31414:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31414:21:0;-1:-1:-1;;;;;31414:21:0;;;;;;;;31453:33;;31414:16;;;31453:33;;31414:16;;31453:33;26270:155;;:::o;34701:853::-;34855:4;-1:-1:-1;;;;;34876:13:0;;4669:19;:23;34872:675;;34912:71;;-1:-1:-1;;;34912:71:0;;-1:-1:-1;;;;;34912:36:0;;;;;:71;;3122:10;;34963:4;;34969:7;;34978:4;;34912:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34912:71:0;;;;;;;;-1:-1:-1;;34912:71:0;;;;;;;;;;;;:::i;:::-;;;34908:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35153:13:0;;35149:328;;35196:60;;-1:-1:-1;;;35196:60:0;;;;;;;:::i;35149:328::-;35427:6;35421:13;35412:6;35408:2;35404:15;35397:38;34908:584;-1:-1:-1;;;;;;35034:51:0;-1:-1:-1;;;35034:51:0;;-1:-1:-1;35027:58:0;;34872:675;-1:-1:-1;35531:4:0;34701:853;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:1:o;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;648:328;;;;;:::o;981:1138::-;1076:6;1084;1092;1100;1153:3;1141:9;1132:7;1128:23;1124:33;1121:53;;;1170:1;1167;1160:12;1121:53;1193:29;1212:9;1193:29;:::i;:::-;1183:39;;1241:38;1275:2;1264:9;1260:18;1241:38;:::i;:::-;1231:48;;1326:2;1315:9;1311:18;1298:32;1288:42;;1381:2;1370:9;1366:18;1353:32;1404:18;1445:2;1437:6;1434:14;1431:34;;;1461:1;1458;1451:12;1431:34;1499:6;1488:9;1484:22;1474:32;;1544:7;1537:4;1533:2;1529:13;1525:27;1515:55;;1566:1;1563;1556:12;1515:55;1602:2;1589:16;1624:2;1620;1617:10;1614:36;;;1630:18;;:::i;:::-;1705:2;1699:9;1673:2;1759:13;;-1:-1:-1;;1755:22:1;;;1779:2;1751:31;1747:40;1735:53;;;1803:18;;;1823:22;;;1800:46;1797:72;;;1849:18;;:::i;:::-;1889:10;1885:2;1878:22;1924:2;1916:6;1909:18;1964:7;1959:2;1954;1950;1946:11;1942:20;1939:33;1936:53;;;1985:1;1982;1975:12;1936:53;2041:2;2036;2032;2028:11;2023:2;2015:6;2011:15;1998:46;2086:1;2081:2;2076;2068:6;2064:15;2060:24;2053:35;2107:6;2097:16;;;;;;;981:1138;;;;;;;:::o;2124:315::-;2189:6;2197;2250:2;2238:9;2229:7;2225:23;2221:32;2218:52;;;2266:1;2263;2256:12;2218:52;2289:29;2308:9;2289:29;:::i;:::-;2279:39;;2368:2;2357:9;2353:18;2340:32;2381:28;2403:5;2381:28;:::i;:::-;2428:5;2418:15;;;2124:315;;;;;:::o;2444:254::-;2512:6;2520;2573:2;2561:9;2552:7;2548:23;2544:32;2541:52;;;2589:1;2586;2579:12;2541:52;2612:29;2631:9;2612:29;:::i;:::-;2602:39;2688:2;2673:18;;;;2660:32;;-1:-1:-1;;;2444:254:1:o;2703:615::-;2789:6;2797;2850:2;2838:9;2829:7;2825:23;2821:32;2818:52;;;2866:1;2863;2856:12;2818:52;2906:9;2893:23;2935:18;2976:2;2968:6;2965:14;2962:34;;;2992:1;2989;2982:12;2962:34;3030:6;3019:9;3015:22;3005:32;;3075:7;3068:4;3064:2;3060:13;3056:27;3046:55;;3097:1;3094;3087:12;3046:55;3137:2;3124:16;3163:2;3155:6;3152:14;3149:34;;;3179:1;3176;3169:12;3149:34;3232:7;3227:2;3217:6;3214:1;3210:14;3206:2;3202:23;3198:32;3195:45;3192:65;;;3253:1;3250;3243:12;3192:65;3284:2;3276:11;;;;;3306:6;;-1:-1:-1;2703:615:1;;-1:-1:-1;;;;2703:615:1:o;3323:241::-;3379:6;3432:2;3420:9;3411:7;3407:23;3403:32;3400:52;;;3448:1;3445;3438:12;3400:52;3487:9;3474:23;3506:28;3528:5;3506:28;:::i;3569:245::-;3636:6;3689:2;3677:9;3668:7;3664:23;3660:32;3657:52;;;3705:1;3702;3695:12;3657:52;3737:9;3731:16;3756:28;3778:5;3756:28;:::i;3819:245::-;3877:6;3930:2;3918:9;3909:7;3905:23;3901:32;3898:52;;;3946:1;3943;3936:12;3898:52;3985:9;3972:23;4004:30;4028:5;4004:30;:::i;4069:249::-;4138:6;4191:2;4179:9;4170:7;4166:23;4162:32;4159:52;;;4207:1;4204;4197:12;4159:52;4239:9;4233:16;4258:30;4282:5;4258:30;:::i;4323:592::-;4394:6;4402;4455:2;4443:9;4434:7;4430:23;4426:32;4423:52;;;4471:1;4468;4461:12;4423:52;4511:9;4498:23;4540:18;4581:2;4573:6;4570:14;4567:34;;;4597:1;4594;4587:12;4567:34;4635:6;4624:9;4620:22;4610:32;;4680:7;4673:4;4669:2;4665:13;4661:27;4651:55;;4702:1;4699;4692:12;4651:55;4742:2;4729:16;4768:2;4760:6;4757:14;4754:34;;;4784:1;4781;4774:12;4754:34;4829:7;4824:2;4815:6;4811:2;4807:15;4803:24;4800:37;4797:57;;;4850:1;4847;4840:12;4920:180;4979:6;5032:2;5020:9;5011:7;5007:23;5003:32;5000:52;;;5048:1;5045;5038:12;5000:52;-1:-1:-1;5071:23:1;;4920:180;-1:-1:-1;4920:180:1:o;5105:248::-;5173:6;5181;5234:2;5222:9;5213:7;5209:23;5205:32;5202:52;;;5250:1;5247;5240:12;5202:52;-1:-1:-1;;5273:23:1;;;5343:2;5328:18;;;5315:32;;-1:-1:-1;5105:248:1:o;5358:257::-;5399:3;5437:5;5431:12;5464:6;5459:3;5452:19;5480:63;5536:6;5529:4;5524:3;5520:14;5513:4;5506:5;5502:16;5480:63;:::i;:::-;5597:2;5576:15;-1:-1:-1;;5572:29:1;5563:39;;;;5604:4;5559:50;;5358:257;-1:-1:-1;;5358:257:1:o;5620:185::-;5662:3;5700:5;5694:12;5715:52;5760:6;5755:3;5748:4;5741:5;5737:16;5715:52;:::i;:::-;5783:16;;;;;5620:185;-1:-1:-1;;5620:185:1:o;5810:1174::-;5986:3;6015:1;6048:6;6042:13;6078:3;6100:1;6128:9;6124:2;6120:18;6110:28;;6188:2;6177:9;6173:18;6210;6200:61;;6254:4;6246:6;6242:17;6232:27;;6200:61;6280:2;6328;6320:6;6317:14;6297:18;6294:38;6291:165;;;-1:-1:-1;;;6355:33:1;;6411:4;6408:1;6401:15;6441:4;6362:3;6429:17;6291:165;6472:18;6499:104;;;;6617:1;6612:320;;;;6465:467;;6499:104;-1:-1:-1;;6532:24:1;;6520:37;;6577:16;;;;-1:-1:-1;6499:104:1;;6612:320;21206:1;21199:14;;;21243:4;21230:18;;6707:1;6721:165;6735:6;6732:1;6729:13;6721:165;;;6813:14;;6800:11;;;6793:35;6856:16;;;;6750:10;;6721:165;;;6725:3;;6915:6;6910:3;6906:16;6899:23;;6465:467;;;;;;;6948:30;6974:3;6966:6;6948:30;:::i;:::-;6941:37;5810:1174;-1:-1:-1;;;;;5810:1174:1:o;7197:488::-;-1:-1:-1;;;;;7466:15:1;;;7448:34;;7518:15;;7513:2;7498:18;;7491:43;7565:2;7550:18;;7543:34;;;7613:3;7608:2;7593:18;;7586:31;;;7391:4;;7634:45;;7659:19;;7651:6;7634:45;:::i;:::-;7626:53;7197:488;-1:-1:-1;;;;;;7197:488:1:o;7690:497::-;7872:3;7857:19;;7861:9;7953:6;7830:4;7987:194;8001:4;7998:1;7995:11;7987:194;;;8060:13;;8048:26;;8097:4;8121:12;;;;8156:15;;;;8021:1;8014:9;7987:194;;;7991:3;;;7690:497;;;;:::o;8192:495::-;8372:3;8357:19;;8361:9;8453:6;8330:4;8487:194;8501:4;8498:1;8495:11;8487:194;;;8560:13;;8548:26;;8597:4;8621:12;;;;8656:15;;;;8521:1;8514:9;8487:194;;8884:219;9033:2;9022:9;9015:21;8996:4;9053:44;9093:2;9082:9;9078:18;9070:6;9053:44;:::i;11233:414::-;11435:2;11417:21;;;11474:2;11454:18;;;11447:30;11513:34;11508:2;11493:18;;11486:62;-1:-1:-1;;;11579:2:1;11564:18;;11557:48;11637:3;11622:19;;11233:414::o;18706:403::-;18908:2;18890:21;;;18947:2;18927:18;;;18920:30;18986:34;18981:2;18966:18;;18959:62;-1:-1:-1;;;19052:2:1;19037:18;;19030:37;19099:3;19084:19;;18706:403::o;20176:410::-;20378:2;20360:21;;;20417:2;20397:18;;;20390:30;20456:34;20451:2;20436:18;;20429:62;-1:-1:-1;;;20522:2:1;20507:18;;20500:44;20576:3;20561:19;;20176:410::o;21259:128::-;21299:3;21330:1;21326:6;21323:1;21320:13;21317:39;;;21336:18;;:::i;:::-;-1:-1:-1;21372:9:1;;21259:128::o;21392:120::-;21432:1;21458;21448:35;;21463:18;;:::i;:::-;-1:-1:-1;21497:9:1;;21392:120::o;21517:168::-;21557:7;21623:1;21619;21615:6;21611:14;21608:1;21605:21;21600:1;21593:9;21586:17;21582:45;21579:71;;;21630:18;;:::i;:::-;-1:-1:-1;21670:9:1;;21517:168::o;21690:125::-;21730:4;21758:1;21755;21752:8;21749:34;;;21763:18;;:::i;:::-;-1:-1:-1;21800:9:1;;21690:125::o;21820:258::-;21892:1;21902:113;21916:6;21913:1;21910:13;21902:113;;;21992:11;;;21986:18;21973:11;;;21966:39;21938:2;21931:10;21902:113;;;22033:6;22030:1;22027:13;22024:48;;;-1:-1:-1;;22068:1:1;22050:16;;22043:27;21820:258::o;22083:380::-;22162:1;22158:12;;;;22205;;;22226:61;;22280:4;22272:6;22268:17;22258:27;;22226:61;22333:2;22325:6;22322:14;22302:18;22299:38;22296:161;;;22379:10;22374:3;22370:20;22367:1;22360:31;22414:4;22411:1;22404:15;22442:4;22439:1;22432:15;22296:161;;22083:380;;;:::o;22468:135::-;22507:3;-1:-1:-1;;22528:17:1;;22525:43;;;22548:18;;:::i;:::-;-1:-1:-1;22595:1:1;22584:13;;22468:135::o;22608:112::-;22640:1;22666;22656:35;;22671:18;;:::i;:::-;-1:-1:-1;22705:9:1;;22608:112::o;22725:127::-;22786:10;22781:3;22777:20;22774:1;22767:31;22817:4;22814:1;22807:15;22841:4;22838:1;22831:15;22857:127;22918:10;22913:3;22909:20;22906:1;22899:31;22949:4;22946:1;22939:15;22973:4;22970:1;22963:15;22989:127;23050:10;23045:3;23041:20;23038:1;23031:31;23081:4;23078:1;23071:15;23105:4;23102:1;23095:15;23121:127;23182:10;23177:3;23173:20;23170:1;23163:31;23213:4;23210:1;23203:15;23237:4;23234:1;23227:15;23253:118;23339:5;23332:13;23325:21;23318:5;23315:32;23305:60;;23361:1;23358;23351:12;23376:131;-1:-1:-1;;;;;;23450:32:1;;23440:43;;23430:71;;23497:1;23494;23487:12

Swarm Source

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