ETH Price: $3,213.71 (+1.61%)

Token

SteezyApeGang (SAG)
 

Overview

Max Total Supply

4,444 SAG

Holders

862

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 SAG
0x700dd53fa11ba44f41d3537224ddca4383b4648e
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

STEEZY APE GANG is a collection of 4,444 swagged out and dripped out apes that live on the Ethereum blockchain in the Okinaverse.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SteezyApeGang

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-08-11
*/

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * 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 be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be 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 owner nor approved for all"
        );

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

// File: contracts/SteezyApeGang.sol

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract SteezyApeGang is ERC721, Ownable, ReentrancyGuard {
    using Strings for uint256;
    uint256 vipPrice = 0.05 ether;
    uint256 genesisPrice = 0.09 ether;
    uint256 sagPrice = 0.13 ether;
    uint256 explorerPrice = 0.17 ether;

    mapping(address => uint16) public genesisMints;
    mapping(address => uint16) public sagMints;
    mapping(address => uint16) public explorerMints;
    mapping(address => uint16) public vipMints;

    bytes32 public merkleRoot;
    bytes32 public vipRoot;

    uint16 public constant MAX_SUPPLY = 4444;
    uint16 public constant MAX_SUPPLY_THEME = 1000;
    uint16 public constant MAX_SUPPLY_MYSTERY = 444;
    uint16 public constant MAX_RESERVED = 250;
    uint16 constant RESERVED_PER_THEME = 50;

    string baseURI = "https://mintsteezy.xyz/steezymetadata/";

    uint16 public numReserved;
    uint16 public numReservedMusic;
    uint16 public numReservedAthlete;
    uint16 public numReservedFresh;
    uint16 public numReservedMafia;
    uint16 public numReservedMystery;
    uint8 reserveIndex;

    uint16 public musicCounter = 1;
    uint16 public athleteCounter = 1001;
    uint16 public freshCounter = 2001;
    uint16 public mafiaCounter = 3001;
    uint16 public mysteryCounter = 4001;

    uint16 public numMusic;
    uint16 public numAthlete;
    uint16 public numFresh;
    uint16 public numMafia;
    uint16 public numMystery;

    uint8 public salePhase;

    uint8 public maxGenesisMints = 30;
    uint8 public maxSagMints = 32;
    uint8 public maxExplorerMints;
    uint8 public maxVipMints = 115;

    constructor() ERC721("SteezyApeGang", "SAG") {
        merkleRoot = 0xd314c15d0c3f882ad0b15635e9033c17fb527e1209868ce2a9df4f83d40d3537;
        vipRoot = 0x31524542e19a71e3b254a43b8b665a79b76c0ca5672f84ca846e164b4393a2d2;
    }

    function setMaxSagMints(uint8 max) external onlyOwner {
        maxSagMints = max;
    }

    function setMaxExplorerMints(uint8 max) external onlyOwner {
        maxExplorerMints = max;
    }

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

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

    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        return
            bytes(baseURI).length > 0
                ? string(abi.encodePacked(baseURI, tokenId.toString(), ".json"))
                : "";
    }

    function totalSupply() external view returns (uint256) {
        return numMusic + numAthlete + numFresh + numMafia + numMystery;
    }

    function setSalePhase(uint8 phase) external onlyOwner {
        salePhase = phase;
    }

    function reserveTokens(uint16 amount) external onlyOwner {
        require(
            numReserved + amount <= MAX_RESERVED,
            "Would exceed max reserved"
        );
        numReserved += amount;

        for (uint256 i = 0; i < amount; i++) {
            if (reserveIndex == 0) {
                // music
                mintToken(0, 1);
                numReservedMusic++;
            } else if (reserveIndex == 1) {
                // athlete
                mintToken(1, 1);
                numReservedAthlete++;
            } else if (reserveIndex == 2) {
                // fresh
                mintToken(2, 1);
                numReservedFresh++;
            } else if (reserveIndex == 3) {
                // mafia
                mintToken(3, 1);
                numReservedMafia++;
            } else if (reserveIndex == 4) {
                // mystery
                mintToken(4, 1);
                numReservedMystery++;
            }
            if (reserveIndex == 4) {
                reserveIndex = 0;
            } else {
                reserveIndex += 1;
            }
        }
    }

    function setMerkleRoot(bytes32 _newRoot) external onlyOwner {
        merkleRoot = _newRoot;
    }

    function setVipRoot(bytes32 _newRoot) external onlyOwner {
        vipRoot = _newRoot;
    }

    function mintVip(bytes32[] calldata proof, uint8[] calldata amounts)
        external
        payable
        nonReentrant
    {
        require(salePhase > 0, "Sale currently closed");
        require(
            hasEnoughTokens(amounts),
            "Would exceed maximum number of tokens in a given theme."
        );
        bytes32 node = keccak256(abi.encodePacked(msg.sender));
        require(
            MerkleProof.verify(proof, vipRoot, node),
            "Address is not on whitelist"
        );
        uint8 totalToMint;
        for (uint256 i = 0; i < amounts.length; i++) {
            totalToMint += amounts[i];
        }
        require(totalToMint * vipPrice == msg.value, "Incorrent ETH sent");
        require(
            vipMints[msg.sender] + totalToMint <= maxVipMints,
            "Would go over token limit per address"
        );

        vipMints[msg.sender] += totalToMint;
        mintTokens(amounts);
    }

    function mintGenesis(bytes32[] calldata proof, uint8[] calldata amounts)
        external
        payable
        nonReentrant
    {
        require(salePhase == 1, "Not in correct minting phase.");
        require(
            hasEnoughTokens(amounts),
            "Would exceed maximum number of tokens in a given theme."
        );
        require(checkValue(amounts, msg.value), "Incorrect ETH sent");
        bytes32 node = keccak256(abi.encodePacked(msg.sender));
        require(
            MerkleProof.verify(proof, merkleRoot, node),
            "Address is not on whitelist"
        );

        uint8 totalToMint;
        for (uint256 i = 0; i < amounts.length; i++) {
            totalToMint += amounts[i];
        }
        require(
            genesisMints[msg.sender] + totalToMint <= maxGenesisMints,
            "Would go over token limit per address"
        );

        genesisMints[msg.sender] += totalToMint;
        mintTokens(amounts);
    }

    function mintSagList(bytes32[] calldata proof, uint8[] calldata amounts)
        external
        payable
        nonReentrant
    {
        require(salePhase == 2, "Not in correct minting phase.");
        require(
            hasEnoughTokens(amounts),
            "Would exceed maximum number of tokens in a given theme."
        );
        require(checkValue(amounts, msg.value), "Incorrect ETH sent");
        bytes32 node = keccak256(abi.encodePacked(msg.sender));
        require(
            MerkleProof.verify(proof, merkleRoot, node),
            "Address is not on whitelist"
        );
        uint8 totalToMint;
        for (uint256 i = 0; i < amounts.length; i++) {
            totalToMint += amounts[i];
        }
        require(
            sagMints[msg.sender] + totalToMint <= maxSagMints,
            "Would go over token limit per address"
        );
        sagMints[msg.sender] += totalToMint;
        mintTokens(amounts);
    }

    function mintExplorer(bytes32[] calldata proof, uint8[] calldata amounts)
        external
        payable
        nonReentrant
    {
        require(salePhase == 3, "Not in correct minting phase.");
        require(
            hasEnoughTokens(amounts),
            "Would exceed maximum number of tokens in a given theme."
        );
        uint8 totalTokens;
        for (uint256 i = 0; i < amounts.length; i++) {
            unchecked {
                totalTokens += amounts[i];
            }
        }
        require(totalTokens <= 5, "Can mint up to 5 per transaction");
        require(checkValue(amounts, msg.value), "Incorrect ETH sent");
        bytes32 node = keccak256(abi.encodePacked(msg.sender));
        require(
            MerkleProof.verify(proof, merkleRoot, node),
            "Address is not on whitelist"
        );
        uint8 totalToMint;
        for (uint256 i = 0; i < amounts.length; i++) {
            totalToMint += amounts[i];
        }
        explorerMints[msg.sender] += totalToMint;
        mintTokens(amounts);
    }

    function mintSteezy(uint8[] calldata amounts)
        external
        payable
        nonReentrant
    {
        require(salePhase == 4, "Not in correct minting phase.");
        uint8 totalTokens;
        for (uint256 i = 0; i < amounts.length; i++) {
            unchecked {
                totalTokens += amounts[i];
            }
        }
        require(totalTokens <= 5, "Can mint up to 5 per transaction");
        require(
            hasEnoughTokens(amounts),
            "Would exceed maximum number of tokens in a given theme."
        );
        require(checkValue(amounts, msg.value), "Incorrect ETH sent");

        mintTokens(amounts);
    }

    function hasEnoughTokens(uint8[] calldata amounts)
        private
        view
        returns (bool)
    {
        return
            amounts[0] + numMusic <=
            MAX_SUPPLY_THEME - RESERVED_PER_THEME + numReservedMusic &&
            amounts[1] + numAthlete <=
            MAX_SUPPLY_THEME - RESERVED_PER_THEME + numReservedAthlete &&
            amounts[2] + numFresh <=
            MAX_SUPPLY_THEME - RESERVED_PER_THEME + numReservedFresh &&
            amounts[3] + numMafia <=
            MAX_SUPPLY_THEME - RESERVED_PER_THEME + numReservedMafia &&
            amounts[4] + numMystery <=
            MAX_SUPPLY_MYSTERY - RESERVED_PER_THEME + numReservedMystery;
    }

    function checkValue(uint8[] calldata amounts, uint256 value)
        private
        view
        returns (bool)
    {
        uint8 totalTokens;
        uint256 price;
        for (uint256 i = 0; i < amounts.length; i++) {
            unchecked {
                totalTokens += amounts[i];
            }
        }
        if (salePhase == 1) {
            price = totalTokens * genesisPrice;
        } else if (salePhase == 2) {
            price = totalTokens * sagPrice;
        } else if (salePhase == 3) {
            price = totalTokens * explorerPrice;
        } else {
            price = totalTokens * explorerPrice;
        }

        return price == value;
    }

    function mintTokens(uint8[] calldata amounts) private {
        uint8 totalToMint;
        for (uint256 i = 0; i < amounts.length; i++) {
            totalToMint += amounts[i];
        }

        if (totalToMint == 0) {
            revert("Amount to mint cannot be 0");
        }

        if (amounts[0] > 0) {
            mintToken(0, amounts[0]);
        }
        if (amounts[1] > 0) {
            mintToken(1, amounts[1]);
        }
        if (amounts[2] > 0) {
            mintToken(2, amounts[2]);
        }
        if (amounts[3] > 0) {
            mintToken(3, amounts[3]);
        }
        if (amounts[4] > 0) {
            mintToken(4, amounts[4]);
        }
    }

    function mintToken(uint8 id, uint8 amount) private {
        if (id == 0) {
            // mint music
            for (uint256 i = 0; i < amount; i++) {
                unchecked {
                    numMusic++;
                }
                _safeMint(msg.sender, musicCounter++);
            }
        } else if (id == 1) {
            // mint athlete
            for (uint256 i = 0; i < amount; i++) {
                unchecked {
                    numAthlete++;
                }
                _safeMint(msg.sender, athleteCounter++);
            }
        } else if (id == 2) {
            // mint fresh
            for (uint256 i = 0; i < amount; i++) {
                unchecked {
                    numFresh++;
                }
                _safeMint(msg.sender, freshCounter++);
            }
        } else if (id == 3) {
            // mint mafia
            for (uint256 i = 0; i < amount; i++) {
                unchecked {
                    numMafia++;
                }
                _safeMint(msg.sender, mafiaCounter++);
            }
        } else if (id == 4) {
            // mint mystery
            for (uint256 i = 0; i < amount; i++) {
                unchecked {
                    numMystery++;
                }
                _safeMint(msg.sender, mysteryCounter++);
            }
        }
    }

    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;

        address acct = 0xA6021476F90FDE5b4Fc2bC4C22cA26008F2A23f7;
        address studio = 0x388CcBf8c1A37F444DcFF6eDE0014DfA85BeDC1B;

        uint256 acct_share = (balance / 100) * 85;
        uint256 studio_share = (balance / 100) * 15;

        payable(acct).transfer(acct_share);
        payable(studio).transfer(studio_share);
    }

    function burn(uint256 tokenId) public virtual {
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721Burnable: caller is not owner nor approved"
        );
        _burn(tokenId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_RESERVED","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY_MYSTERY","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY_THEME","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"athleteCounter","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"explorerMints","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freshCounter","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"genesisMints","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mafiaCounter","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxExplorerMints","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGenesisMints","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSagMints","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxVipMints","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint8[]","name":"amounts","type":"uint8[]"}],"name":"mintExplorer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint8[]","name":"amounts","type":"uint8[]"}],"name":"mintGenesis","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint8[]","name":"amounts","type":"uint8[]"}],"name":"mintSagList","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8[]","name":"amounts","type":"uint8[]"}],"name":"mintSteezy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint8[]","name":"amounts","type":"uint8[]"}],"name":"mintVip","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"musicCounter","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mysteryCounter","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numAthlete","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numFresh","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numMafia","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numMusic","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numMystery","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numReserved","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numReservedAthlete","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numReservedFresh","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numReservedMafia","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numReservedMusic","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numReservedMystery","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"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":"uint16","name":"amount","type":"uint16"}],"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":"","type":"address"}],"name":"sagMints","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"salePhase","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"max","type":"uint8"}],"name":"setMaxExplorerMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"max","type":"uint8"}],"name":"setMaxSagMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"phase","type":"uint8"}],"name":"setSalePhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newRoot","type":"bytes32"}],"name":"setVipRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vipMints","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vipRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

66b1a2bc2ec5000060085567013fbe85edc900006009556701cdda4faccd0000600a5567025bf6196bd10000600b5560e0604052602660808181529062003f1d60a03980516200005891601291602090910190620001d8565b5060138054600160681b600160b81b031916760fa10bb907d103e90001000000000000000000000000001790556014805466ff00ffff0000001916667300201e000000179055348015620000ab57600080fd5b50604080518082018252600d81526c537465657a7941706547616e6760981b60208083019182528351808501909452600384526253414760e81b908401528151919291620000fc91600091620001d8565b50805162000112906001906020840190620001d8565b5050506200012f620001296200018260201b60201c565b62000186565b60016007557fd314c15d0c3f882ad0b15635e9033c17fb527e1209868ce2a9df4f83d40d35376010557f31524542e19a71e3b254a43b8b665a79b76c0ca5672f84ca846e164b4393a2d2601155620002bb565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001e6906200027e565b90600052602060002090601f0160209004810192826200020a576000855562000255565b82601f106200022557805160ff191683800117855562000255565b8280016001018555821562000255579182015b828111156200025557825182559160200191906001019062000238565b506200026392915062000267565b5090565b5b8082111562000263576000815560010162000268565b600181811c908216806200029357607f821691505b60208210811415620002b557634e487b7160e01b600052602260045260246000fd5b50919050565b613c5280620002cb6000396000f3fe6080604052600436106103ac5760003560e01c80638ca33c1d116101e7578063c63f96901161010d578063df00a7b4116100a0578063ee9a62391161006f578063ee9a623914610b29578063f2de8adb14610b5a578063f2fde38b14610b7c578063ffcd39df14610b9c57600080fd5b8063df00a7b414610a87578063e166f1aa14610aaa578063e4f2487a14610ac0578063e985e9c514610ae057600080fd5b8063cfa81a8d116100dc578063cfa81a8d146109f1578063d0c80cf214610a22578063d5f1c3d114610a44578063d8ecbf2214610a6657600080fd5b8063c63f969014610998578063c78e7dd4146109ab578063c87b56dd146109be578063c966ca17146109de57600080fd5b8063b150a6f611610185578063b7f00d3311610154578063b7f00d331461091b578063b88d4fde14610936578063bcc51ed014610956578063c48fdc341461097657600080fd5b8063b150a6f6146108a7578063b290a229146108c2578063b596a3f9146108e3578063b7acfe861461090557600080fd5b8063a1748200116101c1578063a174820014610813578063a22cb46514610836578063a739fa3d14610856578063ae433f141461087657600080fd5b80638ca33c1d146107be5780638da5cb5b146107e057806395d89b41146107fe57600080fd5b80633ccfd60b116102d75780636b0a05691161026a5780637ad59431116102395780637ad594311461073a5780637cb647591461075a5780637f48d22a1461077a57806388bf1c501461079c57600080fd5b80636b0a0569146106ce5780636ba90c6e146106f057806370a0823114610705578063715018a61461072557600080fd5b806355f804b3116102a657806355f804b31461063d5780635cdcbc181461065d57806361aa58631461068e5780636352211e146106ae57600080fd5b80633ccfd60b146105d557806342842e0e146105ea57806342966c681461060a5780634436cf9f1461062a57600080fd5b80630ebd2bc01161034f57806323b872dd1161031e57806323b872dd146105675780632ac1dd27146105875780632eb4a7ab146105a957806332cb6b0c146105bf57600080fd5b80630ebd2bc0146104e15780631449f6ce14610502578063167573381461052257806318160ddd1461054457600080fd5b8063034cbc801161038b578063034cbc801461044357806306fdde0314610465578063081812fc14610487578063095ea7b3146104bf57600080fd5b8062fe11e5146103b157806301dc474b146103df57806301ffc9a714610413575b600080fd5b3480156103bd57600080fd5b506103c76103e881565b60405161ffff90911681526020015b60405180910390f35b3480156103eb57600080fd5b5060145461040190640100000000900460ff1681565b60405160ff90911681526020016103d6565b34801561041f57600080fd5b5061043361042e3660046135a1565b610baf565b60405190151581526020016103d6565b34801561044f57600080fd5b506013546103c790600160681b900461ffff1681565b34801561047157600080fd5b5061047a610c01565b6040516103d691906137c8565b34801561049357600080fd5b506104a76104a2366004613588565b610c93565b6040516001600160a01b0390911681526020016103d6565b3480156104cb57600080fd5b506104df6104da3660046134b0565b610d2d565b005b3480156104ed57600080fd5b50601454610401906301000000900460ff1681565b34801561050e57600080fd5b506104df61051d366004613648565b610e43565b34801561052e57600080fd5b506013546103c790600160401b900461ffff1681565b34801561055057600080fd5b50610559610e91565b6040519081526020016103d6565b34801561057357600080fd5b506104df6105823660046133bc565b610ef7565b34801561059357600080fd5b506013546103c790600160881b900461ffff1681565b3480156105b557600080fd5b5061055960105481565b3480156105cb57600080fd5b506103c761115c81565b3480156105e157600080fd5b506104df610f29565b3480156105f657600080fd5b506104df6106053660046133bc565b611028565b34801561061657600080fd5b506104df610625366004613588565b611043565b6104df6106383660046134da565b6110bd565b34801561064957600080fd5b506104df6106583660046135db565b61132d565b34801561066957600080fd5b506103c761067836600461336e565b600e6020526000908152604090205461ffff1681565b34801561069a57600080fd5b506104df6106a9366004613588565b61136e565b3480156106ba57600080fd5b506104a76106c9366004613588565b61139d565b3480156106da57600080fd5b506013546103c790600160e81b900461ffff1681565b3480156106fc57600080fd5b506103c760fa81565b34801561071157600080fd5b5061055961072036600461336e565b611414565b34801561073157600080fd5b506104df61149b565b34801561074657600080fd5b506104df610755366004613648565b6114d1565b34801561076657600080fd5b506104df610775366004613588565b611519565b34801561078657600080fd5b506013546103c790600160781b900461ffff1681565b3480156107a857600080fd5b506013546103c790600160c81b900461ffff1681565b3480156107ca57600080fd5b506013546103c790600160501b900461ffff1681565b3480156107ec57600080fd5b506006546001600160a01b03166104a7565b34801561080a57600080fd5b5061047a611548565b34801561081f57600080fd5b506013546103c790640100000000900461ffff1681565b34801561084257600080fd5b506104df610851366004613474565b611557565b34801561086257600080fd5b506104df610871366004613648565b611562565b34801561088257600080fd5b506103c761089136600461336e565b600f6020526000908152604090205461ffff1681565b3480156108b357600080fd5b506013546103c79061ffff1681565b3480156108ce57600080fd5b5060145461040190600160301b900460ff1681565b3480156108ef57600080fd5b506013546103c790600160a81b900461ffff1681565b34801561091157600080fd5b5061055960115481565b34801561092757600080fd5b506014546103c79061ffff1681565b34801561094257600080fd5b506104df6109513660046133f8565b6115ae565b34801561096257600080fd5b506104df610971366004613624565b6115e6565b34801561098257600080fd5b506013546103c790600160d81b900461ffff1681565b6104df6109a63660046134da565b61188d565b6104df6109b9366004613546565b611b03565b3480156109ca57600080fd5b5061047a6109d9366004613588565b611c55565b6104df6109ec3660046134da565b611cb3565b3480156109fd57600080fd5b506103c7610a0c36600461336e565b600d6020526000908152604090205461ffff1681565b348015610a2e57600080fd5b506013546103c790600160301b900461ffff1681565b348015610a5057600080fd5b506013546103c790600160981b900461ffff1681565b348015610a7257600080fd5b506013546103c79062010000900461ffff1681565b348015610a9357600080fd5b506014546104019065010000000000900460ff1681565b348015610ab657600080fd5b506103c76101bc81565b348015610acc57600080fd5b506014546104019062010000900460ff1681565b348015610aec57600080fd5b50610433610afb366004613389565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610b3557600080fd5b506103c7610b4436600461336e565b600c6020526000908152604090205461ffff1681565b348015610b6657600080fd5b506013546103c790600160b81b900461ffff1681565b348015610b8857600080fd5b506104df610b9736600461336e565b611ea7565b6104df610baa3660046134da565b611f3f565b60006001600160e01b031982166380ac58cd60e01b1480610be057506001600160e01b03198216635b5e139f60e01b145b80610bfb57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610c1090613b22565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3c90613b22565b8015610c895780601f10610c5e57610100808354040283529160200191610c89565b820191906000526020600020905b815481529060010190602001808311610c6c57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610d115760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610d388261139d565b9050806001600160a01b0316836001600160a01b03161415610da65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610d08565b336001600160a01b0382161480610dc25750610dc28133610afb565b610e345760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610d08565b610e3e8383612132565b505050565b6006546001600160a01b03163314610e6d5760405162461bcd60e51b8152600401610d089061390c565b6014805460ff909216650100000000000265ff000000000019909216919091179055565b60145460135460009161ffff90811691600160e81b8104821691600160d81b8204811691610ed091600160c81b8204811691600160b81b900416613a26565b610eda9190613a26565b610ee49190613a26565b610eee9190613a26565b61ffff16905090565b610f02335b826121a0565b610f1e5760405162461bcd60e51b8152600401610d089061399e565b610e3e838383612297565b6006546001600160a01b03163314610f535760405162461bcd60e51b8152600401610d089061390c565b4773a6021476f90fde5b4fc2bc4c22ca26008f2a23f773388ccbf8c1a37f444dcff6ede0014dfa85bedc1b6000610f8b606485613a89565b610f96906055613a9d565b90506000610fa5606486613a89565b610fb090600f613a9d565b6040519091506001600160a01b0385169083156108fc029084906000818181858888f19350505050158015610fe9573d6000803e3d6000fd5b506040516001600160a01b0384169082156108fc029083906000818181858888f19350505050158015611020573d6000803e3d6000fd5b505050505050565b610e3e838383604051806020016040528060008152506115ae565b61104c33610efc565b6110b15760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610d08565b6110ba81612433565b50565b600260075414156110e05760405162461bcd60e51b8152600401610d08906139ef565b600260075560145462010000900460ff166003146111105760405162461bcd60e51b8152600401610d08906137db565b61111a82826124ce565b6111365760405162461bcd60e51b8152600401610d0890613941565b6000805b8281101561117f5783838281811061115457611154613bda565b90506020020160208101906111699190613648565b909101908061117781613b7f565b91505061113a565b5060058160ff1611156111d45760405162461bcd60e51b815260206004820181905260248201527f43616e206d696e7420757020746f203520706572207472616e73616374696f6e6044820152606401610d08565b6111df83833461272d565b6111fb5760405162461bcd60e51b8152600401610d0890613812565b60003360405160200161120e91906136b3565b60405160208183030381529060405280519060200120905061126786868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601054915084905061280b565b6112835760405162461bcd60e51b8152600401610d08906138d5565b6000805b848110156112d4578585828181106112a1576112a1613bda565b90506020020160208101906112b69190613648565b6112c09083613a64565b9150806112cc81613b7f565b915050611287565b50336000908152600e60205260408120805460ff841692906112fb90849061ffff16613a26565b92506101000a81548161ffff021916908361ffff16021790555061131f8585612821565b505060016007555050505050565b6006546001600160a01b031633146113575760405162461bcd60e51b8152600401610d089061390c565b805161136a9060129060208401906131f7565b5050565b6006546001600160a01b031633146113985760405162461bcd60e51b8152600401610d089061390c565b601155565b6000818152600260205260408120546001600160a01b031680610bfb5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610d08565b60006001600160a01b03821661147f5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610d08565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146114c55760405162461bcd60e51b8152600401610d089061390c565b6114cf6000612a54565b565b6006546001600160a01b031633146114fb5760405162461bcd60e51b8152600401610d089061390c565b6014805460ff909216620100000262ff000019909216919091179055565b6006546001600160a01b031633146115435760405162461bcd60e51b8152600401610d089061390c565b601055565b606060018054610c1090613b22565b61136a338383612aa6565b6006546001600160a01b0316331461158c5760405162461bcd60e51b8152600401610d089061390c565b6014805460ff9092166401000000000264ff0000000019909216919091179055565b6115b833836121a0565b6115d45760405162461bcd60e51b8152600401610d089061399e565b6115e084848484612b75565b50505050565b6006546001600160a01b031633146116105760405162461bcd60e51b8152600401610d089061390c565b60135460fa9061162590839061ffff16613a26565b61ffff1611156116775760405162461bcd60e51b815260206004820152601960248201527f576f756c6420657863656564206d6178207265736572766564000000000000006044820152606401610d08565b6013805482919060009061169090849061ffff16613a26565b92506101000a81548161ffff021916908361ffff16021790555060005b8161ffff1681101561136a57601354600160601b900460ff16611710576116d660006001612ba8565b6013805462010000900461ffff169060026116f083613b5d565b91906101000a81548161ffff021916908361ffff1602179055505061181c565b601354600160601b900460ff166001141561174c57611730600180612ba8565b60138054640100000000900461ffff169060046116f083613b5d565b601354600160601b900460ff16600214156117885761176d60026001612ba8565b60138054600160301b900461ffff169060066116f083613b5d565b601354600160601b900460ff16600314156117c4576117a960036001612ba8565b60138054600160401b900461ffff169060086116f083613b5d565b601354600160601b900460ff166004141561181c576117e560046001612ba8565b60138054600160501b900461ffff1690600a61180083613b5d565b91906101000a81548161ffff021916908361ffff160217905550505b601354600160601b900460ff1660041415611843576013805460ff60601b1916905561187b565b60016013600c8282829054906101000a900460ff166118629190613a64565b92506101000a81548160ff021916908360ff1602179055505b8061188581613b7f565b9150506116ad565b600260075414156118b05760405162461bcd60e51b8152600401610d08906139ef565b600260075560145462010000900460ff166119055760405162461bcd60e51b815260206004820152601560248201527414d85b194818dd5c9c995b9d1b1e4818db1bdcd959605a1b6044820152606401610d08565b61190f82826124ce565b61192b5760405162461bcd60e51b8152600401610d0890613941565b60003360405160200161193e91906136b3565b60405160208183030381529060405280519060200120905061199785858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601154915084905061280b565b6119b35760405162461bcd60e51b8152600401610d08906138d5565b6000805b83811015611a04578484828181106119d1576119d1613bda565b90506020020160208101906119e69190613648565b6119f09083613a64565b9150806119fc81613b7f565b9150506119b7565b50346008548260ff16611a179190613a9d565b14611a595760405162461bcd60e51b8152602060048201526012602482015271125b98dbdc9c995b9d08115512081cd95b9d60721b6044820152606401610d08565b601454336000908152600f602052604090205460ff600160301b909204821691611a8a919084169061ffff16613a26565b61ffff161115611aac5760405162461bcd60e51b8152600401610d0890613890565b336000908152600f60205260408120805460ff84169290611ad290849061ffff16613a26565b92506101000a81548161ffff021916908361ffff160217905550611af68484612821565b5050600160075550505050565b60026007541415611b265760405162461bcd60e51b8152600401610d08906139ef565b600260075560145462010000900460ff16600414611b565760405162461bcd60e51b8152600401610d08906137db565b6000805b82811015611b9f57838382818110611b7457611b74613bda565b9050602002016020810190611b899190613648565b9091019080611b9781613b7f565b915050611b5a565b5060058160ff161115611bf45760405162461bcd60e51b815260206004820181905260248201527f43616e206d696e7420757020746f203520706572207472616e73616374696f6e6044820152606401610d08565b611bfe83836124ce565b611c1a5760405162461bcd60e51b8152600401610d0890613941565b611c2583833461272d565b611c415760405162461bcd60e51b8152600401610d0890613812565b611c4b8383612821565b5050600160075550565b6060600060128054611c6690613b22565b905011611c825760405180602001604052806000815250610bfb565b6012611c8d83612dee565b604051602001611c9e9291906136d0565b60405160208183030381529060405292915050565b60026007541415611cd65760405162461bcd60e51b8152600401610d08906139ef565b6002600781905560145462010000900460ff1614611d065760405162461bcd60e51b8152600401610d08906137db565b611d1082826124ce565b611d2c5760405162461bcd60e51b8152600401610d0890613941565b611d3782823461272d565b611d535760405162461bcd60e51b8152600401610d0890613812565b600033604051602001611d6691906136b3565b604051602081830303815290604052805190602001209050611dbf85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601054915084905061280b565b611ddb5760405162461bcd60e51b8152600401610d08906138d5565b6000805b83811015611e2c57848482818110611df957611df9613bda565b9050602002016020810190611e0e9190613648565b611e189083613a64565b915080611e2481613b7f565b915050611ddf565b50601454336000908152600d602052604090205460ff640100000000909204821691611e5f919084169061ffff16613a26565b61ffff161115611e815760405162461bcd60e51b8152600401610d0890613890565b336000908152600d60205260408120805460ff84169290611ad290849061ffff16613a26565b6006546001600160a01b03163314611ed15760405162461bcd60e51b8152600401610d089061390c565b6001600160a01b038116611f365760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d08565b6110ba81612a54565b60026007541415611f625760405162461bcd60e51b8152600401610d08906139ef565b600260075560145462010000900460ff16600114611f925760405162461bcd60e51b8152600401610d08906137db565b611f9c82826124ce565b611fb85760405162461bcd60e51b8152600401610d0890613941565b611fc382823461272d565b611fdf5760405162461bcd60e51b8152600401610d0890613812565b600033604051602001611ff291906136b3565b60405160208183030381529060405280519060200120905061204b85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601054915084905061280b565b6120675760405162461bcd60e51b8152600401610d08906138d5565b6000805b838110156120b85784848281811061208557612085613bda565b905060200201602081019061209a9190613648565b6120a49083613a64565b9150806120b081613b7f565b91505061206b565b50601454336000908152600c602052604090205460ff63010000009092048216916120ea919084169061ffff16613a26565b61ffff16111561210c5760405162461bcd60e51b8152600401610d0890613890565b336000908152600c60205260408120805460ff84169290611ad290849061ffff16613a26565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906121678261139d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166122195760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610d08565b60006122248361139d565b9050806001600160a01b0316846001600160a01b0316148061226b57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b8061228f5750836001600160a01b031661228484610c93565b6001600160a01b0316145b949350505050565b826001600160a01b03166122aa8261139d565b6001600160a01b03161461230e5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610d08565b6001600160a01b0382166123705760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610d08565b61237b600082612132565b6001600160a01b03831660009081526003602052604081208054600192906123a4908490613adf565b90915550506001600160a01b03821660009081526003602052604081208054600192906123d2908490613a4c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061243e8261139d565b905061244b600083612132565b6001600160a01b0381166000908152600360205260408120805460019290612474908490613adf565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60135460009062010000900461ffff166124eb60326103e8613abc565b6124f59190613a26565b60135461ffff91821691600160b81b90910416848460008161251957612519613bda565b905060200201602081019061252e9190613648565b60ff1661253b9190613a26565b61ffff16111580156125bd5750601354640100000000900461ffff1661256460326103e8613abc565b61256e9190613a26565b60135461ffff91821691600160c81b909104168484600181811061259457612594613bda565b90506020020160208101906125a99190613648565b60ff166125b69190613a26565b61ffff1611155b80156126385750601354600160301b900461ffff166125df60326103e8613abc565b6125e99190613a26565b60135461ffff91821691600160d81b909104168484600281811061260f5761260f613bda565b90506020020160208101906126249190613648565b60ff166126319190613a26565b61ffff1611155b80156126b35750601354600160401b900461ffff1661265a60326103e8613abc565b6126649190613a26565b60135461ffff91821691600160e81b909104168484600381811061268a5761268a613bda565b905060200201602081019061269f9190613648565b60ff166126ac9190613a26565b61ffff1611155b80156127265750601354600160501b900461ffff166126d560326101bc613abc565b6126df9190613a26565b60145461ffff9182169116848460048181106126fd576126fd613bda565b90506020020160208101906127129190613648565b60ff1661271f9190613a26565b61ffff1611155b9392505050565b60008080805b858110156127785786868281811061274d5761274d613bda565b90506020020160208101906127629190613648565b909201918061277081613b7f565b915050612733565b5060145462010000900460ff16600114156127a45760095461279d9060ff8416613a9d565b9050612800565b60145460ff6201000090910416600214156127c957600a5461279d9060ff8416613a9d565b60145462010000900460ff16600314156127ed57600b5461279d9060ff8416613a9d565b600b546127fd9060ff8416613a9d565b90505b909214949350505050565b6000826128188584612eec565b14949350505050565b6000805b828110156128725783838281811061283f5761283f613bda565b90506020020160208101906128549190613648565b61285e9083613a64565b91508061286a81613b7f565b915050612825565b5060ff81166128c35760405162461bcd60e51b815260206004820152601a60248201527f416d6f756e7420746f206d696e742063616e6e6f7420626520300000000000006044820152606401610d08565b6000838360008181106128d8576128d8613bda565b90506020020160208101906128ed9190613648565b60ff1611156129285761292860008484600081811061290e5761290e613bda565b90506020020160208101906129239190613648565b612ba8565b60008383600181811061293d5761293d613bda565b90506020020160208101906129529190613648565b60ff1611156129735761297360018484600181811061290e5761290e613bda565b60008383600281811061298857612988613bda565b905060200201602081019061299d9190613648565b60ff1611156129be576129be60028484600281811061290e5761290e613bda565b6000838360038181106129d3576129d3613bda565b90506020020160208101906129e89190613648565b60ff161115612a0957612a0960038484600381811061290e5761290e613bda565b600083836004818110612a1e57612a1e613bda565b9050602002016020810190612a339190613648565b60ff161115610e3e57610e3e60048484600481811061290e5761290e613bda565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415612b085760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610d08565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612b80848484612297565b612b8c84848484612f60565b6115e05760405162461bcd60e51b8152600401610d089061383e565b60ff8216612c385760005b8160ff16811015610e3e576013805461ffff60b81b198116600160b81b9182900461ffff908116600101811690920217808355612c26923392600160681b90920490911690600d612c0383613b5d565b91906101000a81548161ffff021916908361ffff16021790555061ffff1661306d565b80612c3081613b7f565b915050612bb3565b8160ff1660011415612ca95760005b8160ff16811015610e3e576013805461ffff60c81b198116600160c81b9182900461ffff908116600101811690920217808355612c97923392600160781b90920490911690600f612c0383613b5d565b80612ca181613b7f565b915050612c47565b8160ff1660021415612d1a5760005b8160ff16811015610e3e576013805461ffff60d81b198116600160d81b9182900461ffff908116600101811690920217808355612d08923392600160881b909204909116906011612c0383613b5d565b80612d1281613b7f565b915050612cb8565b8160ff1660031415612d8a5760005b8160ff16811015610e3e576013805461ffff60e81b198116600160e81b9182900461ffff908116600101811690920217808355612d78923392600160981b9092049091169080612c0383613b5d565b80612d8281613b7f565b915050612d29565b8160ff166004141561136a5760005b8160ff16811015610e3e576014805461ffff198116600161ffff9283160182161790915560138054612ddc923392600160a81b90920416906015612c0383613b5d565b80612de681613b7f565b915050612d99565b606081612e125750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612e3c5780612e2681613b7f565b9150612e359050600a83613a89565b9150612e16565b60008167ffffffffffffffff811115612e5757612e57613bf0565b6040519080825280601f01601f191660200182016040528015612e81576020820181803683370190505b5090505b841561228f57612e96600183613adf565b9150612ea3600a86613b9a565b612eae906030613a4c565b60f81b818381518110612ec357612ec3613bda565b60200101906001600160f81b031916908160001a905350612ee5600a86613a89565b9450612e85565b600081815b8451811015612f58576000858281518110612f0e57612f0e613bda565b60200260200101519050808311612f345760008381526020829052604090209250612f45565b600081815260208490526040902092505b5080612f5081613b7f565b915050612ef1565b509392505050565b60006001600160a01b0384163b1561306257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612fa490339089908890889060040161378b565b602060405180830381600087803b158015612fbe57600080fd5b505af1925050508015612fee575060408051601f3d908101601f19168201909252612feb918101906135be565b60015b613048573d80801561301c576040519150601f19603f3d011682016040523d82523d6000602084013e613021565b606091505b5080516130405760405162461bcd60e51b8152600401610d089061383e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061228f565b506001949350505050565b61136a82826040518060200160405280600081525061308c83836130b5565b6130996000848484612f60565b610e3e5760405162461bcd60e51b8152600401610d089061383e565b6001600160a01b03821661310b5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610d08565b6000818152600260205260409020546001600160a01b0316156131705760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610d08565b6001600160a01b0382166000908152600360205260408120805460019290613199908490613a4c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461320390613b22565b90600052602060002090601f016020900481019282613225576000855561326b565b82601f1061323e57805160ff191683800117855561326b565b8280016001018555821561326b579182015b8281111561326b578251825591602001919060010190613250565b5061327792915061327b565b5090565b5b80821115613277576000815560010161327c565b600067ffffffffffffffff808411156132ab576132ab613bf0565b604051601f8501601f19908116603f011681019082821181831017156132d3576132d3613bf0565b816040528093508581528686860111156132ec57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461331d57600080fd5b919050565b60008083601f84011261333457600080fd5b50813567ffffffffffffffff81111561334c57600080fd5b6020830191508360208260051b850101111561336757600080fd5b9250929050565b60006020828403121561338057600080fd5b61272682613306565b6000806040838503121561339c57600080fd5b6133a583613306565b91506133b360208401613306565b90509250929050565b6000806000606084860312156133d157600080fd5b6133da84613306565b92506133e860208501613306565b9150604084013590509250925092565b6000806000806080858703121561340e57600080fd5b61341785613306565b935061342560208601613306565b925060408501359150606085013567ffffffffffffffff81111561344857600080fd5b8501601f8101871361345957600080fd5b61346887823560208401613290565b91505092959194509250565b6000806040838503121561348757600080fd5b61349083613306565b9150602083013580151581146134a557600080fd5b809150509250929050565b600080604083850312156134c357600080fd5b6134cc83613306565b946020939093013593505050565b600080600080604085870312156134f057600080fd5b843567ffffffffffffffff8082111561350857600080fd5b61351488838901613322565b9096509450602087013591508082111561352d57600080fd5b5061353a87828801613322565b95989497509550505050565b6000806020838503121561355957600080fd5b823567ffffffffffffffff81111561357057600080fd5b61357c85828601613322565b90969095509350505050565b60006020828403121561359a57600080fd5b5035919050565b6000602082840312156135b357600080fd5b813561272681613c06565b6000602082840312156135d057600080fd5b815161272681613c06565b6000602082840312156135ed57600080fd5b813567ffffffffffffffff81111561360457600080fd5b8201601f8101841361361557600080fd5b61228f84823560208401613290565b60006020828403121561363657600080fd5b813561ffff8116811461272657600080fd5b60006020828403121561365a57600080fd5b813560ff8116811461272657600080fd5b60008151808452613683816020860160208601613af6565b601f01601f19169290920160200192915050565b600081516136a9818560208601613af6565b9290920192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b600080845481600182811c9150808316806136ec57607f831692505b602080841082141561370c57634e487b7160e01b86526022600452602486fd5b81801561372057600181146137315761375e565b60ff1986168952848901965061375e565b60008b81526020902060005b868110156137565781548b82015290850190830161373d565b505084890196505b5050505050506137826137718286613697565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906137be9083018461366b565b9695505050505050565b602081526000612726602083018461366b565b6020808252601d908201527f4e6f7420696e20636f7272656374206d696e74696e672070686173652e000000604082015260600190565b602080825260129082015271125b98dbdc9c9958dd08115512081cd95b9d60721b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526025908201527f576f756c6420676f206f76657220746f6b656e206c696d697420706572206164604082015264647265737360d81b606082015260800190565b6020808252601b908201527f41646472657373206973206e6f74206f6e2077686974656c6973740000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526037908201527f576f756c6420657863656564206d6178696d756d206e756d626572206f66207460408201527f6f6b656e7320696e206120676976656e207468656d652e000000000000000000606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600061ffff808316818516808303821115613a4357613a43613bae565b01949350505050565b60008219821115613a5f57613a5f613bae565b500190565b600060ff821660ff84168060ff03821115613a8157613a81613bae565b019392505050565b600082613a9857613a98613bc4565b500490565b6000816000190483118215151615613ab757613ab7613bae565b500290565b600061ffff83811690831681811015613ad757613ad7613bae565b039392505050565b600082821015613af157613af1613bae565b500390565b60005b83811015613b11578181015183820152602001613af9565b838111156115e05750506000910152565b600181811c90821680613b3657607f821691505b60208210811415613b5757634e487b7160e01b600052602260045260246000fd5b50919050565b600061ffff80831681811415613b7557613b75613bae565b6001019392505050565b6000600019821415613b9357613b93613bae565b5060010190565b600082613ba957613ba9613bc4565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146110ba57600080fdfea2646970667358221220e42ccd70e8da45665d96e727533c1809bf7f4874cdc87f64cbc154954e24849b64736f6c6343000807003368747470733a2f2f6d696e74737465657a792e78797a2f737465657a796d657461646174612f

Deployed Bytecode

0x6080604052600436106103ac5760003560e01c80638ca33c1d116101e7578063c63f96901161010d578063df00a7b4116100a0578063ee9a62391161006f578063ee9a623914610b29578063f2de8adb14610b5a578063f2fde38b14610b7c578063ffcd39df14610b9c57600080fd5b8063df00a7b414610a87578063e166f1aa14610aaa578063e4f2487a14610ac0578063e985e9c514610ae057600080fd5b8063cfa81a8d116100dc578063cfa81a8d146109f1578063d0c80cf214610a22578063d5f1c3d114610a44578063d8ecbf2214610a6657600080fd5b8063c63f969014610998578063c78e7dd4146109ab578063c87b56dd146109be578063c966ca17146109de57600080fd5b8063b150a6f611610185578063b7f00d3311610154578063b7f00d331461091b578063b88d4fde14610936578063bcc51ed014610956578063c48fdc341461097657600080fd5b8063b150a6f6146108a7578063b290a229146108c2578063b596a3f9146108e3578063b7acfe861461090557600080fd5b8063a1748200116101c1578063a174820014610813578063a22cb46514610836578063a739fa3d14610856578063ae433f141461087657600080fd5b80638ca33c1d146107be5780638da5cb5b146107e057806395d89b41146107fe57600080fd5b80633ccfd60b116102d75780636b0a05691161026a5780637ad59431116102395780637ad594311461073a5780637cb647591461075a5780637f48d22a1461077a57806388bf1c501461079c57600080fd5b80636b0a0569146106ce5780636ba90c6e146106f057806370a0823114610705578063715018a61461072557600080fd5b806355f804b3116102a657806355f804b31461063d5780635cdcbc181461065d57806361aa58631461068e5780636352211e146106ae57600080fd5b80633ccfd60b146105d557806342842e0e146105ea57806342966c681461060a5780634436cf9f1461062a57600080fd5b80630ebd2bc01161034f57806323b872dd1161031e57806323b872dd146105675780632ac1dd27146105875780632eb4a7ab146105a957806332cb6b0c146105bf57600080fd5b80630ebd2bc0146104e15780631449f6ce14610502578063167573381461052257806318160ddd1461054457600080fd5b8063034cbc801161038b578063034cbc801461044357806306fdde0314610465578063081812fc14610487578063095ea7b3146104bf57600080fd5b8062fe11e5146103b157806301dc474b146103df57806301ffc9a714610413575b600080fd5b3480156103bd57600080fd5b506103c76103e881565b60405161ffff90911681526020015b60405180910390f35b3480156103eb57600080fd5b5060145461040190640100000000900460ff1681565b60405160ff90911681526020016103d6565b34801561041f57600080fd5b5061043361042e3660046135a1565b610baf565b60405190151581526020016103d6565b34801561044f57600080fd5b506013546103c790600160681b900461ffff1681565b34801561047157600080fd5b5061047a610c01565b6040516103d691906137c8565b34801561049357600080fd5b506104a76104a2366004613588565b610c93565b6040516001600160a01b0390911681526020016103d6565b3480156104cb57600080fd5b506104df6104da3660046134b0565b610d2d565b005b3480156104ed57600080fd5b50601454610401906301000000900460ff1681565b34801561050e57600080fd5b506104df61051d366004613648565b610e43565b34801561052e57600080fd5b506013546103c790600160401b900461ffff1681565b34801561055057600080fd5b50610559610e91565b6040519081526020016103d6565b34801561057357600080fd5b506104df6105823660046133bc565b610ef7565b34801561059357600080fd5b506013546103c790600160881b900461ffff1681565b3480156105b557600080fd5b5061055960105481565b3480156105cb57600080fd5b506103c761115c81565b3480156105e157600080fd5b506104df610f29565b3480156105f657600080fd5b506104df6106053660046133bc565b611028565b34801561061657600080fd5b506104df610625366004613588565b611043565b6104df6106383660046134da565b6110bd565b34801561064957600080fd5b506104df6106583660046135db565b61132d565b34801561066957600080fd5b506103c761067836600461336e565b600e6020526000908152604090205461ffff1681565b34801561069a57600080fd5b506104df6106a9366004613588565b61136e565b3480156106ba57600080fd5b506104a76106c9366004613588565b61139d565b3480156106da57600080fd5b506013546103c790600160e81b900461ffff1681565b3480156106fc57600080fd5b506103c760fa81565b34801561071157600080fd5b5061055961072036600461336e565b611414565b34801561073157600080fd5b506104df61149b565b34801561074657600080fd5b506104df610755366004613648565b6114d1565b34801561076657600080fd5b506104df610775366004613588565b611519565b34801561078657600080fd5b506013546103c790600160781b900461ffff1681565b3480156107a857600080fd5b506013546103c790600160c81b900461ffff1681565b3480156107ca57600080fd5b506013546103c790600160501b900461ffff1681565b3480156107ec57600080fd5b506006546001600160a01b03166104a7565b34801561080a57600080fd5b5061047a611548565b34801561081f57600080fd5b506013546103c790640100000000900461ffff1681565b34801561084257600080fd5b506104df610851366004613474565b611557565b34801561086257600080fd5b506104df610871366004613648565b611562565b34801561088257600080fd5b506103c761089136600461336e565b600f6020526000908152604090205461ffff1681565b3480156108b357600080fd5b506013546103c79061ffff1681565b3480156108ce57600080fd5b5060145461040190600160301b900460ff1681565b3480156108ef57600080fd5b506013546103c790600160a81b900461ffff1681565b34801561091157600080fd5b5061055960115481565b34801561092757600080fd5b506014546103c79061ffff1681565b34801561094257600080fd5b506104df6109513660046133f8565b6115ae565b34801561096257600080fd5b506104df610971366004613624565b6115e6565b34801561098257600080fd5b506013546103c790600160d81b900461ffff1681565b6104df6109a63660046134da565b61188d565b6104df6109b9366004613546565b611b03565b3480156109ca57600080fd5b5061047a6109d9366004613588565b611c55565b6104df6109ec3660046134da565b611cb3565b3480156109fd57600080fd5b506103c7610a0c36600461336e565b600d6020526000908152604090205461ffff1681565b348015610a2e57600080fd5b506013546103c790600160301b900461ffff1681565b348015610a5057600080fd5b506013546103c790600160981b900461ffff1681565b348015610a7257600080fd5b506013546103c79062010000900461ffff1681565b348015610a9357600080fd5b506014546104019065010000000000900460ff1681565b348015610ab657600080fd5b506103c76101bc81565b348015610acc57600080fd5b506014546104019062010000900460ff1681565b348015610aec57600080fd5b50610433610afb366004613389565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610b3557600080fd5b506103c7610b4436600461336e565b600c6020526000908152604090205461ffff1681565b348015610b6657600080fd5b506013546103c790600160b81b900461ffff1681565b348015610b8857600080fd5b506104df610b9736600461336e565b611ea7565b6104df610baa3660046134da565b611f3f565b60006001600160e01b031982166380ac58cd60e01b1480610be057506001600160e01b03198216635b5e139f60e01b145b80610bfb57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610c1090613b22565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3c90613b22565b8015610c895780601f10610c5e57610100808354040283529160200191610c89565b820191906000526020600020905b815481529060010190602001808311610c6c57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610d115760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610d388261139d565b9050806001600160a01b0316836001600160a01b03161415610da65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610d08565b336001600160a01b0382161480610dc25750610dc28133610afb565b610e345760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610d08565b610e3e8383612132565b505050565b6006546001600160a01b03163314610e6d5760405162461bcd60e51b8152600401610d089061390c565b6014805460ff909216650100000000000265ff000000000019909216919091179055565b60145460135460009161ffff90811691600160e81b8104821691600160d81b8204811691610ed091600160c81b8204811691600160b81b900416613a26565b610eda9190613a26565b610ee49190613a26565b610eee9190613a26565b61ffff16905090565b610f02335b826121a0565b610f1e5760405162461bcd60e51b8152600401610d089061399e565b610e3e838383612297565b6006546001600160a01b03163314610f535760405162461bcd60e51b8152600401610d089061390c565b4773a6021476f90fde5b4fc2bc4c22ca26008f2a23f773388ccbf8c1a37f444dcff6ede0014dfa85bedc1b6000610f8b606485613a89565b610f96906055613a9d565b90506000610fa5606486613a89565b610fb090600f613a9d565b6040519091506001600160a01b0385169083156108fc029084906000818181858888f19350505050158015610fe9573d6000803e3d6000fd5b506040516001600160a01b0384169082156108fc029083906000818181858888f19350505050158015611020573d6000803e3d6000fd5b505050505050565b610e3e838383604051806020016040528060008152506115ae565b61104c33610efc565b6110b15760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610d08565b6110ba81612433565b50565b600260075414156110e05760405162461bcd60e51b8152600401610d08906139ef565b600260075560145462010000900460ff166003146111105760405162461bcd60e51b8152600401610d08906137db565b61111a82826124ce565b6111365760405162461bcd60e51b8152600401610d0890613941565b6000805b8281101561117f5783838281811061115457611154613bda565b90506020020160208101906111699190613648565b909101908061117781613b7f565b91505061113a565b5060058160ff1611156111d45760405162461bcd60e51b815260206004820181905260248201527f43616e206d696e7420757020746f203520706572207472616e73616374696f6e6044820152606401610d08565b6111df83833461272d565b6111fb5760405162461bcd60e51b8152600401610d0890613812565b60003360405160200161120e91906136b3565b60405160208183030381529060405280519060200120905061126786868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601054915084905061280b565b6112835760405162461bcd60e51b8152600401610d08906138d5565b6000805b848110156112d4578585828181106112a1576112a1613bda565b90506020020160208101906112b69190613648565b6112c09083613a64565b9150806112cc81613b7f565b915050611287565b50336000908152600e60205260408120805460ff841692906112fb90849061ffff16613a26565b92506101000a81548161ffff021916908361ffff16021790555061131f8585612821565b505060016007555050505050565b6006546001600160a01b031633146113575760405162461bcd60e51b8152600401610d089061390c565b805161136a9060129060208401906131f7565b5050565b6006546001600160a01b031633146113985760405162461bcd60e51b8152600401610d089061390c565b601155565b6000818152600260205260408120546001600160a01b031680610bfb5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610d08565b60006001600160a01b03821661147f5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610d08565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146114c55760405162461bcd60e51b8152600401610d089061390c565b6114cf6000612a54565b565b6006546001600160a01b031633146114fb5760405162461bcd60e51b8152600401610d089061390c565b6014805460ff909216620100000262ff000019909216919091179055565b6006546001600160a01b031633146115435760405162461bcd60e51b8152600401610d089061390c565b601055565b606060018054610c1090613b22565b61136a338383612aa6565b6006546001600160a01b0316331461158c5760405162461bcd60e51b8152600401610d089061390c565b6014805460ff9092166401000000000264ff0000000019909216919091179055565b6115b833836121a0565b6115d45760405162461bcd60e51b8152600401610d089061399e565b6115e084848484612b75565b50505050565b6006546001600160a01b031633146116105760405162461bcd60e51b8152600401610d089061390c565b60135460fa9061162590839061ffff16613a26565b61ffff1611156116775760405162461bcd60e51b815260206004820152601960248201527f576f756c6420657863656564206d6178207265736572766564000000000000006044820152606401610d08565b6013805482919060009061169090849061ffff16613a26565b92506101000a81548161ffff021916908361ffff16021790555060005b8161ffff1681101561136a57601354600160601b900460ff16611710576116d660006001612ba8565b6013805462010000900461ffff169060026116f083613b5d565b91906101000a81548161ffff021916908361ffff1602179055505061181c565b601354600160601b900460ff166001141561174c57611730600180612ba8565b60138054640100000000900461ffff169060046116f083613b5d565b601354600160601b900460ff16600214156117885761176d60026001612ba8565b60138054600160301b900461ffff169060066116f083613b5d565b601354600160601b900460ff16600314156117c4576117a960036001612ba8565b60138054600160401b900461ffff169060086116f083613b5d565b601354600160601b900460ff166004141561181c576117e560046001612ba8565b60138054600160501b900461ffff1690600a61180083613b5d565b91906101000a81548161ffff021916908361ffff160217905550505b601354600160601b900460ff1660041415611843576013805460ff60601b1916905561187b565b60016013600c8282829054906101000a900460ff166118629190613a64565b92506101000a81548160ff021916908360ff1602179055505b8061188581613b7f565b9150506116ad565b600260075414156118b05760405162461bcd60e51b8152600401610d08906139ef565b600260075560145462010000900460ff166119055760405162461bcd60e51b815260206004820152601560248201527414d85b194818dd5c9c995b9d1b1e4818db1bdcd959605a1b6044820152606401610d08565b61190f82826124ce565b61192b5760405162461bcd60e51b8152600401610d0890613941565b60003360405160200161193e91906136b3565b60405160208183030381529060405280519060200120905061199785858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601154915084905061280b565b6119b35760405162461bcd60e51b8152600401610d08906138d5565b6000805b83811015611a04578484828181106119d1576119d1613bda565b90506020020160208101906119e69190613648565b6119f09083613a64565b9150806119fc81613b7f565b9150506119b7565b50346008548260ff16611a179190613a9d565b14611a595760405162461bcd60e51b8152602060048201526012602482015271125b98dbdc9c995b9d08115512081cd95b9d60721b6044820152606401610d08565b601454336000908152600f602052604090205460ff600160301b909204821691611a8a919084169061ffff16613a26565b61ffff161115611aac5760405162461bcd60e51b8152600401610d0890613890565b336000908152600f60205260408120805460ff84169290611ad290849061ffff16613a26565b92506101000a81548161ffff021916908361ffff160217905550611af68484612821565b5050600160075550505050565b60026007541415611b265760405162461bcd60e51b8152600401610d08906139ef565b600260075560145462010000900460ff16600414611b565760405162461bcd60e51b8152600401610d08906137db565b6000805b82811015611b9f57838382818110611b7457611b74613bda565b9050602002016020810190611b899190613648565b9091019080611b9781613b7f565b915050611b5a565b5060058160ff161115611bf45760405162461bcd60e51b815260206004820181905260248201527f43616e206d696e7420757020746f203520706572207472616e73616374696f6e6044820152606401610d08565b611bfe83836124ce565b611c1a5760405162461bcd60e51b8152600401610d0890613941565b611c2583833461272d565b611c415760405162461bcd60e51b8152600401610d0890613812565b611c4b8383612821565b5050600160075550565b6060600060128054611c6690613b22565b905011611c825760405180602001604052806000815250610bfb565b6012611c8d83612dee565b604051602001611c9e9291906136d0565b60405160208183030381529060405292915050565b60026007541415611cd65760405162461bcd60e51b8152600401610d08906139ef565b6002600781905560145462010000900460ff1614611d065760405162461bcd60e51b8152600401610d08906137db565b611d1082826124ce565b611d2c5760405162461bcd60e51b8152600401610d0890613941565b611d3782823461272d565b611d535760405162461bcd60e51b8152600401610d0890613812565b600033604051602001611d6691906136b3565b604051602081830303815290604052805190602001209050611dbf85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601054915084905061280b565b611ddb5760405162461bcd60e51b8152600401610d08906138d5565b6000805b83811015611e2c57848482818110611df957611df9613bda565b9050602002016020810190611e0e9190613648565b611e189083613a64565b915080611e2481613b7f565b915050611ddf565b50601454336000908152600d602052604090205460ff640100000000909204821691611e5f919084169061ffff16613a26565b61ffff161115611e815760405162461bcd60e51b8152600401610d0890613890565b336000908152600d60205260408120805460ff84169290611ad290849061ffff16613a26565b6006546001600160a01b03163314611ed15760405162461bcd60e51b8152600401610d089061390c565b6001600160a01b038116611f365760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d08565b6110ba81612a54565b60026007541415611f625760405162461bcd60e51b8152600401610d08906139ef565b600260075560145462010000900460ff16600114611f925760405162461bcd60e51b8152600401610d08906137db565b611f9c82826124ce565b611fb85760405162461bcd60e51b8152600401610d0890613941565b611fc382823461272d565b611fdf5760405162461bcd60e51b8152600401610d0890613812565b600033604051602001611ff291906136b3565b60405160208183030381529060405280519060200120905061204b85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601054915084905061280b565b6120675760405162461bcd60e51b8152600401610d08906138d5565b6000805b838110156120b85784848281811061208557612085613bda565b905060200201602081019061209a9190613648565b6120a49083613a64565b9150806120b081613b7f565b91505061206b565b50601454336000908152600c602052604090205460ff63010000009092048216916120ea919084169061ffff16613a26565b61ffff16111561210c5760405162461bcd60e51b8152600401610d0890613890565b336000908152600c60205260408120805460ff84169290611ad290849061ffff16613a26565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906121678261139d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166122195760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610d08565b60006122248361139d565b9050806001600160a01b0316846001600160a01b0316148061226b57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b8061228f5750836001600160a01b031661228484610c93565b6001600160a01b0316145b949350505050565b826001600160a01b03166122aa8261139d565b6001600160a01b03161461230e5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610d08565b6001600160a01b0382166123705760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610d08565b61237b600082612132565b6001600160a01b03831660009081526003602052604081208054600192906123a4908490613adf565b90915550506001600160a01b03821660009081526003602052604081208054600192906123d2908490613a4c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061243e8261139d565b905061244b600083612132565b6001600160a01b0381166000908152600360205260408120805460019290612474908490613adf565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60135460009062010000900461ffff166124eb60326103e8613abc565b6124f59190613a26565b60135461ffff91821691600160b81b90910416848460008161251957612519613bda565b905060200201602081019061252e9190613648565b60ff1661253b9190613a26565b61ffff16111580156125bd5750601354640100000000900461ffff1661256460326103e8613abc565b61256e9190613a26565b60135461ffff91821691600160c81b909104168484600181811061259457612594613bda565b90506020020160208101906125a99190613648565b60ff166125b69190613a26565b61ffff1611155b80156126385750601354600160301b900461ffff166125df60326103e8613abc565b6125e99190613a26565b60135461ffff91821691600160d81b909104168484600281811061260f5761260f613bda565b90506020020160208101906126249190613648565b60ff166126319190613a26565b61ffff1611155b80156126b35750601354600160401b900461ffff1661265a60326103e8613abc565b6126649190613a26565b60135461ffff91821691600160e81b909104168484600381811061268a5761268a613bda565b905060200201602081019061269f9190613648565b60ff166126ac9190613a26565b61ffff1611155b80156127265750601354600160501b900461ffff166126d560326101bc613abc565b6126df9190613a26565b60145461ffff9182169116848460048181106126fd576126fd613bda565b90506020020160208101906127129190613648565b60ff1661271f9190613a26565b61ffff1611155b9392505050565b60008080805b858110156127785786868281811061274d5761274d613bda565b90506020020160208101906127629190613648565b909201918061277081613b7f565b915050612733565b5060145462010000900460ff16600114156127a45760095461279d9060ff8416613a9d565b9050612800565b60145460ff6201000090910416600214156127c957600a5461279d9060ff8416613a9d565b60145462010000900460ff16600314156127ed57600b5461279d9060ff8416613a9d565b600b546127fd9060ff8416613a9d565b90505b909214949350505050565b6000826128188584612eec565b14949350505050565b6000805b828110156128725783838281811061283f5761283f613bda565b90506020020160208101906128549190613648565b61285e9083613a64565b91508061286a81613b7f565b915050612825565b5060ff81166128c35760405162461bcd60e51b815260206004820152601a60248201527f416d6f756e7420746f206d696e742063616e6e6f7420626520300000000000006044820152606401610d08565b6000838360008181106128d8576128d8613bda565b90506020020160208101906128ed9190613648565b60ff1611156129285761292860008484600081811061290e5761290e613bda565b90506020020160208101906129239190613648565b612ba8565b60008383600181811061293d5761293d613bda565b90506020020160208101906129529190613648565b60ff1611156129735761297360018484600181811061290e5761290e613bda565b60008383600281811061298857612988613bda565b905060200201602081019061299d9190613648565b60ff1611156129be576129be60028484600281811061290e5761290e613bda565b6000838360038181106129d3576129d3613bda565b90506020020160208101906129e89190613648565b60ff161115612a0957612a0960038484600381811061290e5761290e613bda565b600083836004818110612a1e57612a1e613bda565b9050602002016020810190612a339190613648565b60ff161115610e3e57610e3e60048484600481811061290e5761290e613bda565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415612b085760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610d08565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612b80848484612297565b612b8c84848484612f60565b6115e05760405162461bcd60e51b8152600401610d089061383e565b60ff8216612c385760005b8160ff16811015610e3e576013805461ffff60b81b198116600160b81b9182900461ffff908116600101811690920217808355612c26923392600160681b90920490911690600d612c0383613b5d565b91906101000a81548161ffff021916908361ffff16021790555061ffff1661306d565b80612c3081613b7f565b915050612bb3565b8160ff1660011415612ca95760005b8160ff16811015610e3e576013805461ffff60c81b198116600160c81b9182900461ffff908116600101811690920217808355612c97923392600160781b90920490911690600f612c0383613b5d565b80612ca181613b7f565b915050612c47565b8160ff1660021415612d1a5760005b8160ff16811015610e3e576013805461ffff60d81b198116600160d81b9182900461ffff908116600101811690920217808355612d08923392600160881b909204909116906011612c0383613b5d565b80612d1281613b7f565b915050612cb8565b8160ff1660031415612d8a5760005b8160ff16811015610e3e576013805461ffff60e81b198116600160e81b9182900461ffff908116600101811690920217808355612d78923392600160981b9092049091169080612c0383613b5d565b80612d8281613b7f565b915050612d29565b8160ff166004141561136a5760005b8160ff16811015610e3e576014805461ffff198116600161ffff9283160182161790915560138054612ddc923392600160a81b90920416906015612c0383613b5d565b80612de681613b7f565b915050612d99565b606081612e125750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612e3c5780612e2681613b7f565b9150612e359050600a83613a89565b9150612e16565b60008167ffffffffffffffff811115612e5757612e57613bf0565b6040519080825280601f01601f191660200182016040528015612e81576020820181803683370190505b5090505b841561228f57612e96600183613adf565b9150612ea3600a86613b9a565b612eae906030613a4c565b60f81b818381518110612ec357612ec3613bda565b60200101906001600160f81b031916908160001a905350612ee5600a86613a89565b9450612e85565b600081815b8451811015612f58576000858281518110612f0e57612f0e613bda565b60200260200101519050808311612f345760008381526020829052604090209250612f45565b600081815260208490526040902092505b5080612f5081613b7f565b915050612ef1565b509392505050565b60006001600160a01b0384163b1561306257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612fa490339089908890889060040161378b565b602060405180830381600087803b158015612fbe57600080fd5b505af1925050508015612fee575060408051601f3d908101601f19168201909252612feb918101906135be565b60015b613048573d80801561301c576040519150601f19603f3d011682016040523d82523d6000602084013e613021565b606091505b5080516130405760405162461bcd60e51b8152600401610d089061383e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061228f565b506001949350505050565b61136a82826040518060200160405280600081525061308c83836130b5565b6130996000848484612f60565b610e3e5760405162461bcd60e51b8152600401610d089061383e565b6001600160a01b03821661310b5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610d08565b6000818152600260205260409020546001600160a01b0316156131705760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610d08565b6001600160a01b0382166000908152600360205260408120805460019290613199908490613a4c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461320390613b22565b90600052602060002090601f016020900481019282613225576000855561326b565b82601f1061323e57805160ff191683800117855561326b565b8280016001018555821561326b579182015b8281111561326b578251825591602001919060010190613250565b5061327792915061327b565b5090565b5b80821115613277576000815560010161327c565b600067ffffffffffffffff808411156132ab576132ab613bf0565b604051601f8501601f19908116603f011681019082821181831017156132d3576132d3613bf0565b816040528093508581528686860111156132ec57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461331d57600080fd5b919050565b60008083601f84011261333457600080fd5b50813567ffffffffffffffff81111561334c57600080fd5b6020830191508360208260051b850101111561336757600080fd5b9250929050565b60006020828403121561338057600080fd5b61272682613306565b6000806040838503121561339c57600080fd5b6133a583613306565b91506133b360208401613306565b90509250929050565b6000806000606084860312156133d157600080fd5b6133da84613306565b92506133e860208501613306565b9150604084013590509250925092565b6000806000806080858703121561340e57600080fd5b61341785613306565b935061342560208601613306565b925060408501359150606085013567ffffffffffffffff81111561344857600080fd5b8501601f8101871361345957600080fd5b61346887823560208401613290565b91505092959194509250565b6000806040838503121561348757600080fd5b61349083613306565b9150602083013580151581146134a557600080fd5b809150509250929050565b600080604083850312156134c357600080fd5b6134cc83613306565b946020939093013593505050565b600080600080604085870312156134f057600080fd5b843567ffffffffffffffff8082111561350857600080fd5b61351488838901613322565b9096509450602087013591508082111561352d57600080fd5b5061353a87828801613322565b95989497509550505050565b6000806020838503121561355957600080fd5b823567ffffffffffffffff81111561357057600080fd5b61357c85828601613322565b90969095509350505050565b60006020828403121561359a57600080fd5b5035919050565b6000602082840312156135b357600080fd5b813561272681613c06565b6000602082840312156135d057600080fd5b815161272681613c06565b6000602082840312156135ed57600080fd5b813567ffffffffffffffff81111561360457600080fd5b8201601f8101841361361557600080fd5b61228f84823560208401613290565b60006020828403121561363657600080fd5b813561ffff8116811461272657600080fd5b60006020828403121561365a57600080fd5b813560ff8116811461272657600080fd5b60008151808452613683816020860160208601613af6565b601f01601f19169290920160200192915050565b600081516136a9818560208601613af6565b9290920192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b600080845481600182811c9150808316806136ec57607f831692505b602080841082141561370c57634e487b7160e01b86526022600452602486fd5b81801561372057600181146137315761375e565b60ff1986168952848901965061375e565b60008b81526020902060005b868110156137565781548b82015290850190830161373d565b505084890196505b5050505050506137826137718286613697565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906137be9083018461366b565b9695505050505050565b602081526000612726602083018461366b565b6020808252601d908201527f4e6f7420696e20636f7272656374206d696e74696e672070686173652e000000604082015260600190565b602080825260129082015271125b98dbdc9c9958dd08115512081cd95b9d60721b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526025908201527f576f756c6420676f206f76657220746f6b656e206c696d697420706572206164604082015264647265737360d81b606082015260800190565b6020808252601b908201527f41646472657373206973206e6f74206f6e2077686974656c6973740000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526037908201527f576f756c6420657863656564206d6178696d756d206e756d626572206f66207460408201527f6f6b656e7320696e206120676976656e207468656d652e000000000000000000606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600061ffff808316818516808303821115613a4357613a43613bae565b01949350505050565b60008219821115613a5f57613a5f613bae565b500190565b600060ff821660ff84168060ff03821115613a8157613a81613bae565b019392505050565b600082613a9857613a98613bc4565b500490565b6000816000190483118215151615613ab757613ab7613bae565b500290565b600061ffff83811690831681811015613ad757613ad7613bae565b039392505050565b600082821015613af157613af1613bae565b500390565b60005b83811015613b11578181015183820152602001613af9565b838111156115e05750506000910152565b600181811c90821680613b3657607f821691505b60208210811415613b5757634e487b7160e01b600052602260045260246000fd5b50919050565b600061ffff80831681811415613b7557613b75613bae565b6001019392505050565b6000600019821415613b9357613b93613bae565b5060010190565b600082613ba957613ba9613bc4565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146110ba57600080fdfea2646970667358221220e42ccd70e8da45665d96e727533c1809bf7f4874cdc87f64cbc154954e24849b64736f6c63430008070033

Deployed Bytecode Sourcemap

42805:13113:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43375:46;;;;;;;;;;;;43417:4;43375:46;;;;;20347:6:1;20335:19;;;20317:38;;20305:2;20290:18;43375:46:0;;;;;;;;44317:29;;;;;;;;;;-1:-1:-1;44317:29:0;;;;;;;;;;;;;;20720:4:1;20708:17;;;20690:36;;20678:2;20663:18;44317:29:0;20548:184:1;29591:305:0;;;;;;;;;;-1:-1:-1;29591:305:0;;;;;:::i;:::-;;:::i;:::-;;;9343:14:1;;9336:22;9318:41;;9306:2;9291:18;29591:305:0;9178:187:1;43892:30:0;;;;;;;;;;-1:-1:-1;43892:30:0;;;;-1:-1:-1;;;43892:30:0;;;;;;30536:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;32096:221::-;;;;;;;;;;-1:-1:-1;32096:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8641:32:1;;;8623:51;;8611:2;8596:18;32096:221:0;8477:203:1;31619:411:0;;;;;;;;;;-1:-1:-1;31619:411:0;;;;;:::i;:::-;;:::i;:::-;;44277:33;;;;;;;;;;-1:-1:-1;44277:33:0;;;;;;;;;;;44764:100;;;;;;;;;;-1:-1:-1;44764:100:0;;;;;:::i;:::-;;:::i;43789:30::-;;;;;;;;;;-1:-1:-1;43789:30:0;;;;-1:-1:-1;;;43789:30:0;;;;;;45375:137;;;;;;;;;;;;;:::i;:::-;;;9516:25:1;;;9504:2;9489:18;45375:137:0;9370:177:1;32846:339:0;;;;;;;;;;-1:-1:-1;32846:339:0;;;;;:::i;:::-;;:::i;43971:33::-;;;;;;;;;;-1:-1:-1;43971:33:0;;;;-1:-1:-1;;;43971:33:0;;;;;;43265:25;;;;;;;;;;;;;;;;43328:40;;;;;;;;;;;;43364:4;43328:40;;55239:439;;;;;;;;;;;;;:::i;33256:185::-;;;;;;;;;;-1:-1:-1;33256:185:0;;;;;:::i;:::-;;:::i;55686:229::-;;;;;;;;;;-1:-1:-1;55686:229:0;;;;;:::i;:::-;;:::i;49947:1086::-;;;;;;:::i;:::-;;:::i;44980:90::-;;;;;;;;;;-1:-1:-1;44980:90:0;;;;;:::i;:::-;;:::i;43160:47::-;;;;;;;;;;-1:-1:-1;43160:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;46886:94;;;;;;;;;;-1:-1:-1;46886:94:0;;;;;:::i;:::-;;:::i;30230:239::-;;;;;;;;;;-1:-1:-1;30230:239:0;;;;;:::i;:::-;;:::i;44184:22::-;;;;;;;;;;-1:-1:-1;44184:22:0;;;;-1:-1:-1;;;44184:22:0;;;;;;43482:41;;;;;;;;;;;;43520:3;43482:41;;29960:208;;;;;;;;;;-1:-1:-1;29960:208:0;;;;;:::i;:::-;;:::i;10174:103::-;;;;;;;;;;;;;:::i;45520:90::-;;;;;;;;;;-1:-1:-1;45520:90:0;;;;;:::i;:::-;;:::i;46778:100::-;;;;;;;;;;-1:-1:-1;46778:100:0;;;;;:::i;:::-;;:::i;43929:35::-;;;;;;;;;;-1:-1:-1;43929:35:0;;;;-1:-1:-1;;;43929:35:0;;;;;;44124:24;;;;;;;;;;-1:-1:-1;44124:24:0;;;;-1:-1:-1;;;44124:24:0;;;;;;43826:32;;;;;;;;;;-1:-1:-1;43826:32:0;;;;-1:-1:-1;;;43826:32:0;;;;;;9523:87;;;;;;;;;;-1:-1:-1;9596:6:0;;-1:-1:-1;;;;;9596:6:0;9523:87;;30705:104;;;;;;;;;;;;;:::i;43713:32::-;;;;;;;;;;-1:-1:-1;43713:32:0;;;;;;;;;;;32389:155;;;;;;;;;;-1:-1:-1;32389:155:0;;;;;:::i;:::-;;:::i;44666:90::-;;;;;;;;;;-1:-1:-1;44666:90:0;;;;;:::i;:::-;;:::i;43214:42::-;;;;;;;;;;-1:-1:-1;43214:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;43644:25;;;;;;;;;;-1:-1:-1;43644:25:0;;;;;;;;44389:30;;;;;;;;;;-1:-1:-1;44389:30:0;;;;-1:-1:-1;;;44389:30:0;;;;;;44051:35;;;;;;;;;;-1:-1:-1;44051:35:0;;;;-1:-1:-1;;;44051:35:0;;;;;;43297:22;;;;;;;;;;;;;;;;44213:24;;;;;;;;;;-1:-1:-1;44213:24:0;;;;;;;;33512:328;;;;;;;;;;-1:-1:-1;33512:328:0;;;;;:::i;:::-;;:::i;45618:1152::-;;;;;;;;;;-1:-1:-1;45618:1152:0;;;;;:::i;:::-;;:::i;44155:22::-;;;;;;;;;;-1:-1:-1;44155:22:0;;;;-1:-1:-1;;;44155:22:0;;;;;;46988:967;;;;;;:::i;:::-;;:::i;51041:678::-;;;;;;:::i;:::-;;:::i;45078:289::-;;;;;;;;;;-1:-1:-1;45078:289:0;;;;;:::i;:::-;;:::i;48963:976::-;;;;;;:::i;:::-;;:::i;43111:42::-;;;;;;;;;;-1:-1:-1;43111:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;43752:30;;;;;;;;;;-1:-1:-1;43752:30:0;;;;-1:-1:-1;;;43752:30:0;;;;;;44011:33;;;;;;;;;;-1:-1:-1;44011:33:0;;;;-1:-1:-1;;;44011:33:0;;;;;;43676:30;;;;;;;;;;-1:-1:-1;43676:30:0;;;;;;;;;;;44353:29;;;;;;;;;;-1:-1:-1;44353:29:0;;;;;;;;;;;43428:47;;;;;;;;;;;;43472:3;43428:47;;44246:22;;;;;;;;;;-1:-1:-1;44246:22:0;;;;;;;;;;;32615:164;;;;;;;;;;-1:-1:-1;32615:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;32736:25:0;;;32712:4;32736:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;32615:164;43058:46;;;;;;;;;;-1:-1:-1;43058:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;44095:22;;;;;;;;;;-1:-1:-1;44095:22:0;;;;-1:-1:-1;;;44095:22:0;;;;;;10432:201;;;;;;;;;;-1:-1:-1;10432:201:0;;;;;:::i;:::-;;:::i;47963:992::-;;;;;;:::i;:::-;;:::i;29591:305::-;29693:4;-1:-1:-1;;;;;;29730:40:0;;-1:-1:-1;;;29730:40:0;;:105;;-1:-1:-1;;;;;;;29787:48:0;;-1:-1:-1;;;29787:48:0;29730:105;:158;;;-1:-1:-1;;;;;;;;;;22439:40:0;;;29852:36;29710:178;29591:305;-1:-1:-1;;29591:305:0:o;30536:100::-;30590:13;30623:5;30616:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30536:100;:::o;32096:221::-;32172:7;35439:16;;;:7;:16;;;;;;-1:-1:-1;;;;;35439:16:0;32192:73;;;;-1:-1:-1;;;32192:73:0;;17225:2:1;32192:73:0;;;17207:21:1;17264:2;17244:18;;;17237:30;17303:34;17283:18;;;17276:62;-1:-1:-1;;;17354:18:1;;;17347:42;17406:19;;32192:73:0;;;;;;;;;-1:-1:-1;32285:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;32285:24:0;;32096:221::o;31619:411::-;31700:13;31716:23;31731:7;31716:14;:23::i;:::-;31700:39;;31764:5;-1:-1:-1;;;;;31758:11:0;:2;-1:-1:-1;;;;;31758:11:0;;;31750:57;;;;-1:-1:-1;;;31750:57:0;;18354:2:1;31750:57:0;;;18336:21:1;18393:2;18373:18;;;18366:30;18432:34;18412:18;;;18405:62;-1:-1:-1;;;18483:18:1;;;18476:31;18524:19;;31750:57:0;18152:397:1;31750:57:0;8327:10;-1:-1:-1;;;;;31842:21:0;;;;:62;;-1:-1:-1;31867:37:0;31884:5;8327:10;32615:164;:::i;31867:37::-;31820:168;;;;-1:-1:-1;;;31820:168:0;;15618:2:1;31820:168:0;;;15600:21:1;15657:2;15637:18;;;15630:30;15696:34;15676:18;;;15669:62;15767:26;15747:18;;;15740:54;15811:19;;31820:168:0;15416:420:1;31820:168:0;32001:21;32010:2;32014:7;32001:8;:21::i;:::-;31689:341;31619:411;;:::o;44764:100::-;9596:6;;-1:-1:-1;;;;;9596:6:0;8327:10;9743:23;9735:68;;;;-1:-1:-1;;;9735:68:0;;;;;;;:::i;:::-;44834:16:::1;:22:::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;44834:22:0;;::::1;::::0;;;::::1;::::0;;44764:100::o;45375:137::-;45494:10;;45483:8;;45421:7;;45494:10;;;;;-1:-1:-1;;;45483:8:0;;;;;-1:-1:-1;;;45472:8:0;;;;;45448:21;;-1:-1:-1;;;45459:10:0;;;;;-1:-1:-1;;;45448:8:0;;;:21;:::i;:::-;:32;;;;:::i;:::-;:43;;;;:::i;:::-;:56;;;;:::i;:::-;45441:63;;;;45375:137;:::o;32846:339::-;33041:41;8327:10;33060:12;33074:7;33041:18;:41::i;:::-;33033:103;;;;-1:-1:-1;;;33033:103:0;;;;;;;:::i;:::-;33149:28;33159:4;33165:2;33169:7;33149:9;:28::i;55239:439::-;9596:6;;-1:-1:-1;;;;;9596:6:0;8327:10;9743:23;9735:68;;;;-1:-1:-1;;;9735:68:0;;;;;;;:::i;:::-;55305:21:::1;55354:42;55424;55287:15;55501:13;55511:3;55305:21:::0;55501:13:::1;:::i;:::-;55500:20;::::0;55518:2:::1;55500:20;:::i;:::-;55479:41:::0;-1:-1:-1;55531:20:0::1;55555:13;55565:3;55555:7:::0;:13:::1;:::i;:::-;55554:20;::::0;55572:2:::1;55554:20;:::i;:::-;55587:34;::::0;55531:43;;-1:-1:-1;;;;;;55587:22:0;::::1;::::0;:34;::::1;;;::::0;55610:10;;55587:34:::1;::::0;;;55610:10;55587:22;:34;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;55632:38:0::1;::::0;-1:-1:-1;;;;;55632:24:0;::::1;::::0;:38;::::1;;;::::0;55657:12;;55632:38:::1;::::0;;;55657:12;55632:24;:38;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;55276:402;;;;;55239:439::o:0;33256:185::-;33394:39;33411:4;33417:2;33421:7;33394:39;;;;;;;;;;;;:16;:39::i;55686:229::-;55765:41;8327:10;55784:12;8247:98;55765:41;55743:139;;;;-1:-1:-1;;;55743:139:0;;19958:2:1;55743:139:0;;;19940:21:1;19997:2;19977:18;;;19970:30;20036:34;20016:18;;;20009:62;-1:-1:-1;;;20087:18:1;;;20080:46;20143:19;;55743:139:0;19756:412:1;55743:139:0;55893:14;55899:7;55893:5;:14::i;:::-;55686:229;:::o;49947:1086::-;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;;;;;;:::i;:::-;1812:1;2543:7;:18;50102:9:::1;::::0;;;::::1;;;50115:1;50102:14;50094:56;;;;-1:-1:-1::0;;;50094:56:0::1;;;;;;;:::i;:::-;50183:24;50199:7;;50183:15;:24::i;:::-;50161:129;;;;-1:-1:-1::0;;;50161:129:0::1;;;;;;;:::i;:::-;50301:17;::::0;50329:141:::1;50349:18:::0;;::::1;50329:141;;;50433:7;;50441:1;50433:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;50418:25:::0;;::::1;::::0;50369:3;::::1;::::0;::::1;:::i;:::-;;;;50329:141;;;;50503:1;50488:11;:16;;;;50480:61;;;::::0;-1:-1:-1;;;50480:61:0;;11102:2:1;50480:61:0::1;::::0;::::1;11084:21:1::0;;;11121:18;;;11114:30;11180:34;11160:18;;;11153:62;11232:18;;50480:61:0::1;10900:356:1::0;50480:61:0::1;50560:30;50571:7;;50580:9;50560:10;:30::i;:::-;50552:61;;;;-1:-1:-1::0;;;50552:61:0::1;;;;;;;:::i;:::-;50624:12;50666:10;50649:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;50639:39;;;;;;50624:54;;50711:43;50730:5;;50711:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;50737:10:0::1;::::0;;-1:-1:-1;50749:4:0;;-1:-1:-1;50711:18:0::1;:43::i;:::-;50689:120;;;;-1:-1:-1::0;;;50689:120:0::1;;;;;;;:::i;:::-;50820:17;::::0;50848:97:::1;50868:18:::0;;::::1;50848:97;;;50923:7;;50931:1;50923:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;50908:25;::::0;;::::1;:::i;:::-;::::0;-1:-1:-1;50888:3:0;::::1;::::0;::::1;:::i;:::-;;;;50848:97;;;-1:-1:-1::0;50969:10:0::1;50955:25;::::0;;;:13:::1;:25;::::0;;;;:40;;::::1;::::0;::::1;::::0;:25;:40:::1;::::0;;;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;51006:19;51017:7;;51006:10;:19::i;:::-;-1:-1:-1::0;;1768:1:0;2722:7;:22;-1:-1:-1;;;;;49947:1086:0:o;44980:90::-;9596:6;;-1:-1:-1;;;;;9596:6:0;8327:10;9743:23;9735:68;;;;-1:-1:-1;;;9735:68:0;;;;;;;:::i;:::-;45049:13;;::::1;::::0;:7:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;;44980:90:::0;:::o;46886:94::-;9596:6;;-1:-1:-1;;;;;9596:6:0;8327:10;9743:23;9735:68;;;;-1:-1:-1;;;9735:68:0;;;;;;;:::i;:::-;46954:7:::1;:18:::0;46886:94::o;30230:239::-;30302:7;30338:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30338:16:0;30373:19;30365:73;;;;-1:-1:-1;;;30365:73:0;;16454:2:1;30365:73:0;;;16436:21:1;16493:2;16473:18;;;16466:30;16532:34;16512:18;;;16505:62;-1:-1:-1;;;16583:18:1;;;16576:39;16632:19;;30365:73:0;16252:405:1;29960:208:0;30032:7;-1:-1:-1;;;;;30060:19:0;;30052:74;;;;-1:-1:-1;;;30052:74:0;;16043:2:1;30052:74:0;;;16025:21:1;16082:2;16062:18;;;16055:30;16121:34;16101:18;;;16094:62;-1:-1:-1;;;16172:18:1;;;16165:40;16222:19;;30052:74:0;15841:406:1;30052:74:0;-1:-1:-1;;;;;;30144:16:0;;;;;:9;:16;;;;;;;29960:208::o;10174:103::-;9596:6;;-1:-1:-1;;;;;9596:6:0;8327:10;9743:23;9735:68;;;;-1:-1:-1;;;9735:68:0;;;;;;;:::i;:::-;10239:30:::1;10266:1;10239:18;:30::i;:::-;10174:103::o:0;45520:90::-;9596:6;;-1:-1:-1;;;;;9596:6:0;8327:10;9743:23;9735:68;;;;-1:-1:-1;;;9735:68:0;;;;;;;:::i;:::-;45585:9:::1;:17:::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;45585:17:0;;::::1;::::0;;;::::1;::::0;;45520:90::o;46778:100::-;9596:6;;-1:-1:-1;;;;;9596:6:0;8327:10;9743:23;9735:68;;;;-1:-1:-1;;;9735:68:0;;;;;;;:::i;:::-;46849:10:::1;:21:::0;46778:100::o;30705:104::-;30761:13;30794:7;30787:14;;;;;:::i;32389:155::-;32484:52;8327:10;32517:8;32527;32484:18;:52::i;44666:90::-;9596:6;;-1:-1:-1;;;;;9596:6:0;8327:10;9743:23;9735:68;;;;-1:-1:-1;;;9735:68:0;;;;;;;:::i;:::-;44731:11:::1;:17:::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;44731:17:0;;::::1;::::0;;;::::1;::::0;;44666:90::o;33512:328::-;33687:41;8327:10;33720:7;33687:18;:41::i;:::-;33679:103;;;;-1:-1:-1;;;33679:103:0;;;;;;;:::i;:::-;33793:39;33807:4;33813:2;33817:7;33826:5;33793:13;:39::i;:::-;33512:328;;;;:::o;45618:1152::-;9596:6;;-1:-1:-1;;;;;9596:6:0;8327:10;9743:23;9735:68;;;;-1:-1:-1;;;9735:68:0;;;;;;;:::i;:::-;45708:11:::1;::::0;43520:3:::1;::::0;45708:20:::1;::::0;45722:6;;45708:36:::1;:11;:20;:::i;:::-;:36;;;;45686:111;;;::::0;-1:-1:-1;;;45686:111:0;;15264:2:1;45686:111:0::1;::::0;::::1;15246:21:1::0;15303:2;15283:18;;;15276:30;15342:27;15322:18;;;15315:55;15387:18;;45686:111:0::1;15062:349:1::0;45686:111:0::1;45808:11;:21:::0;;45823:6;;45808:11;::::1;::::0;:21:::1;::::0;45823:6;;45808:21:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;45847:9;45842:921;45866:6;45862:10;;:1;:10;45842:921;;;45898:12;::::0;-1:-1:-1;;;45898:12:0;::::1;;;45894:712;;45962:15;45972:1;45975;45962:9;:15::i;:::-;45996:16;:18:::0;;;;::::1;;;::::0;:16:::1;:18;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;45894:712;;;46040:12;::::0;-1:-1:-1;;;46040:12:0;::::1;;;46056:1;46040:17;46036:570;;;46106:15;46116:1;46119::::0;46106:9:::1;:15::i;:::-;46140:18;:20:::0;;;;::::1;;;::::0;:18:::1;:20;::::0;::::1;:::i;46036:570::-;46186:12;::::0;-1:-1:-1;;;46186:12:0;::::1;;;46202:1;46186:17;46182:424;;;46250:15;46260:1;46263;46250:9;:15::i;:::-;46284:16;:18:::0;;-1:-1:-1;;;46284:18:0;::::1;;;::::0;:16:::1;:18;::::0;::::1;:::i;46182:424::-;46328:12;::::0;-1:-1:-1;;;46328:12:0;::::1;;;46344:1;46328:17;46324:282;;;46392:15;46402:1;46405;46392:9;:15::i;:::-;46426:16;:18:::0;;-1:-1:-1;;;46426:18:0;::::1;;;::::0;:16:::1;:18;::::0;::::1;:::i;46324:282::-;46470:12;::::0;-1:-1:-1;;;46470:12:0;::::1;;;46486:1;46470:17;46466:140;;;46536:15;46546:1;46549;46536:9;:15::i;:::-;46570:18;:20:::0;;-1:-1:-1;;;46570:20:0;::::1;;;::::0;:18:::1;:20;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;46466:140;46624:12;::::0;-1:-1:-1;;;46624:12:0;::::1;;;46640:1;46624:17;46620:132;;;46662:12;:16:::0;;-1:-1:-1;;;;46662:16:0::1;::::0;;46620:132:::1;;;46735:1;46719:12;;:17;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;46620:132;45874:3:::0;::::1;::::0;::::1;:::i;:::-;;;;45842:921;;46988:967:::0;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;;;;;;:::i;:::-;1812:1;2543:7;:18;47138:9:::1;::::0;;;::::1;;;47130:47;;;::::0;-1:-1:-1;;;47130:47:0;;12682:2:1;47130:47:0::1;::::0;::::1;12664:21:1::0;12721:2;12701:18;;;12694:30;-1:-1:-1;;;12740:18:1;;;12733:51;12801:18;;47130:47:0::1;12480:345:1::0;47130:47:0::1;47210:24;47226:7;;47210:15;:24::i;:::-;47188:129;;;;-1:-1:-1::0;;;47188:129:0::1;;;;;;;:::i;:::-;47328:12;47370:10;47353:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;47343:39;;;;;;47328:54;;47415:40;47434:5;;47415:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;47441:7:0::1;::::0;;-1:-1:-1;47450:4:0;;-1:-1:-1;47415:18:0::1;:40::i;:::-;47393:117;;;;-1:-1:-1::0;;;47393:117:0::1;;;;;;;:::i;:::-;47521:17;::::0;47549:97:::1;47569:18:::0;;::::1;47549:97;;;47624:7;;47632:1;47624:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;47609:25;::::0;;::::1;:::i;:::-;::::0;-1:-1:-1;47589:3:0;::::1;::::0;::::1;:::i;:::-;;;;47549:97;;;;47690:9;47678:8;;47664:11;:22;;;;;;:::i;:::-;:35;47656:66;;;::::0;-1:-1:-1;;;47656:66:0;;14148:2:1;47656:66:0::1;::::0;::::1;14130:21:1::0;14187:2;14167:18;;;14160:30;-1:-1:-1;;;14206:18:1;;;14199:48;14264:18;;47656:66:0::1;13946:342:1::0;47656:66:0::1;47793:11;::::0;47764:10:::1;47755:20;::::0;;;:8:::1;:20;::::0;;;;;47793:11:::1;-1:-1:-1::0;;;47793:11:0;;::::1;::::0;::::1;::::0;47755:34:::1;::::0;;;::::1;::::0;:20:::1;;:34;:::i;:::-;:49;;;;47733:136;;;;-1:-1:-1::0;;;47733:136:0::1;;;;;;;:::i;:::-;47891:10;47882:20;::::0;;;:8:::1;:20;::::0;;;;:35;;::::1;::::0;::::1;::::0;:20;:35:::1;::::0;;;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;47928:19;47939:7;;47928:10;:19::i;:::-;-1:-1:-1::0;;1768:1:0;2722:7;:22;-1:-1:-1;;;;46988:967:0:o;51041:678::-;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;;;;;;:::i;:::-;1812:1;2543:7;:18;51168:9:::1;::::0;;;::::1;;;51181:1;51168:14;51160:56;;;;-1:-1:-1::0;;;51160:56:0::1;;;;;;;:::i;:::-;51227:17;::::0;51255:141:::1;51275:18:::0;;::::1;51255:141;;;51359:7;;51367:1;51359:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;51344:25:::0;;::::1;::::0;51295:3;::::1;::::0;::::1;:::i;:::-;;;;51255:141;;;;51429:1;51414:11;:16;;;;51406:61;;;::::0;-1:-1:-1;;;51406:61:0;;11102:2:1;51406:61:0::1;::::0;::::1;11084:21:1::0;;;11121:18;;;11114:30;11180:34;11160:18;;;11153:62;11232:18;;51406:61:0::1;10900:356:1::0;51406:61:0::1;51500:24;51516:7;;51500:15;:24::i;:::-;51478:129;;;;-1:-1:-1::0;;;51478:129:0::1;;;;;;;:::i;:::-;51626:30;51637:7;;51646:9;51626:10;:30::i;:::-;51618:61;;;;-1:-1:-1::0;;;51618:61:0::1;;;;;;;:::i;:::-;51692:19;51703:7;;51692:10;:19::i;:::-;-1:-1:-1::0;;1768:1:0;2722:7;:22;-1:-1:-1;51041:678:0:o;45078:289::-;45179:13;45254:1;45236:7;45230:21;;;;;:::i;:::-;;;:25;:129;;;;;;;;;;;;;;;;;45299:7;45308:18;:7;:16;:18::i;:::-;45282:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45210:149;45078:289;-1:-1:-1;;45078:289:0:o;48963:976::-;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;;;;;;:::i;:::-;1812:1;2543:7;:18;;;49117:9:::1;::::0;;;::::1;;;:14;49109:56;;;;-1:-1:-1::0;;;49109:56:0::1;;;;;;;:::i;:::-;49198:24;49214:7;;49198:15;:24::i;:::-;49176:129;;;;-1:-1:-1::0;;;49176:129:0::1;;;;;;;:::i;:::-;49324:30;49335:7;;49344:9;49324:10;:30::i;:::-;49316:61;;;;-1:-1:-1::0;;;49316:61:0::1;;;;;;;:::i;:::-;49388:12;49430:10;49413:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;49403:39;;;;;;49388:54;;49475:43;49494:5;;49475:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;49501:10:0::1;::::0;;-1:-1:-1;49513:4:0;;-1:-1:-1;49475:18:0::1;:43::i;:::-;49453:120;;;;-1:-1:-1::0;;;49453:120:0::1;;;;;;;:::i;:::-;49584:17;::::0;49612:97:::1;49632:18:::0;;::::1;49612:97;;;49687:7;;49695:1;49687:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;49672:25;::::0;;::::1;:::i;:::-;::::0;-1:-1:-1;49652:3:0;::::1;::::0;::::1;:::i;:::-;;;;49612:97;;;-1:-1:-1::0;49779:11:0::1;::::0;49750:10:::1;49741:20;::::0;;;:8:::1;:20;::::0;;;;;49779:11:::1;::::0;;;::::1;::::0;::::1;::::0;49741:34:::1;::::0;;;::::1;::::0;:20:::1;;:34;:::i;:::-;:49;;;;49719:136;;;;-1:-1:-1::0;;;49719:136:0::1;;;;;;;:::i;:::-;49875:10;49866:20;::::0;;;:8:::1;:20;::::0;;;;:35;;::::1;::::0;::::1;::::0;:20;:35:::1;::::0;;;::::1;;;:::i;10432:201::-:0;9596:6;;-1:-1:-1;;;;;9596:6:0;8327:10;9743:23;9735:68;;;;-1:-1:-1;;;9735:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10521:22:0;::::1;10513:73;;;::::0;-1:-1:-1;;;10513:73:0;;11463:2:1;10513:73:0::1;::::0;::::1;11445:21:1::0;11502:2;11482:18;;;11475:30;11541:34;11521:18;;;11514:62;-1:-1:-1;;;11592:18:1;;;11585:36;11638:19;;10513:73:0::1;11261:402:1::0;10513:73:0::1;10597:28;10616:8;10597:18;:28::i;47963:992::-:0;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;;;;;;:::i;:::-;1812:1;2543:7;:18;48117:9:::1;::::0;;;::::1;;;48130:1;48117:14;48109:56;;;;-1:-1:-1::0;;;48109:56:0::1;;;;;;;:::i;:::-;48198:24;48214:7;;48198:15;:24::i;:::-;48176:129;;;;-1:-1:-1::0;;;48176:129:0::1;;;;;;;:::i;:::-;48324:30;48335:7;;48344:9;48324:10;:30::i;:::-;48316:61;;;;-1:-1:-1::0;;;48316:61:0::1;;;;;;;:::i;:::-;48388:12;48430:10;48413:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;48403:39;;;;;;48388:54;;48475:43;48494:5;;48475:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;48501:10:0::1;::::0;;-1:-1:-1;48513:4:0;;-1:-1:-1;48475:18:0::1;:43::i;:::-;48453:120;;;;-1:-1:-1::0;;;48453:120:0::1;;;;;;;:::i;:::-;48586:17;::::0;48614:97:::1;48634:18:::0;;::::1;48614:97;;;48689:7;;48697:1;48689:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;48674:25;::::0;;::::1;:::i;:::-;::::0;-1:-1:-1;48654:3:0;::::1;::::0;::::1;:::i;:::-;;;;48614:97;;;-1:-1:-1::0;48785:15:0::1;::::0;48756:10:::1;48743:24;::::0;;;:12:::1;:24;::::0;;;;;48785:15:::1;::::0;;;::::1;::::0;::::1;::::0;48743:38:::1;::::0;;;::::1;::::0;:24:::1;;:38;:::i;:::-;:57;;;;48721:144;;;;-1:-1:-1::0;;;48721:144:0::1;;;;;;;:::i;:::-;48891:10;48878:24;::::0;;;:12:::1;:24;::::0;;;;:39;;::::1;::::0;::::1;::::0;:24;:39:::1;::::0;;;::::1;;;:::i;39496:174::-:0;39571:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;39571:29:0;-1:-1:-1;;;;;39571:29:0;;;;;;;;:24;;39625:23;39571:24;39625:14;:23::i;:::-;-1:-1:-1;;;;;39616:46:0;;;;;;;;;;;39496:174;;:::o;35644:348::-;35737:4;35439:16;;;:7;:16;;;;;;-1:-1:-1;;;;;35439:16:0;35754:73;;;;-1:-1:-1;;;35754:73:0;;14495:2:1;35754:73:0;;;14477:21:1;14534:2;14514:18;;;14507:30;14573:34;14553:18;;;14546:62;-1:-1:-1;;;14624:18:1;;;14617:42;14676:19;;35754:73:0;14293:408:1;35754:73:0;35838:13;35854:23;35869:7;35854:14;:23::i;:::-;35838:39;;35907:5;-1:-1:-1;;;;;35896:16:0;:7;-1:-1:-1;;;;;35896:16:0;;:52;;;-1:-1:-1;;;;;;32736:25:0;;;32712:4;32736:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;35916:32;35896:87;;;;35976:7;-1:-1:-1;;;;;35952:31:0;:20;35964:7;35952:11;:20::i;:::-;-1:-1:-1;;;;;35952:31:0;;35896:87;35888:96;35644:348;-1:-1:-1;;;;35644:348:0:o;38753:625::-;38912:4;-1:-1:-1;;;;;38885:31:0;:23;38900:7;38885:14;:23::i;:::-;-1:-1:-1;;;;;38885:31:0;;38877:81;;;;-1:-1:-1;;;38877:81:0;;12276:2:1;38877:81:0;;;12258:21:1;12315:2;12295:18;;;12288:30;12354:34;12334:18;;;12327:62;-1:-1:-1;;;12405:18:1;;;12398:35;12450:19;;38877:81:0;12074:401:1;38877:81:0;-1:-1:-1;;;;;38977:16:0;;38969:65;;;;-1:-1:-1;;;38969:65:0;;13389:2:1;38969:65:0;;;13371:21:1;13428:2;13408:18;;;13401:30;13467:34;13447:18;;;13440:62;-1:-1:-1;;;13518:18:1;;;13511:34;13562:19;;38969:65:0;13187:400:1;38969:65:0;39151:29;39168:1;39172:7;39151:8;:29::i;:::-;-1:-1:-1;;;;;39193:15:0;;;;;;:9;:15;;;;;:20;;39212:1;;39193:15;:20;;39212:1;;39193:20;:::i;:::-;;;;-1:-1:-1;;;;;;;39224:13:0;;;;;;:9;:13;;;;;:18;;39241:1;;39224:13;:18;;39241:1;;39224:18;:::i;:::-;;;;-1:-1:-1;;39253:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;39253:21:0;-1:-1:-1;;;;;39253:21:0;;;;;;;;;39292:27;;39253:16;;39292:27;;;;;;;31689:341;31619:411;;:::o;37996:420::-;38056:13;38072:23;38087:7;38072:14;:23::i;:::-;38056:39;;38197:29;38214:1;38218:7;38197:8;:29::i;:::-;-1:-1:-1;;;;;38239:16:0;;;;;;:9;:16;;;;;:21;;38259:1;;38239:16;:21;;38259:1;;38239:21;:::i;:::-;;;;-1:-1:-1;;38278:16:0;;;;:7;:16;;;;;;38271:23;;-1:-1:-1;;;;;;38271:23:0;;;38312:36;38286:7;;38278:16;-1:-1:-1;;;;;38312:36:0;;;;;38278:16;;38312:36;45049:13:::1;44980:90:::0;:::o;51727:698::-;51947:16;;51827:4;;51947:16;;;;;51907:37;43567:2;43417:4;51907:37;:::i;:::-;:56;;;;:::i;:::-;51882:8;;51869:94;;;;;-1:-1:-1;;;51882:8:0;;;;51869:7;;51877:1;51869:10;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:21;;;;;;:::i;:::-;:94;;;;:209;;;;-1:-1:-1;52060:18:0;;;;;;;52020:37;43567:2;43417:4;52020:37;:::i;:::-;:58;;;;:::i;:::-;51993:10;;51980:98;;;;;-1:-1:-1;;;51993:10:0;;;;51980:7;;51988:1;51980:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:23;;;;;;:::i;:::-;:98;;;;51869:209;:320;;;;-1:-1:-1;52173:16:0;;-1:-1:-1;;;52173:16:0;;;;52133:37;43567:2;43417:4;52133:37;:::i;:::-;:56;;;;:::i;:::-;52108:8;;52095:94;;;;;-1:-1:-1;;;52108:8:0;;;;52095:7;;52103:1;52095:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:21;;;;;;:::i;:::-;:94;;;;51869:320;:431;;;;-1:-1:-1;52284:16:0;;-1:-1:-1;;;52284:16:0;;;;52244:37;43567:2;43417:4;52244:37;:::i;:::-;:56;;;;:::i;:::-;52219:8;;52206:94;;;;;-1:-1:-1;;;52219:8:0;;;;52206:7;;52214:1;52206:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:21;;;;;;:::i;:::-;:94;;;;51869:431;:548;;;;-1:-1:-1;52399:18:0;;-1:-1:-1;;;52399:18:0;;;;52357:39;43567:2;43472:3;52357:39;:::i;:::-;:60;;;;:::i;:::-;52330:10;;52317:100;;;;;52330:10;52317:7;;52325:1;52317:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:23;;;;;;:::i;:::-;:100;;;;51869:548;51849:568;51727:698;-1:-1:-1;;;51727:698:0:o;52433:696::-;52543:4;;;;52617:141;52637:18;;;52617:141;;;52721:7;;52729:1;52721:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;52706:25;;;;52657:3;;;;:::i;:::-;;;;52617:141;;;-1:-1:-1;52772:9:0;;;;;;;52785:1;52772:14;52768:320;;;52825:12;;52811:26;;;;;;:::i;:::-;52803:34;;52768:320;;;52859:9;;;;;;;;;:14;52855:233;;;52912:8;;52898:22;;;;;;:::i;52855:233::-;52942:9;;;;;;;52955:1;52942:14;52938:150;;;52995:13;;52981:27;;;;;;:::i;52938:150::-;53063:13;;53049:27;;;;;;:::i;:::-;53041:35;;52938:150;53107:14;;;;52433:696;-1:-1:-1;;;;52433:696:0:o;3979:190::-;4104:4;4157;4128:25;4141:5;4148:4;4128:12;:25::i;:::-;:33;;3979:190;-1:-1:-1;;;;3979:190:0:o;53137:701::-;53202:17;;53230:97;53250:18;;;53230:97;;;53305:7;;53313:1;53305:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;53290:25;;;;:::i;:::-;;-1:-1:-1;53270:3:0;;;;:::i;:::-;;;;53230:97;;;-1:-1:-1;53343:16:0;;;53339:85;;53376:36;;-1:-1:-1;;;53376:36:0;;17999:2:1;53376:36:0;;;17981:21:1;18038:2;18018:18;;;18011:30;18077:28;18057:18;;;18050:56;18123:18;;53376:36:0;17797:350:1;53339:85:0;53453:1;53440:7;;53448:1;53440:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:14;;;53436:71;;;53471:24;53481:1;53484:7;;53492:1;53484:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;53471:9;:24::i;:::-;53534:1;53521:7;;53529:1;53521:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:14;;;53517:71;;;53552:24;53562:1;53565:7;;53573:1;53565:10;;;;;;;:::i;53552:24::-;53615:1;53602:7;;53610:1;53602:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:14;;;53598:71;;;53633:24;53643:1;53646:7;;53654:1;53646:10;;;;;;;:::i;53633:24::-;53696:1;53683:7;;53691:1;53683:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:14;;;53679:71;;;53714:24;53724:1;53727:7;;53735:1;53727:10;;;;;;;:::i;53714:24::-;53777:1;53764:7;;53772:1;53764:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:14;;;53760:71;;;53795:24;53805:1;53808:7;;53816:1;53808:10;;;;;;;:::i;10793:191::-;10886:6;;;-1:-1:-1;;;;;10903:17:0;;;-1:-1:-1;;;;;;10903:17:0;;;;;;;10936:40;;10886:6;;;10903:17;10886:6;;10936:40;;10867:16;;10936:40;10856:128;10793:191;:::o;39812:315::-;39967:8;-1:-1:-1;;;;;39958:17:0;:5;-1:-1:-1;;;;;39958:17:0;;;39950:55;;;;-1:-1:-1;;;39950:55:0;;13794:2:1;39950:55:0;;;13776:21:1;13833:2;13813:18;;;13806:30;13872:27;13852:18;;;13845:55;13917:18;;39950:55:0;13592:349:1;39950:55:0;-1:-1:-1;;;;;40016:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;40016:46:0;;;;;;;;;;40078:41;;9318::1;;;40078::0;;9291:18:1;40078:41:0;;;;;;;39812:315;;;:::o;34722:::-;34879:28;34889:4;34895:2;34899:7;34879:9;:28::i;:::-;34926:48;34949:4;34955:2;34959:7;34968:5;34926:22;:48::i;:::-;34918:111;;;;-1:-1:-1;;;34918:111:0;;;;;;;:::i;53846:1385::-;53912:7;;;53908:1316;;53968:9;53963:190;53987:6;53983:10;;:1;:10;53963:190;;;54052:8;:10;;-1:-1:-1;;;;54052:10:0;;-1:-1:-1;;;54052:10:0;;;;;;;;;;;;;;;;;;;54100:37;;54110:10;;-1:-1:-1;;;54122:14:0;;;;;;;:12;:14;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;54100:37;;:9;:37::i;:::-;53995:3;;;;:::i;:::-;;;;53963:190;;53908:1316;54174:2;:7;;54180:1;54174:7;54170:1054;;;54232:9;54227:194;54251:6;54247:10;;:1;:10;54227:194;;;54316:10;:12;;-1:-1:-1;;;;54316:12:0;;-1:-1:-1;;;54316:12:0;;;;;;;;;;;;;;;;;;;54366:39;;54376:10;;-1:-1:-1;;;54388:16:0;;;;;;;:14;:16;;;:::i;54366:39::-;54259:3;;;;:::i;:::-;;;;54227:194;;54170:1054;54442:2;:7;;54448:1;54442:7;54438:786;;;54498:9;54493:190;54517:6;54513:10;;:1;:10;54493:190;;;54582:8;:10;;-1:-1:-1;;;;54582:10:0;;-1:-1:-1;;;54582:10:0;;;;;;;;;;;;;;;;;;;54630:37;;54640:10;;-1:-1:-1;;;54652:14:0;;;;;;;:12;:14;;;:::i;54630:37::-;54525:3;;;;:::i;:::-;;;;54493:190;;54438:786;54704:2;:7;;54710:1;54704:7;54700:524;;;54760:9;54755:190;54779:6;54775:10;;:1;:10;54755:190;;;54844:8;:10;;-1:-1:-1;;;;54844:10:0;;-1:-1:-1;;;54844:10:0;;;;;;;;;;;;;;;;;;;54892:37;;54902:10;;-1:-1:-1;;;54914:14:0;;;;;;;54844:8;54914:14;;;:::i;54892:37::-;54787:3;;;;:::i;:::-;;;;54755:190;;54700:524;54966:2;:7;;54972:1;54966:7;54962:262;;;55024:9;55019:194;55043:6;55039:10;;:1;:10;55019:194;;;55108:10;:12;;-1:-1:-1;;55108:12:0;;;;;;;;;;;;;;55180:14;:16;;55158:39;;55168:10;;-1:-1:-1;;;55180:16:0;;;;;:14;:16;;;:::i;55158:39::-;55051:3;;;;:::i;:::-;;;;55019:194;;5809:723;5865:13;6086:10;6082:53;;-1:-1:-1;;6113:10:0;;;;;;;;;;;;-1:-1:-1;;;6113:10:0;;;;;5809:723::o;6082:53::-;6160:5;6145:12;6201:78;6208:9;;6201:78;;6234:8;;;;:::i;:::-;;-1:-1:-1;6257:10:0;;-1:-1:-1;6265:2:0;6257:10;;:::i;:::-;;;6201:78;;;6289:19;6321:6;6311:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6311:17:0;;6289:39;;6339:154;6346:10;;6339:154;;6373:11;6383:1;6373:11;;:::i;:::-;;-1:-1:-1;6442:10:0;6450:2;6442:5;:10;:::i;:::-;6429:24;;:2;:24;:::i;:::-;6416:39;;6399:6;6406;6399:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;6399:56:0;;;;;;;;-1:-1:-1;6470:11:0;6479:2;6470:11;;:::i;:::-;;;6339:154;;4530:675;4613:7;4656:4;4613:7;4671:497;4695:5;:12;4691:1;:16;4671:497;;;4729:20;4752:5;4758:1;4752:8;;;;;;;;:::i;:::-;;;;;;;4729:31;;4795:12;4779;:28;4775:382;;5281:13;5331:15;;;5367:4;5360:15;;;5414:4;5398:21;;4907:57;;4775:382;;;5281:13;5331:15;;;5367:4;5360:15;;;5414:4;5398:21;;5084:57;;4775:382;-1:-1:-1;4709:3:0;;;;:::i;:::-;;;;4671:497;;;-1:-1:-1;5185:12:0;4530:675;-1:-1:-1;;;4530:675:0:o;40692:799::-;40847:4;-1:-1:-1;;;;;40868:13:0;;12519:19;:23;40864:620;;40904:72;;-1:-1:-1;;;40904:72:0;;-1:-1:-1;;;;;40904:36:0;;;;;:72;;8327:10;;40955:4;;40961:7;;40970:5;;40904:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40904:72:0;;;;;;;;-1:-1:-1;;40904:72:0;;;;;;;;;;;;:::i;:::-;;;40900:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41146:13:0;;41142:272;;41189:60;;-1:-1:-1;;;41189:60:0;;;;;;;:::i;41142:272::-;41364:6;41358:13;41349:6;41345:2;41341:15;41334:38;40900:529;-1:-1:-1;;;;;;41027:51:0;-1:-1:-1;;;41027:51:0;;-1:-1:-1;41020:58:0;;40864:620;-1:-1:-1;41468:4:0;40692:799;;;;;;:::o;36334:110::-;36410:26;36420:2;36424:7;36410:26;;;;;;;;;;;;36801:18;36807:2;36811:7;36801:5;:18::i;:::-;36852:54;36883:1;36887:2;36891:7;36900:5;36852:22;:54::i;:::-;36830:154;;;;-1:-1:-1;;;36830:154:0;;;;;;;:::i;37328:439::-;-1:-1:-1;;;;;37408:16:0;;37400:61;;;;-1:-1:-1;;;37400:61:0;;16864:2:1;37400:61:0;;;16846:21:1;;;16883:18;;;16876:30;16942:34;16922:18;;;16915:62;16994:18;;37400:61:0;16662:356:1;37400:61:0;35415:4;35439:16;;;:7;:16;;;;;;-1:-1:-1;;;;;35439:16:0;:30;37472:58;;;;-1:-1:-1;;;37472:58:0;;13032:2:1;37472:58:0;;;13014:21:1;13071:2;13051:18;;;13044:30;13110;13090:18;;;13083:58;13158:18;;37472:58:0;12830:352:1;37472:58:0;-1:-1:-1;;;;;37601:13:0;;;;;;:9;:13;;;;;:18;;37618:1;;37601:13;:18;;37618:1;;37601:18;:::i;:::-;;;;-1:-1:-1;;37630:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;37630:21:0;-1:-1:-1;;;;;37630:21:0;;;;;;;;37669:33;;37630:16;;;37669:33;;37630:16;;37669:33;45049:13:::1;44980:90:::0;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:367::-;891:8;901:6;955:3;948:4;940:6;936:17;932:27;922:55;;973:1;970;963:12;922:55;-1:-1:-1;996:20:1;;1039:18;1028:30;;1025:50;;;1071:1;1068;1061:12;1025:50;1108:4;1100:6;1096:17;1084:29;;1168:3;1161:4;1151:6;1148:1;1144:14;1136:6;1132:27;1128:38;1125:47;1122:67;;;1185:1;1182;1175:12;1122:67;828:367;;;;;:::o;1200:186::-;1259:6;1312:2;1300:9;1291:7;1287:23;1283:32;1280:52;;;1328:1;1325;1318:12;1280:52;1351:29;1370:9;1351:29;:::i;1391:260::-;1459:6;1467;1520:2;1508:9;1499:7;1495:23;1491:32;1488:52;;;1536:1;1533;1526:12;1488:52;1559:29;1578:9;1559:29;:::i;:::-;1549:39;;1607:38;1641:2;1630:9;1626:18;1607:38;:::i;:::-;1597:48;;1391:260;;;;;:::o;1656:328::-;1733:6;1741;1749;1802:2;1790:9;1781:7;1777:23;1773:32;1770:52;;;1818:1;1815;1808:12;1770:52;1841:29;1860:9;1841:29;:::i;:::-;1831:39;;1889:38;1923:2;1912:9;1908:18;1889:38;:::i;:::-;1879:48;;1974:2;1963:9;1959:18;1946:32;1936:42;;1656:328;;;;;:::o;1989:666::-;2084:6;2092;2100;2108;2161:3;2149:9;2140:7;2136:23;2132:33;2129:53;;;2178:1;2175;2168:12;2129:53;2201:29;2220:9;2201:29;:::i;:::-;2191:39;;2249:38;2283:2;2272:9;2268:18;2249:38;:::i;:::-;2239:48;;2334:2;2323:9;2319:18;2306:32;2296:42;;2389:2;2378:9;2374:18;2361:32;2416:18;2408:6;2405:30;2402:50;;;2448:1;2445;2438:12;2402:50;2471:22;;2524:4;2516:13;;2512:27;-1:-1:-1;2502:55:1;;2553:1;2550;2543:12;2502:55;2576:73;2641:7;2636:2;2623:16;2618:2;2614;2610:11;2576:73;:::i;:::-;2566:83;;;1989:666;;;;;;;:::o;2660:347::-;2725:6;2733;2786:2;2774:9;2765:7;2761:23;2757:32;2754:52;;;2802:1;2799;2792:12;2754:52;2825:29;2844:9;2825:29;:::i;:::-;2815:39;;2904:2;2893:9;2889:18;2876:32;2951:5;2944:13;2937:21;2930:5;2927:32;2917:60;;2973:1;2970;2963:12;2917:60;2996:5;2986:15;;;2660:347;;;;;:::o;3012:254::-;3080:6;3088;3141:2;3129:9;3120:7;3116:23;3112:32;3109:52;;;3157:1;3154;3147:12;3109:52;3180:29;3199:9;3180:29;:::i;:::-;3170:39;3256:2;3241:18;;;;3228:32;;-1:-1:-1;;;3012:254:1:o;3271:771::-;3391:6;3399;3407;3415;3468:2;3456:9;3447:7;3443:23;3439:32;3436:52;;;3484:1;3481;3474:12;3436:52;3524:9;3511:23;3553:18;3594:2;3586:6;3583:14;3580:34;;;3610:1;3607;3600:12;3580:34;3649:70;3711:7;3702:6;3691:9;3687:22;3649:70;:::i;:::-;3738:8;;-1:-1:-1;3623:96:1;-1:-1:-1;3826:2:1;3811:18;;3798:32;;-1:-1:-1;3842:16:1;;;3839:36;;;3871:1;3868;3861:12;3839:36;;3910:72;3974:7;3963:8;3952:9;3948:24;3910:72;:::i;:::-;3271:771;;;;-1:-1:-1;4001:8:1;-1:-1:-1;;;;3271:771:1:o;4047:435::-;4131:6;4139;4192:2;4180:9;4171:7;4167:23;4163:32;4160:52;;;4208:1;4205;4198:12;4160:52;4248:9;4235:23;4281:18;4273:6;4270:30;4267:50;;;4313:1;4310;4303:12;4267:50;4352:70;4414:7;4405:6;4394:9;4390:22;4352:70;:::i;:::-;4441:8;;4326:96;;-1:-1:-1;4047:435:1;-1:-1:-1;;;;4047:435:1:o;4487:180::-;4546:6;4599:2;4587:9;4578:7;4574:23;4570:32;4567:52;;;4615:1;4612;4605:12;4567:52;-1:-1:-1;4638:23:1;;4487:180;-1:-1:-1;4487:180:1:o;4672:245::-;4730:6;4783:2;4771:9;4762:7;4758:23;4754:32;4751:52;;;4799:1;4796;4789:12;4751:52;4838:9;4825:23;4857:30;4881:5;4857:30;:::i;4922:249::-;4991:6;5044:2;5032:9;5023:7;5019:23;5015:32;5012:52;;;5060:1;5057;5050:12;5012:52;5092:9;5086:16;5111:30;5135:5;5111:30;:::i;5176:450::-;5245:6;5298:2;5286:9;5277:7;5273:23;5269:32;5266:52;;;5314:1;5311;5304:12;5266:52;5354:9;5341:23;5387:18;5379:6;5376:30;5373:50;;;5419:1;5416;5409:12;5373:50;5442:22;;5495:4;5487:13;;5483:27;-1:-1:-1;5473:55:1;;5524:1;5521;5514:12;5473:55;5547:73;5612:7;5607:2;5594:16;5589:2;5585;5581:11;5547:73;:::i;5631:272::-;5689:6;5742:2;5730:9;5721:7;5717:23;5713:32;5710:52;;;5758:1;5755;5748:12;5710:52;5797:9;5784:23;5847:6;5840:5;5836:18;5829:5;5826:29;5816:57;;5869:1;5866;5859:12;6093:269;6150:6;6203:2;6191:9;6182:7;6178:23;6174:32;6171:52;;;6219:1;6216;6209:12;6171:52;6258:9;6245:23;6308:4;6301:5;6297:16;6290:5;6287:27;6277:55;;6328:1;6325;6318:12;6367:257;6408:3;6446:5;6440:12;6473:6;6468:3;6461:19;6489:63;6545:6;6538:4;6533:3;6529:14;6522:4;6515:5;6511:16;6489:63;:::i;:::-;6606:2;6585:15;-1:-1:-1;;6581:29:1;6572:39;;;;6613:4;6568:50;;6367:257;-1:-1:-1;;6367:257:1:o;6629:185::-;6671:3;6709:5;6703:12;6724:52;6769:6;6764:3;6757:4;6750:5;6746:16;6724:52;:::i;:::-;6792:16;;;;;6629:185;-1:-1:-1;;6629:185:1:o;6937:229::-;7086:2;7082:15;;;;-1:-1:-1;;7078:53:1;7066:66;;7157:2;7148:12;;6937:229::o;7171:1301::-;7448:3;7477:1;7510:6;7504:13;7540:3;7562:1;7590:9;7586:2;7582:18;7572:28;;7650:2;7639:9;7635:18;7672;7662:61;;7716:4;7708:6;7704:17;7694:27;;7662:61;7742:2;7790;7782:6;7779:14;7759:18;7756:38;7753:165;;;-1:-1:-1;;;7817:33:1;;7873:4;7870:1;7863:15;7903:4;7824:3;7891:17;7753:165;7934:18;7961:104;;;;8079:1;8074:320;;;;7927:467;;7961:104;-1:-1:-1;;7994:24:1;;7982:37;;8039:16;;;;-1:-1:-1;7961:104:1;;8074:320;20810:1;20803:14;;;20847:4;20834:18;;8169:1;8183:165;8197:6;8194:1;8191:13;8183:165;;;8275:14;;8262:11;;;8255:35;8318:16;;;;8212:10;;8183:165;;;8187:3;;8377:6;8372:3;8368:16;8361:23;;7927:467;;;;;;;8410:56;8435:30;8461:3;8453:6;8435:30;:::i;:::-;-1:-1:-1;;;6879:20:1;;6924:1;6915:11;;6819:113;8410:56;8403:63;7171:1301;-1:-1:-1;;;;;7171:1301:1:o;8685:488::-;-1:-1:-1;;;;;8954:15:1;;;8936:34;;9006:15;;9001:2;8986:18;;8979:43;9053:2;9038:18;;9031:34;;;9101:3;9096:2;9081:18;;9074:31;;;8879:4;;9122:45;;9147:19;;9139:6;9122:45;:::i;:::-;9114:53;8685:488;-1:-1:-1;;;;;;8685:488:1:o;9552:219::-;9701:2;9690:9;9683:21;9664:4;9721:44;9761:2;9750:9;9746:18;9738:6;9721:44;:::i;9776:353::-;9978:2;9960:21;;;10017:2;9997:18;;;9990:30;10056:31;10051:2;10036:18;;10029:59;10120:2;10105:18;;9776:353::o;10134:342::-;10336:2;10318:21;;;10375:2;10355:18;;;10348:30;-1:-1:-1;;;10409:2:1;10394:18;;10387:48;10467:2;10452:18;;10134:342::o;10481:414::-;10683:2;10665:21;;;10722:2;10702:18;;;10695:30;10761:34;10756:2;10741:18;;10734:62;-1:-1:-1;;;10827:2:1;10812:18;;10805:48;10885:3;10870:19;;10481:414::o;11668:401::-;11870:2;11852:21;;;11909:2;11889:18;;;11882:30;11948:34;11943:2;11928:18;;11921:62;-1:-1:-1;;;12014:2:1;11999:18;;11992:35;12059:3;12044:19;;11668:401::o;14706:351::-;14908:2;14890:21;;;14947:2;14927:18;;;14920:30;14986:29;14981:2;14966:18;;14959:57;15048:2;15033:18;;14706:351::o;17436:356::-;17638:2;17620:21;;;17657:18;;;17650:30;17716:34;17711:2;17696:18;;17689:62;17783:2;17768:18;;17436:356::o;18554:419::-;18756:2;18738:21;;;18795:2;18775:18;;;18768:30;18834:34;18829:2;18814:18;;18807:62;18905:25;18900:2;18885:18;;18878:53;18963:3;18948:19;;18554:419::o;18978:413::-;19180:2;19162:21;;;19219:2;19199:18;;;19192:30;19258:34;19253:2;19238:18;;19231:62;-1:-1:-1;;;19324:2:1;19309:18;;19302:47;19381:3;19366:19;;18978:413::o;19396:355::-;19598:2;19580:21;;;19637:2;19617:18;;;19610:30;19676:33;19671:2;19656:18;;19649:61;19742:2;19727:18;;19396:355::o;20863:224::-;20902:3;20930:6;20963:2;20960:1;20956:10;20993:2;20990:1;20986:10;21024:3;21020:2;21016:12;21011:3;21008:21;21005:47;;;21032:18;;:::i;:::-;21068:13;;20863:224;-1:-1:-1;;;;20863:224:1:o;21092:128::-;21132:3;21163:1;21159:6;21156:1;21153:13;21150:39;;;21169:18;;:::i;:::-;-1:-1:-1;21205:9:1;;21092:128::o;21225:204::-;21263:3;21299:4;21296:1;21292:12;21331:4;21328:1;21324:12;21366:3;21360:4;21356:14;21351:3;21348:23;21345:49;;;21374:18;;:::i;:::-;21410:13;;21225:204;-1:-1:-1;;;21225:204:1:o;21434:120::-;21474:1;21500;21490:35;;21505:18;;:::i;:::-;-1:-1:-1;21539:9:1;;21434:120::o;21559:168::-;21599:7;21665:1;21661;21657:6;21653:14;21650:1;21647:21;21642:1;21635:9;21628:17;21624:45;21621:71;;;21672:18;;:::i;:::-;-1:-1:-1;21712:9:1;;21559:168::o;21732:217::-;21771:4;21800:6;21856:10;;;;21826;;21878:12;;;21875:38;;;21893:18;;:::i;:::-;21930:13;;21732:217;-1:-1:-1;;;21732:217:1:o;21954:125::-;21994:4;22022:1;22019;22016:8;22013:34;;;22027:18;;:::i;:::-;-1:-1:-1;22064:9:1;;21954:125::o;22084:258::-;22156:1;22166:113;22180:6;22177:1;22174:13;22166:113;;;22256:11;;;22250:18;22237:11;;;22230:39;22202:2;22195:10;22166:113;;;22297:6;22294:1;22291:13;22288:48;;;-1:-1:-1;;22332:1:1;22314:16;;22307:27;22084:258::o;22347:380::-;22426:1;22422:12;;;;22469;;;22490:61;;22544:4;22536:6;22532:17;22522:27;;22490:61;22597:2;22589:6;22586:14;22566:18;22563:38;22560:161;;;22643:10;22638:3;22634:20;22631:1;22624:31;22678:4;22675:1;22668:15;22706:4;22703:1;22696:15;22560:161;;22347:380;;;:::o;22732:197::-;22770:3;22798:6;22839:2;22832:5;22828:14;22866:2;22857:7;22854:15;22851:41;;;22872:18;;:::i;:::-;22921:1;22908:15;;22732:197;-1:-1:-1;;;22732:197:1:o;22934:135::-;22973:3;-1:-1:-1;;22994:17:1;;22991:43;;;23014:18;;:::i;:::-;-1:-1:-1;23061:1:1;23050:13;;22934:135::o;23074:112::-;23106:1;23132;23122:35;;23137:18;;:::i;:::-;-1:-1:-1;23171:9:1;;23074:112::o;23191:127::-;23252:10;23247:3;23243:20;23240:1;23233:31;23283:4;23280:1;23273:15;23307:4;23304:1;23297:15;23323:127;23384:10;23379:3;23375:20;23372:1;23365:31;23415:4;23412:1;23405:15;23439:4;23436:1;23429:15;23455:127;23516:10;23511:3;23507:20;23504:1;23497:31;23547:4;23544:1;23537:15;23571:4;23568:1;23561:15;23587:127;23648:10;23643:3;23639:20;23636:1;23629:31;23679:4;23676:1;23669:15;23703:4;23700:1;23693:15;23719:131;-1:-1:-1;;;;;;23793:32:1;;23783:43;;23773:71;;23840:1;23837;23830:12

Swarm Source

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