ETH Price: $2,570.06 (+1.15%)

Token

Degen Donny (DONNY)
 

Overview

Max Total Supply

704 DONNY

Holders

93

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 DONNY
0xd1d9feb0567e55a50369840c5edb36e7016c69c2
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
MintableNFT

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-21
*/

// 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/Strings.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

// 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 (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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


// OpenZeppelin Contracts (last updated v4.7.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
                /// @solidity memory-safe-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.7.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 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/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/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.7.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: address zero is not a valid owner");
        return _balances[owner];
    }

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;



/**
 * @dev ERC721 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC721Pausable is ERC721, Pausable {
    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        require(!paused(), "ERC721Pausable: token transfer while paused");
    }
}

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


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev See {ERC721-_burn}. This override additionally checks to see if a
     * token-specific URI was set for the token, and if so, it deletes the token URI from
     * the storage mapping.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

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


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: nft.sol



pragma solidity ^0.8.4;













interface ILending {

    function mint(uint mintAmount) external returns (uint);

    function redeem(uint redeemTokens) external returns (uint);

    function borrow(uint borrowAmount) external returns (uint);

    function repayBorrow(uint repayAmount) external returns (uint);

    function borrowBalanceCurrent(address account) external returns (uint);

    function balanceOf(address owner) external view returns (uint);

}



interface IComptroller {

    function enterMarkets(address[] calldata cTokens) external returns (uint[] memory);

}



contract Whitelist is Ownable {

    mapping(address => bool) public whitelist;



    event WhitelistedAddressAdded(address addr);

    event WhitelistedAddressRemoved(address addr);



    modifier onlyWhitelisted() {

        require(whitelist[msg.sender], 'no whitelist');

        _;

    }



    function addAddressToWhitelist(address addr) onlyOwner public returns(bool success) {

        if (!whitelist[addr]) {

            whitelist[addr] = true;

            emit WhitelistedAddressAdded(addr);

            success = true;

        }

    }



    function addAddressesToWhitelist(address[] memory addrs) onlyOwner public returns(bool success) {

        for (uint256 i = 0; i < addrs.length; i++) {

            if (addAddressToWhitelist(addrs[i])) {

                success = true;

            }

        }

        return success;

    }



    function removeAddressFromWhitelist(address addr) onlyOwner public returns(bool success) {

        if (whitelist[addr]) {

            whitelist[addr] = false;

            emit WhitelistedAddressRemoved(addr);

            success = true;

        }

        return success;

    }



    function removeAddressesFromWhitelist(address[] memory addrs) onlyOwner public returns(bool success) {

        for (uint256 i = 0; i < addrs.length; i++) {

            if (removeAddressFromWhitelist(addrs[i])) {

                success = true;

            }

        }

        return success;

    }

}



contract FeeSplitter is Whitelist {

    using SafeMath for uint256;



    /////////////////////////////////

    // CONFIGURABLES AND VARIABLES //

    /////////////////////////////////



    mapping (IERC20 => address[]) public feeCollectors;

    mapping (IERC20 => uint256[]) public feeRates;



    //////////////////////////////

    // CONSTRUCTOR AND FALLBACK //

    //////////////////////////////

    

    constructor(address _dev) {

        transferOwnership(_dev);

    }

    

    // FALLBACK FUNCTION: PAYABLE

    receive () external payable {

        

    }



    // Distribute collected fees between all set collectors, at set rates

    function distribute(IERC20 token) public {

        uint256 balance = token.balanceOf(address(this));

        require (balance > 0, "Nothing to pay");



        address[] memory collectors = feeCollectors[token];

        uint256[] memory rates = feeRates[token];



        for (uint256 i = 0; i < collectors.length; i++) {

            address collector = collectors[i];

            uint256 rate = rates[i];



            if (rate > 0) {

                uint256 feeAmount = rate * balance / 10000;

                token.transfer(collector, feeAmount);

            }

        }

    }



    ////////////////////////////////////////////////

    // FUNCTIONS RESTRICTED TO THE CONTRACT OWNER //

    ////////////////////////////////////////////////



    // Set collectors and rates for a token

    function setDistribution(IERC20 token, address[] memory collectors, uint256[] memory rates) onlyWhitelisted() public {



        uint256 totalRate;



        for (uint256 i = 0; i < rates.length; i++) {

            totalRate = totalRate + rates[i];

        }



        require (totalRate == 10000, "Total fee rate must be 100%");

        

        if (token.balanceOf(address(this)) > 0) {

            distribute(token);

        }



        feeCollectors[token] = collectors;

        feeRates[token] = rates;

    }

}



contract MintableNFT is ERC721, ERC721Enumerable, ERC721URIStorage, ERC721Pausable, Whitelist, ReentrancyGuard {

    using SafeMath for uint256;

    using Strings for uint256;

    using Counters for Counters.Counter;



    Counters.Counter private _tokenIds;



    ///////////////////////////////

    // CONFIGURABLES & VARIABLES //

    ///////////////////////////////



    IERC20 public token;



    address public feeSplitter;



    bool public initialMinted;



    string public baseURI;

    string public baseExtension = ".json";



    uint8 public mintablePerUser;

    uint8 public reservedItems;



    uint256 public itemPrice;

    uint256 public maxMintableItems;



    mapping(address => uint256) public mintedTotalOf;



    /////////////////////

    // CONTRACT EVENTS //

    /////////////////////



    event onMintItem(address indexed recipient, uint256 itemId, uint256 timestamp);

    event onLaunch(address indexed caller, address indexed recipient, uint256 timestamp);



    ////////////////////////////

    // CONSTRUCTOR & FALLBACK //

    ////////////////////////////



    constructor(

        string memory _name,

        string memory _symbol,

        address _token, 

        uint8 _reservedItems, 

        uint8 _mintablePerUser,

        uint256 _maxMintableItems, 

        uint256 _pricePerItem,

        string memory _uri

    ) ERC721(_name, _symbol) {



        feeSplitter = address(new FeeSplitter(msg.sender));



        addAddressToWhitelist(address(0));

        addAddressToWhitelist(msg.sender);



        _tokenIds.increment();



        token = IERC20(_token);



        itemPrice = _pricePerItem;

        reservedItems = _reservedItems;

        mintablePerUser = _mintablePerUser;

        maxMintableItems = _maxMintableItems;



        baseURI = _uri;

    }



    ////////////////////////////

    // PUBLIC WRITE FUNCTIONS //

    ////////////////////////////



    // Mint an NFT, paying Wrapped Ether

    function mintItem() external nonReentrant whenNotPaused returns (uint256 _id) {

        require(initialMinted == true, "ONLY_WHEN_LAUNCHED");



        // Find Total Supply of NFTs

        uint256 supply = totalSupply();

        require(supply + 1 <= maxMintableItems, "NFT::LIMIT_REACHED");



        // Set Recipient of item

        address _recipient = msg.sender;



        // If the caller is not a whitelisted address

        if (!whitelist[_recipient]) {



            // Require payment of the mint fee

            require(token.transferFrom(msg.sender, address(feeSplitter), itemPrice), "MUST_PAY_MINT_FEE");



            // Enforce item limits

            require(mintedTotalOf[_recipient] + 1 <= mintablePerUser, "MINT_MAX_REACHED");

            

            // Increase minted count for minter

            mintedTotalOf[_recipient]++;

        }



        // Get the item ID as it is minted

        uint256 _itemId = mintItem(_recipient);



        // Let 'em know!

        emit onMintItem(_recipient, _itemId, block.timestamp);

        return _itemId;

    }



    //////////////////////////

    // RESTRICTED FUNCTIONS //

    //////////////////////////



    // OWNER: Launch the NFTs

    function launch() public onlyOwner returns (bool _success) {

        require(initialMinted == false, "ONLY_ONCE_ALLOWED");



        address _addr = msg.sender;



        // Mint the reserved items to the DAO wallet

        for(uint i = 0; i < reservedItems; i++){

            mintItem(_addr);

        }



        // Mark function used

        initialMinted = true;



        // Let 'em know!

        emit onLaunch(_addr, _addr, block.timestamp);

        return true;

    }



    function setMintPrice(uint256 _amount) public onlyOwner returns (bool _success) {

        require(_amount > 0, "INVALID_AMOUNT");



        itemPrice = _amount;



        return true;

    }



    // OWNER: Set Base URI

    function setBaseURI(string memory _newBaseURI) public onlyOwner {

        baseURI = _newBaseURI;

    }



    // OWNER: Set URI Extension

    function setURIExtension(string memory _newExtension) public onlyOwner {

        baseExtension = _newExtension;

    }



    // OWNER: Pause minting

    function pause() public onlyOwner {

        _pause();

    }



    // OWNER: Unpause minting

    function unpause() public onlyOwner {

        _unpause();

    }



    ///////////////////////////

    // PUBLIC VIEW FUNCTIONS //

    ///////////////////////////



    // Next Mintable Item's tokenId

    function nextItem() public view returns (uint256) {

        return (_tokenIds.current());

    }



    // Get mintable items remaining

    function remainingItems() public view returns (uint256) {

        return (maxMintableItems - totalSupply());

    }



    // Wallet of NFT Holder

    function itemsOf(address _owner) public view returns (uint256[] memory) {

        uint256 ownerTokenCount = balanceOf(_owner);

        uint256[] memory tokenIds = new uint256[](ownerTokenCount);

        

        for (uint256 i; i < ownerTokenCount; i++) {

            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);

        }



        return tokenIds;

    }



    // Token URI by Item ID

    function tokenURI(uint256 tokenId) public view virtual override(ERC721, ERC721URIStorage) returns (string memory) {

        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");



        string memory currentBaseURI = _baseURI();

    

        return bytes(currentBaseURI).length > 0

            ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))

            : "";

    }



    //////////////////////////////////

    // INTERNAL & PRIVATE FUNCTIONS //

    //////////////////////////////////



    // Mint NFT item into collection, providing conditions are met

    function mintItem(address to) internal returns (uint256 tokenId) {

        tokenId = _tokenIds.current();



        // Increment token ids

        _tokenIds.increment();

        

        // Mint item

        _safeMint(to, tokenId);

    }



    ////////////////////////

    // OVERRIDE FUNCTIONS //

    ////////////////////////



    function _baseURI() internal view virtual override returns (string memory) {

        return baseURI;

    }



    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {

        super._burn(tokenId);

    }



    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable, ERC721Pausable) {

        super._beforeTokenTransfer(from, to, tokenId);

    }



    function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) {

        return super.supportsInterface(interfaceId);

    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint8","name":"_reservedItems","type":"uint8"},{"internalType":"uint8","name":"_mintablePerUser","type":"uint8"},{"internalType":"uint256","name":"_maxMintableItems","type":"uint256"},{"internalType":"uint256","name":"_pricePerItem","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"WhitelistedAddressAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"WhitelistedAddressRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"onLaunch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"itemId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"onMintItem","type":"event"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"addAddressToWhitelist","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"addAddressesToWhitelist","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeSplitter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"itemPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"itemsOf","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launch","outputs":[{"internalType":"bool","name":"_success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxMintableItems","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintItem","outputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintablePerUser","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedTotalOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextItem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"remainingItems","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"removeAddressFromWhitelist","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"removeAddressesFromWhitelist","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedItems","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMintPrice","outputs":[{"internalType":"bool","name":"_success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newExtension","type":"string"}],"name":"setURIExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250601290816200004a919062000769565b503480156200005857600080fd5b50604051620077fe380380620077fe83398181016040528101906200007e919062000a88565b8787816000908162000091919062000769565b508060019081620000a3919062000769565b5050506000600b60006101000a81548160ff021916908315150217905550620000e1620000d56200024360201b60201c565b6200024b60201b60201c565b6001600d8190555033604051620000f890620004e1565b62000104919062000bbf565b604051809103906000f08015801562000121573d6000803e3d6000fd5b50601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200017460006200031160201b60201c565b5062000186336200031160201b60201c565b506200019e600e6200041060201b62001bd31760201c565b85600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160148190555084601360016101000a81548160ff021916908360ff16021790555083601360006101000a81548160ff021916908360ff16021790555082601581905550806011908162000234919062000769565b50505050505050505062000c5f565b600033905090565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000620003236200042660201b60201c565b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166200040b576001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fd1bba68c128cc3f427e5831b3c6f99f480b6efa6b9e80c757768f6124158cc3f82604051620003fe919062000bbf565b60405180910390a1600190505b919050565b6001816000016000828254019250508190555050565b620004366200024360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200045c620004b760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620004b5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004ac9062000c3d565b60405180910390fd5b565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611d088062005af683390190565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200057157607f821691505b60208210810362000587576200058662000529565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005f17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620005b2565b620005fd8683620005b2565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200064a620006446200063e8462000615565b6200061f565b62000615565b9050919050565b6000819050919050565b620006668362000629565b6200067e620006758262000651565b848454620005bf565b825550505050565b600090565b6200069562000686565b620006a28184846200065b565b505050565b5b81811015620006ca57620006be6000826200068b565b600181019050620006a8565b5050565b601f8211156200071957620006e3816200058d565b620006ee84620005a2565b81016020851015620006fe578190505b620007166200070d85620005a2565b830182620006a7565b50505b505050565b600082821c905092915050565b60006200073e600019846008026200071e565b1980831691505092915050565b60006200075983836200072b565b9150826002028217905092915050565b6200077482620004ef565b67ffffffffffffffff81111562000790576200078f620004fa565b5b6200079c825462000558565b620007a9828285620006ce565b600060209050601f831160018114620007e15760008415620007cc578287015190505b620007d885826200074b565b86555062000848565b601f198416620007f1866200058d565b60005b828110156200081b57848901518255600182019150602085019450602081019050620007f4565b868310156200083b578489015162000837601f8916826200072b565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6200088a826200086e565b810181811067ffffffffffffffff82111715620008ac57620008ab620004fa565b5b80604052505050565b6000620008c162000850565b9050620008cf82826200087f565b919050565b600067ffffffffffffffff821115620008f257620008f1620004fa565b5b620008fd826200086e565b9050602081019050919050565b60005b838110156200092a5780820151818401526020810190506200090d565b60008484015250505050565b60006200094d6200094784620008d4565b620008b5565b9050828152602081018484840111156200096c576200096b62000869565b5b620009798482856200090a565b509392505050565b600082601f83011262000999576200099862000864565b5b8151620009ab84826020860162000936565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620009e182620009b4565b9050919050565b620009f381620009d4565b8114620009ff57600080fd5b50565b60008151905062000a1381620009e8565b92915050565b600060ff82169050919050565b62000a318162000a19565b811462000a3d57600080fd5b50565b60008151905062000a518162000a26565b92915050565b62000a628162000615565b811462000a6e57600080fd5b50565b60008151905062000a828162000a57565b92915050565b600080600080600080600080610100898b03121562000aac5762000aab6200085a565b5b600089015167ffffffffffffffff81111562000acd5762000acc6200085f565b5b62000adb8b828c0162000981565b985050602089015167ffffffffffffffff81111562000aff5762000afe6200085f565b5b62000b0d8b828c0162000981565b975050604062000b208b828c0162000a02565b965050606062000b338b828c0162000a40565b955050608062000b468b828c0162000a40565b94505060a062000b598b828c0162000a71565b93505060c062000b6c8b828c0162000a71565b92505060e089015167ffffffffffffffff81111562000b905762000b8f6200085f565b5b62000b9e8b828c0162000981565b9150509295985092959890939650565b62000bb981620009d4565b82525050565b600060208201905062000bd6600083018462000bae565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000c2560208362000bdc565b915062000c328262000bed565b602082019050919050565b6000602082019050818103600083015262000c588162000c16565b9050919050565b614e878062000c6f6000396000f3fe608060405234801561001057600080fd5b506004361061027f5760003560e01c806370a082311161015c578063a22cb465116100ce578063e2ec6ec311610087578063e2ec6ec3146107b6578063e985e9c5146107e6578063eb93406b14610816578063f2fde38b14610834578063f4a0a52814610850578063fc0c546a146108805761027f565b8063a22cb465146106f4578063b88d4fde14610710578063c66828621461072c578063c87b56dd1461074a578063ca1c4de91461077a578063dac6db1c146107985761027f565b80638da5cb5b116101205780638da5cb5b14610630578063907097511461064e578063951d3bc91461066a57806395d89b41146106885780639a691d5b146106a65780639b19251a146106c45761027f565b806370a082311461058c578063715018a6146105bc5780637231a876146105c65780637b9417c8146105f65780638456cb59146106265761027f565b80633740b648116101f557806355f804b3116101b957806355f804b3146104c85780635c975abb146104e45780636052970c146105025780636352211e14610520578063685158b1146105505780636c0360eb1461056e5761027f565b80633740b648146104245780633f4ba83a1461044257806342842e0e1461044c5780634432fcd5146104685780634f6ccce7146104985761027f565b806318160ddd1161024757806318160ddd1461033c5780631fd37db31461035a57806323b872dd1461037857806324953eaa14610394578063286dd3f5146103c45780632f745c59146103f45761027f565b806301339c211461028457806301ffc9a7146102a257806306fdde03146102d2578063081812fc146102f0578063095ea7b314610320575b600080fd5b61028c61089e565b604051610299919061314f565b60405180910390f35b6102bc60048036038101906102b791906131d6565b6109c6565b6040516102c9919061314f565b60405180910390f35b6102da6109d8565b6040516102e79190613293565b60405180910390f35b61030a600480360381019061030591906132eb565b610a6a565b6040516103179190613359565b60405180910390f35b61033a600480360381019061033591906133a0565b610ab0565b005b610344610bc7565b60405161035191906133ef565b60405180910390f35b610362610bd4565b60405161036f91906133ef565b60405180910390f35b610392600480360381019061038d919061340a565b610bf0565b005b6103ae60048036038101906103a991906135a5565b610c50565b6040516103bb919061314f565b60405180910390f35b6103de60048036038101906103d991906135ee565b610cac565b6040516103eb919061314f565b60405180910390f35b61040e600480360381019061040991906133a0565b610da1565b60405161041b91906133ef565b60405180910390f35b61042c610e46565b60405161043991906133ef565b60405180910390f35b61044a610e4c565b005b6104666004803603810190610461919061340a565b610e5e565b005b610482600480360381019061047d91906135ee565b610e7e565b60405161048f91906133ef565b60405180910390f35b6104b260048036038101906104ad91906132eb565b610e96565b6040516104bf91906133ef565b60405180910390f35b6104e260048036038101906104dd91906136d0565b610f07565b005b6104ec610f22565b6040516104f9919061314f565b60405180910390f35b61050a610f39565b6040516105179190613359565b60405180910390f35b61053a600480360381019061053591906132eb565b610f5f565b6040516105479190613359565b60405180910390f35b610558611010565b6040516105659190613735565b60405180910390f35b610576611023565b6040516105839190613293565b60405180910390f35b6105a660048036038101906105a191906135ee565b6110b1565b6040516105b391906133ef565b60405180910390f35b6105c4611168565b005b6105e060048036038101906105db91906135ee565b61117c565b6040516105ed919061380e565b60405180910390f35b610610600480360381019061060b91906135ee565b61122a565b60405161061d919061314f565b60405180910390f35b61062e61131e565b005b610638611330565b6040516106459190613359565b60405180910390f35b610668600480360381019061066391906136d0565b61135a565b005b610672611375565b60405161067f9190613735565b60405180910390f35b610690611388565b60405161069d9190613293565b60405180910390f35b6106ae61141a565b6040516106bb91906133ef565b60405180910390f35b6106de60048036038101906106d991906135ee565b61142b565b6040516106eb919061314f565b60405180910390f35b61070e6004803603810190610709919061385c565b61144b565b005b61072a6004803603810190610725919061393d565b611461565b005b6107346114c3565b6040516107419190613293565b60405180910390f35b610764600480360381019061075f91906132eb565b611551565b6040516107719190613293565b60405180910390f35b6107826115fb565b60405161078f919061314f565b60405180910390f35b6107a061160e565b6040516107ad91906133ef565b60405180910390f35b6107d060048036038101906107cb91906135a5565b611614565b6040516107dd919061314f565b60405180910390f35b61080060048036038101906107fb91906139c0565b611670565b60405161080d919061314f565b60405180910390f35b61081e611704565b60405161082b91906133ef565b60405180910390f35b61084e600480360381019061084991906135ee565b611acd565b005b61086a600480360381019061086591906132eb565b611b50565b604051610877919061314f565b60405180910390f35b610888611bad565b6040516108959190613a5f565b60405180910390f35b60006108a8611be9565b60001515601060149054906101000a900460ff161515146108fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f590613ac6565b60405180910390fd5b600033905060005b601360019054906101000a900460ff1660ff1681101561093d5761092982611c67565b50808061093590613b15565b915050610906565b506001601060146101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fbd316b06604330313ca095927304d39d3e130154c0ea73f98a4d21f62ccd0a07426040516109b691906133ef565b60405180910390a3600191505090565b60006109d182611c8e565b9050919050565b6060600080546109e790613b8c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1390613b8c565b8015610a605780601f10610a3557610100808354040283529160200191610a60565b820191906000526020600020905b815481529060010190602001808311610a4357829003601f168201915b5050505050905090565b6000610a7582611d08565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610abb82610f5f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2290613c2f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b4a611d53565b73ffffffffffffffffffffffffffffffffffffffff161480610b795750610b7881610b73611d53565b611670565b5b610bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610baf90613cc1565b60405180910390fd5b610bc28383611d5b565b505050565b6000600880549050905090565b6000610bde610bc7565b601554610beb9190613ce1565b905090565b610c01610bfb611d53565b82611e14565b610c40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3790613d87565b60405180910390fd5b610c4b838383611ea9565b505050565b6000610c5a611be9565b60005b8251811015610ca657610c89838281518110610c7c57610c7b613da7565b5b6020026020010151610cac565b15610c9357600191505b8080610c9e90613b15565b915050610c5d565b50919050565b6000610cb6611be9565b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610d9c576000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507ff1abf01a1043b7c244d128e8595cf0c1d10743b022b03a02dffd8ca3bf729f5a82604051610d8f9190613359565b60405180910390a1600190505b919050565b6000610dac836110b1565b8210610ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de490613e48565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60155481565b610e54611be9565b610e5c61210f565b565b610e7983838360405180602001604052806000815250611461565b505050565b60166020528060005260406000206000915090505481565b6000610ea0610bc7565b8210610ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed890613eda565b60405180910390fd5b60088281548110610ef557610ef4613da7565b5b90600052602060002001549050919050565b610f0f611be9565b8060119081610f1e919061409c565b5050565b6000600b60009054906101000a900460ff16905090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611007576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffe906141ba565b60405180910390fd5b80915050919050565b601360009054906101000a900460ff1681565b6011805461103090613b8c565b80601f016020809104026020016040519081016040528092919081815260200182805461105c90613b8c565b80156110a95780601f1061107e576101008083540402835291602001916110a9565b820191906000526020600020905b81548152906001019060200180831161108c57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611121576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111189061424c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611170611be9565b61117a6000612172565b565b60606000611189836110b1565b905060008167ffffffffffffffff8111156111a7576111a6613462565b5b6040519080825280602002602001820160405280156111d55781602001602082028036833780820191505090505b50905060005b8281101561121f576111ed8582610da1565b828281518110611200576111ff613da7565b5b602002602001018181525050808061121790613b15565b9150506111db565b508092505050919050565b6000611234611be9565b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611319576001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fd1bba68c128cc3f427e5831b3c6f99f480b6efa6b9e80c757768f6124158cc3f8260405161130c9190613359565b60405180910390a1600190505b919050565b611326611be9565b61132e612238565b565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611362611be9565b8060129081611371919061409c565b5050565b601360019054906101000a900460ff1681565b60606001805461139790613b8c565b80601f01602080910402602001604051908101604052809291908181526020018280546113c390613b8c565b80156114105780601f106113e557610100808354040283529160200191611410565b820191906000526020600020905b8154815290600101906020018083116113f357829003601f168201915b5050505050905090565b6000611426600e61229b565b905090565b600c6020528060005260406000206000915054906101000a900460ff1681565b61145d611456611d53565b83836122a9565b5050565b61147261146c611d53565b83611e14565b6114b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a890613d87565b60405180910390fd5b6114bd84848484612415565b50505050565b601280546114d090613b8c565b80601f01602080910402602001604051908101604052809291908181526020018280546114fc90613b8c565b80156115495780601f1061151e57610100808354040283529160200191611549565b820191906000526020600020905b81548152906001019060200180831161152c57829003601f168201915b505050505081565b606061155c82612471565b61159b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611592906142de565b60405180910390fd5b60006115a56124dd565b905060008151116115c557604051806020016040528060008152506115f3565b806115cf8461256f565b60126040516020016115e3939291906143bd565b6040516020818303038152906040525b915050919050565b601060149054906101000a900460ff1681565b60145481565b600061161e611be9565b60005b825181101561166a5761164d8382815181106116405761163f613da7565b5b602002602001015161122a565b1561165757600191505b808061166290613b15565b915050611621565b50919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006002600d540361174b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117429061443a565b60405180910390fd5b6002600d8190555061175b6126cf565b60011515601060149054906101000a900460ff161515146117b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a8906144a6565b60405180910390fd5b60006117bb610bc7565b90506015546001826117cd91906144c6565b111561180e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180590614546565b60405180910390fd5b6000339050600c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611a5f57600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166014546040518463ffffffff1660e01b81526004016118e793929190614566565b6020604051808303816000875af1158015611906573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192a91906145b2565b611969576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119609061462b565b60405180910390fd5b601360009054906101000a900460ff1660ff166001601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119c891906144c6565b1115611a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0090614697565b60405180910390fd5b601660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611a5990613b15565b91905055505b6000611a6a82611c67565b90508173ffffffffffffffffffffffffffffffffffffffff167f253d872ec1efa2cd60440408e1a31a3b419aa3a959a2c3035cf6513a25579e6e8242604051611ab49291906146b7565b60405180910390a28093505050506001600d8190555090565b611ad5611be9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3b90614752565b60405180910390fd5b611b4d81612172565b50565b6000611b5a611be9565b60008211611b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b94906147be565b60405180910390fd5b8160148190555060019050919050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6001816000016000828254019250508190555050565b611bf1611d53565b73ffffffffffffffffffffffffffffffffffffffff16611c0f611330565b73ffffffffffffffffffffffffffffffffffffffff1614611c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5c9061482a565b60405180910390fd5b565b6000611c73600e61229b565b9050611c7f600e611bd3565b611c898282612719565b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d015750611d0082612737565b5b9050919050565b611d1181612471565b611d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d47906141ba565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611dce83610f5f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611e2083610f5f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e625750611e618185611670565b5b80611ea057508373ffffffffffffffffffffffffffffffffffffffff16611e8884610a6a565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ec982610f5f565b73ffffffffffffffffffffffffffffffffffffffff1614611f1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f16906148bc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f859061494e565b60405180910390fd5b611f99838383612819565b611fa4600082611d5b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ff49190613ce1565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461204b91906144c6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461210a838383612829565b505050565b61211761282e565b6000600b60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61215b611d53565b6040516121689190613359565b60405180910390a1565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6122406126cf565b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612284611d53565b6040516122919190613359565b60405180910390a1565b600081600001549050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612317576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230e906149ba565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612408919061314f565b60405180910390a3505050565b612420848484611ea9565b61242c84848484612877565b61246b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246290614a4c565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060601180546124ec90613b8c565b80601f016020809104026020016040519081016040528092919081815260200182805461251890613b8c565b80156125655780601f1061253a57610100808354040283529160200191612565565b820191906000526020600020905b81548152906001019060200180831161254857829003601f168201915b5050505050905090565b6060600082036125b6576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126ca565b600082905060005b600082146125e85780806125d190613b15565b915050600a826125e19190614a9b565b91506125be565b60008167ffffffffffffffff81111561260457612603613462565b5b6040519080825280601f01601f1916602001820160405280156126365781602001600182028036833780820191505090505b5090505b600085146126c35760018261264f9190613ce1565b9150600a8561265e9190614acc565b603061266a91906144c6565b60f81b8183815181106126805761267f613da7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126bc9190614a9b565b945061263a565b8093505050505b919050565b6126d7610f22565b15612717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270e90614b49565b60405180910390fd5b565b6127338282604051806020016040528060008152506129fe565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061280257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612812575061281182612a59565b5b9050919050565b612824838383612ac3565b505050565b505050565b612836610f22565b612875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286c90614bb5565b60405180910390fd5b565b60006128988473ffffffffffffffffffffffffffffffffffffffff16612b1b565b156129f1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128c1611d53565b8786866040518563ffffffff1660e01b81526004016128e39493929190614c2a565b6020604051808303816000875af192505050801561291f57506040513d601f19601f8201168201806040525081019061291c9190614c8b565b60015b6129a1573d806000811461294f576040519150601f19603f3d011682016040523d82523d6000602084013e612954565b606091505b506000815103612999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299090614a4c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129f6565b600190505b949350505050565b612a088383612b3e565b612a156000848484612877565b612a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4b90614a4c565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612ace838383612d17565b612ad6610f22565b15612b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0d90614d2a565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba490614d96565b60405180910390fd5b612bb681612471565b15612bf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bed90614e02565b60405180910390fd5b612c0260008383612819565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c5291906144c6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d1360008383612829565b5050565b612d22838383612e29565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612d6457612d5f81612e2e565b612da3565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612da257612da18382612e77565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612de557612de081612fe4565b612e24565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612e2357612e2282826130b5565b5b5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612e84846110b1565b612e8e9190613ce1565b9050600060076000848152602001908152602001600020549050818114612f73576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612ff89190613ce1565b905060006009600084815260200190815260200160002054905060006008838154811061302857613027613da7565b5b90600052602060002001549050806008838154811061304a57613049613da7565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061309957613098614e22565b5b6001900381819060005260206000200160009055905550505050565b60006130c0836110b1565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008115159050919050565b61314981613134565b82525050565b60006020820190506131646000830184613140565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131b38161317e565b81146131be57600080fd5b50565b6000813590506131d0816131aa565b92915050565b6000602082840312156131ec576131eb613174565b5b60006131fa848285016131c1565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561323d578082015181840152602081019050613222565b60008484015250505050565b6000601f19601f8301169050919050565b600061326582613203565b61326f818561320e565b935061327f81856020860161321f565b61328881613249565b840191505092915050565b600060208201905081810360008301526132ad818461325a565b905092915050565b6000819050919050565b6132c8816132b5565b81146132d357600080fd5b50565b6000813590506132e5816132bf565b92915050565b60006020828403121561330157613300613174565b5b600061330f848285016132d6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061334382613318565b9050919050565b61335381613338565b82525050565b600060208201905061336e600083018461334a565b92915050565b61337d81613338565b811461338857600080fd5b50565b60008135905061339a81613374565b92915050565b600080604083850312156133b7576133b6613174565b5b60006133c58582860161338b565b92505060206133d6858286016132d6565b9150509250929050565b6133e9816132b5565b82525050565b600060208201905061340460008301846133e0565b92915050565b60008060006060848603121561342357613422613174565b5b60006134318682870161338b565b93505060206134428682870161338b565b9250506040613453868287016132d6565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61349a82613249565b810181811067ffffffffffffffff821117156134b9576134b8613462565b5b80604052505050565b60006134cc61316a565b90506134d88282613491565b919050565b600067ffffffffffffffff8211156134f8576134f7613462565b5b602082029050602081019050919050565b600080fd5b600061352161351c846134dd565b6134c2565b9050808382526020820190506020840283018581111561354457613543613509565b5b835b8181101561356d5780613559888261338b565b845260208401935050602081019050613546565b5050509392505050565b600082601f83011261358c5761358b61345d565b5b813561359c84826020860161350e565b91505092915050565b6000602082840312156135bb576135ba613174565b5b600082013567ffffffffffffffff8111156135d9576135d8613179565b5b6135e584828501613577565b91505092915050565b60006020828403121561360457613603613174565b5b60006136128482850161338b565b91505092915050565b600080fd5b600067ffffffffffffffff82111561363b5761363a613462565b5b61364482613249565b9050602081019050919050565b82818337600083830152505050565b600061367361366e84613620565b6134c2565b90508281526020810184848401111561368f5761368e61361b565b5b61369a848285613651565b509392505050565b600082601f8301126136b7576136b661345d565b5b81356136c7848260208601613660565b91505092915050565b6000602082840312156136e6576136e5613174565b5b600082013567ffffffffffffffff81111561370457613703613179565b5b613710848285016136a2565b91505092915050565b600060ff82169050919050565b61372f81613719565b82525050565b600060208201905061374a6000830184613726565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613785816132b5565b82525050565b6000613797838361377c565b60208301905092915050565b6000602082019050919050565b60006137bb82613750565b6137c5818561375b565b93506137d08361376c565b8060005b838110156138015781516137e8888261378b565b97506137f3836137a3565b9250506001810190506137d4565b5085935050505092915050565b6000602082019050818103600083015261382881846137b0565b905092915050565b61383981613134565b811461384457600080fd5b50565b60008135905061385681613830565b92915050565b6000806040838503121561387357613872613174565b5b60006138818582860161338b565b925050602061389285828601613847565b9150509250929050565b600067ffffffffffffffff8211156138b7576138b6613462565b5b6138c082613249565b9050602081019050919050565b60006138e06138db8461389c565b6134c2565b9050828152602081018484840111156138fc576138fb61361b565b5b613907848285613651565b509392505050565b600082601f8301126139245761392361345d565b5b81356139348482602086016138cd565b91505092915050565b6000806000806080858703121561395757613956613174565b5b60006139658782880161338b565b94505060206139768782880161338b565b9350506040613987878288016132d6565b925050606085013567ffffffffffffffff8111156139a8576139a7613179565b5b6139b48782880161390f565b91505092959194509250565b600080604083850312156139d7576139d6613174565b5b60006139e58582860161338b565b92505060206139f68582860161338b565b9150509250929050565b6000819050919050565b6000613a25613a20613a1b84613318565b613a00565b613318565b9050919050565b6000613a3782613a0a565b9050919050565b6000613a4982613a2c565b9050919050565b613a5981613a3e565b82525050565b6000602082019050613a746000830184613a50565b92915050565b7f4f4e4c595f4f4e43455f414c4c4f574544000000000000000000000000000000600082015250565b6000613ab060118361320e565b9150613abb82613a7a565b602082019050919050565b60006020820190508181036000830152613adf81613aa3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b20826132b5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b5257613b51613ae6565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ba457607f821691505b602082108103613bb757613bb6613b5d565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613c1960218361320e565b9150613c2482613bbd565b604082019050919050565b60006020820190508181036000830152613c4881613c0c565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000613cab603e8361320e565b9150613cb682613c4f565b604082019050919050565b60006020820190508181036000830152613cda81613c9e565b9050919050565b6000613cec826132b5565b9150613cf7836132b5565b9250828203905081811115613d0f57613d0e613ae6565b5b92915050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000613d71602e8361320e565b9150613d7c82613d15565b604082019050919050565b60006020820190508181036000830152613da081613d64565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613e32602b8361320e565b9150613e3d82613dd6565b604082019050919050565b60006020820190508181036000830152613e6181613e25565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613ec4602c8361320e565b9150613ecf82613e68565b604082019050919050565b60006020820190508181036000830152613ef381613eb7565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613f5c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613f1f565b613f668683613f1f565b95508019841693508086168417925050509392505050565b6000613f99613f94613f8f846132b5565b613a00565b6132b5565b9050919050565b6000819050919050565b613fb383613f7e565b613fc7613fbf82613fa0565b848454613f2c565b825550505050565b600090565b613fdc613fcf565b613fe7818484613faa565b505050565b5b8181101561400b57614000600082613fd4565b600181019050613fed565b5050565b601f8211156140505761402181613efa565b61402a84613f0f565b81016020851015614039578190505b61404d61404585613f0f565b830182613fec565b50505b505050565b600082821c905092915050565b600061407360001984600802614055565b1980831691505092915050565b600061408c8383614062565b9150826002028217905092915050565b6140a582613203565b67ffffffffffffffff8111156140be576140bd613462565b5b6140c88254613b8c565b6140d382828561400f565b600060209050601f83116001811461410657600084156140f4578287015190505b6140fe8582614080565b865550614166565b601f19841661411486613efa565b60005b8281101561413c57848901518255600182019150602085019450602081019050614117565b868310156141595784890151614155601f891682614062565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006141a460188361320e565b91506141af8261416e565b602082019050919050565b600060208201905081810360008301526141d381614197565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b600061423660298361320e565b9150614241826141da565b604082019050919050565b6000602082019050818103600083015261426581614229565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006142c8602f8361320e565b91506142d38261426c565b604082019050919050565b600060208201905081810360008301526142f7816142bb565b9050919050565b600081905092915050565b600061431482613203565b61431e81856142fe565b935061432e81856020860161321f565b80840191505092915050565b6000815461434781613b8c565b61435181866142fe565b9450600182166000811461436c5760018114614381576143b4565b60ff19831686528115158202860193506143b4565b61438a85613efa565b60005b838110156143ac5781548189015260018201915060208101905061438d565b838801955050505b50505092915050565b60006143c98286614309565b91506143d58285614309565b91506143e1828461433a565b9150819050949350505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614424601f8361320e565b915061442f826143ee565b602082019050919050565b6000602082019050818103600083015261445381614417565b9050919050565b7f4f4e4c595f5748454e5f4c41554e434845440000000000000000000000000000600082015250565b600061449060128361320e565b915061449b8261445a565b602082019050919050565b600060208201905081810360008301526144bf81614483565b9050919050565b60006144d1826132b5565b91506144dc836132b5565b92508282019050808211156144f4576144f3613ae6565b5b92915050565b7f4e46543a3a4c494d49545f524541434845440000000000000000000000000000600082015250565b600061453060128361320e565b915061453b826144fa565b602082019050919050565b6000602082019050818103600083015261455f81614523565b9050919050565b600060608201905061457b600083018661334a565b614588602083018561334a565b61459560408301846133e0565b949350505050565b6000815190506145ac81613830565b92915050565b6000602082840312156145c8576145c7613174565b5b60006145d68482850161459d565b91505092915050565b7f4d5553545f5041595f4d494e545f464545000000000000000000000000000000600082015250565b600061461560118361320e565b9150614620826145df565b602082019050919050565b6000602082019050818103600083015261464481614608565b9050919050565b7f4d494e545f4d41585f5245414348454400000000000000000000000000000000600082015250565b600061468160108361320e565b915061468c8261464b565b602082019050919050565b600060208201905081810360008301526146b081614674565b9050919050565b60006040820190506146cc60008301856133e0565b6146d960208301846133e0565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061473c60268361320e565b9150614747826146e0565b604082019050919050565b6000602082019050818103600083015261476b8161472f565b9050919050565b7f494e56414c49445f414d4f554e54000000000000000000000000000000000000600082015250565b60006147a8600e8361320e565b91506147b382614772565b602082019050919050565b600060208201905081810360008301526147d78161479b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061481460208361320e565b915061481f826147de565b602082019050919050565b6000602082019050818103600083015261484381614807565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006148a660258361320e565b91506148b18261484a565b604082019050919050565b600060208201905081810360008301526148d581614899565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061493860248361320e565b9150614943826148dc565b604082019050919050565b600060208201905081810360008301526149678161492b565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006149a460198361320e565b91506149af8261496e565b602082019050919050565b600060208201905081810360008301526149d381614997565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614a3660328361320e565b9150614a41826149da565b604082019050919050565b60006020820190508181036000830152614a6581614a29565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614aa6826132b5565b9150614ab1836132b5565b925082614ac157614ac0614a6c565b5b828204905092915050565b6000614ad7826132b5565b9150614ae2836132b5565b925082614af257614af1614a6c565b5b828206905092915050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614b3360108361320e565b9150614b3e82614afd565b602082019050919050565b60006020820190508181036000830152614b6281614b26565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614b9f60148361320e565b9150614baa82614b69565b602082019050919050565b60006020820190508181036000830152614bce81614b92565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614bfc82614bd5565b614c068185614be0565b9350614c1681856020860161321f565b614c1f81613249565b840191505092915050565b6000608082019050614c3f600083018761334a565b614c4c602083018661334a565b614c5960408301856133e0565b8181036060830152614c6b8184614bf1565b905095945050505050565b600081519050614c85816131aa565b92915050565b600060208284031215614ca157614ca0613174565b5b6000614caf84828501614c76565b91505092915050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b6000614d14602b8361320e565b9150614d1f82614cb8565b604082019050919050565b60006020820190508181036000830152614d4381614d07565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614d8060208361320e565b9150614d8b82614d4a565b602082019050919050565b60006020820190508181036000830152614daf81614d73565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614dec601c8361320e565b9150614df782614db6565b602082019050919050565b60006020820190508181036000830152614e1b81614ddf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212201e2f2f68c763ce9f6605353d689a05a8cfde90ea76907f4d95e0b37e610409ab64736f6c6343000810003360806040523480156200001157600080fd5b5060405162001d0838038062001d088339818101604052810190620000379190620002f5565b620000576200004b6200006f60201b60201c565b6200007760201b60201c565b62000068816200013b60201b60201c565b5062000442565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200014b620001d160201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620001bd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001b490620003ae565b60405180910390fd5b620001ce816200007760201b60201c565b50565b620001e16200006f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002076200026260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000260576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002579062000420565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002bd8262000290565b9050919050565b620002cf81620002b0565b8114620002db57600080fd5b50565b600081519050620002ef81620002c4565b92915050565b6000602082840312156200030e576200030d6200028b565b5b60006200031e84828501620002de565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006200039660268362000327565b9150620003a38262000338565b604082019050919050565b60006020820190508181036000830152620003c98162000387565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200040860208362000327565b91506200041582620003d0565b602082019050919050565b600060208201905081810360008301526200043b81620003f9565b9050919050565b6118b680620004526000396000f3fe6080604052600436106100ab5760003560e01c80638da5cb5b116100645780638da5cb5b146101eb5780639b19251a14610216578063b81ff23d14610253578063c8d4bc0a1461027c578063e2ec6ec3146102b9578063f2fde38b146102f6576100b2565b806324953eaa146100b7578063286dd3f5146100f457806363453ae1146101315780636555176b1461015a578063715018a6146101975780637b9417c8146101ae576100b2565b366100b257005b600080fd5b3480156100c357600080fd5b506100de60048036038101906100d991906110a6565b61031f565b6040516100eb919061110a565b60405180910390f35b34801561010057600080fd5b5061011b60048036038101906101169190611125565b61037b565b604051610128919061110a565b60405180910390f35b34801561013d57600080fd5b5061015860048036038101906101539190611190565b610470565b005b34801561016657600080fd5b50610181600480360381019061017c91906111f3565b610798565b60405161018e9190611242565b60405180910390f35b3480156101a357600080fd5b506101ac6107e6565b005b3480156101ba57600080fd5b506101d560048036038101906101d09190611125565b6107fa565b6040516101e2919061110a565b60405180910390f35b3480156101f757600080fd5b506102006108ed565b60405161020d9190611242565b60405180910390f35b34801561022257600080fd5b5061023d60048036038101906102389190611125565b610916565b60405161024a919061110a565b60405180910390f35b34801561025f57600080fd5b5061027a60048036038101906102759190611320565b610936565b005b34801561028857600080fd5b506102a3600480360381019061029e91906111f3565b610b8d565b6040516102b091906113ba565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db91906110a6565b610bbe565b6040516102ed919061110a565b60405180910390f35b34801561030257600080fd5b5061031d60048036038101906103189190611125565b610c1a565b005b6000610329610c9d565b60005b82518110156103755761035883828151811061034b5761034a6113d5565b5b602002602001015161037b565b1561036257600191505b808061036d90611433565b91505061032c565b50919050565b6000610385610c9d565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561046b576000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507ff1abf01a1043b7c244d128e8595cf0c1d10743b022b03a02dffd8ca3bf729f5a8260405161045e9190611242565b60405180910390a1600190505b919050565b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016104ab9190611242565b602060405180830381865afa1580156104c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ec9190611490565b905060008111610531576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105289061151a565b60405180910390fd5b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156105f257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116105a8575b505050505090506000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561068457602002820191906000526020600020905b815481526020019060010190808311610670575b5050505050905060005b82518110156107915760008382815181106106ac576106ab6113d5565b5b6020026020010151905060008383815181106106cb576106ca6113d5565b5b60200260200101519050600081111561077c57600061271087836106ef919061153a565b6106f991906115c3565b90508773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b81526004016107369291906115f4565b6020604051808303816000875af1158015610755573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107799190611649565b50505b5050808061078990611433565b91505061068e565b5050505050565b600260205281600052604060002081815481106107b457600080fd5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6107ee610c9d565b6107f86000610d1b565b565b6000610804610c9d565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166108e85760018060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fd1bba68c128cc3f427e5831b3c6f99f480b6efa6b9e80c757768f6124158cc3f826040516108db9190611242565b60405180910390a1600190505b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60016020528060005260406000206000915054906101000a900460ff1681565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166109c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b9906116c2565b60405180910390fd5b600080600090505b8251811015610a0e578281815181106109e6576109e56113d5565b5b6020026020010151826109f991906116e2565b91508080610a0690611433565b9150506109ca565b506127108114610a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4a90611762565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610a8e9190611242565b602060405180830381865afa158015610aab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610acf9190611490565b1115610adf57610ade84610470565b5b82600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209080519060200190610b32929190610de7565b5081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209080519060200190610b86929190610e71565b5050505050565b60036020528160005260406000208181548110610ba957600080fd5b90600052602060002001600091509150505481565b6000610bc8610c9d565b60005b8251811015610c1457610bf7838281518110610bea57610be96113d5565b5b60200260200101516107fa565b15610c0157600191505b8080610c0c90611433565b915050610bcb565b50919050565b610c22610c9d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c88906117f4565b60405180910390fd5b610c9a81610d1b565b50565b610ca5610ddf565b73ffffffffffffffffffffffffffffffffffffffff16610cc36108ed565b73ffffffffffffffffffffffffffffffffffffffff1614610d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1090611860565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b828054828255906000526020600020908101928215610e60579160200282015b82811115610e5f5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190610e07565b5b509050610e6d9190610ebe565b5090565b828054828255906000526020600020908101928215610ead579160200282015b82811115610eac578251825591602001919060010190610e91565b5b509050610eba9190610ebe565b5090565b5b80821115610ed7576000816000905550600101610ebf565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610f3d82610ef4565b810181811067ffffffffffffffff82111715610f5c57610f5b610f05565b5b80604052505050565b6000610f6f610edb565b9050610f7b8282610f34565b919050565b600067ffffffffffffffff821115610f9b57610f9a610f05565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610fdc82610fb1565b9050919050565b610fec81610fd1565b8114610ff757600080fd5b50565b60008135905061100981610fe3565b92915050565b600061102261101d84610f80565b610f65565b9050808382526020820190506020840283018581111561104557611044610fac565b5b835b8181101561106e578061105a8882610ffa565b845260208401935050602081019050611047565b5050509392505050565b600082601f83011261108d5761108c610eef565b5b813561109d84826020860161100f565b91505092915050565b6000602082840312156110bc576110bb610ee5565b5b600082013567ffffffffffffffff8111156110da576110d9610eea565b5b6110e684828501611078565b91505092915050565b60008115159050919050565b611104816110ef565b82525050565b600060208201905061111f60008301846110fb565b92915050565b60006020828403121561113b5761113a610ee5565b5b600061114984828501610ffa565b91505092915050565b600061115d82610fd1565b9050919050565b61116d81611152565b811461117857600080fd5b50565b60008135905061118a81611164565b92915050565b6000602082840312156111a6576111a5610ee5565b5b60006111b48482850161117b565b91505092915050565b6000819050919050565b6111d0816111bd565b81146111db57600080fd5b50565b6000813590506111ed816111c7565b92915050565b6000806040838503121561120a57611209610ee5565b5b60006112188582860161117b565b9250506020611229858286016111de565b9150509250929050565b61123c81610fd1565b82525050565b60006020820190506112576000830184611233565b92915050565b600067ffffffffffffffff82111561127857611277610f05565b5b602082029050602081019050919050565b600061129c6112978461125d565b610f65565b905080838252602082019050602084028301858111156112bf576112be610fac565b5b835b818110156112e857806112d488826111de565b8452602084019350506020810190506112c1565b5050509392505050565b600082601f83011261130757611306610eef565b5b8135611317848260208601611289565b91505092915050565b60008060006060848603121561133957611338610ee5565b5b60006113478682870161117b565b935050602084013567ffffffffffffffff81111561136857611367610eea565b5b61137486828701611078565b925050604084013567ffffffffffffffff81111561139557611394610eea565b5b6113a1868287016112f2565b9150509250925092565b6113b4816111bd565b82525050565b60006020820190506113cf60008301846113ab565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061143e826111bd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114705761146f611404565b5b600182019050919050565b60008151905061148a816111c7565b92915050565b6000602082840312156114a6576114a5610ee5565b5b60006114b48482850161147b565b91505092915050565b600082825260208201905092915050565b7f4e6f7468696e6720746f20706179000000000000000000000000000000000000600082015250565b6000611504600e836114bd565b915061150f826114ce565b602082019050919050565b60006020820190508181036000830152611533816114f7565b9050919050565b6000611545826111bd565b9150611550836111bd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561158957611588611404565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006115ce826111bd565b91506115d9836111bd565b9250826115e9576115e8611594565b5b828204905092915050565b60006040820190506116096000830185611233565b61161660208301846113ab565b9392505050565b611626816110ef565b811461163157600080fd5b50565b6000815190506116438161161d565b92915050565b60006020828403121561165f5761165e610ee5565b5b600061166d84828501611634565b91505092915050565b7f6e6f2077686974656c6973740000000000000000000000000000000000000000600082015250565b60006116ac600c836114bd565b91506116b782611676565b602082019050919050565b600060208201905081810360008301526116db8161169f565b9050919050565b60006116ed826111bd565b91506116f8836111bd565b92508282019050808211156117105761170f611404565b5b92915050565b7f546f74616c206665652072617465206d75737420626520313030250000000000600082015250565b600061174c601b836114bd565b915061175782611716565b602082019050919050565b6000602082019050818103600083015261177b8161173f565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006117de6026836114bd565b91506117e982611782565b604082019050919050565b6000602082019050818103600083015261180d816117d1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061184a6020836114bd565b915061185582611814565b602082019050919050565b600060208201905081810360008301526118798161183d565b905091905056fea264697066735822122078627179c54599b621e625875a68823c5c9a2875a0471c45a06c7da569fa585a64736f6c63430008100033000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000002b5e3af16b18800000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000b446567656e20446f6e6e790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005444f4e4e59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d68747470733a2f2f697066732e66696c65626173652e696f2f697066732f516d636a434e6b4273337462343345317a5458765348664c5577584a384b6842744e4134663256616a74616866542f00000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061027f5760003560e01c806370a082311161015c578063a22cb465116100ce578063e2ec6ec311610087578063e2ec6ec3146107b6578063e985e9c5146107e6578063eb93406b14610816578063f2fde38b14610834578063f4a0a52814610850578063fc0c546a146108805761027f565b8063a22cb465146106f4578063b88d4fde14610710578063c66828621461072c578063c87b56dd1461074a578063ca1c4de91461077a578063dac6db1c146107985761027f565b80638da5cb5b116101205780638da5cb5b14610630578063907097511461064e578063951d3bc91461066a57806395d89b41146106885780639a691d5b146106a65780639b19251a146106c45761027f565b806370a082311461058c578063715018a6146105bc5780637231a876146105c65780637b9417c8146105f65780638456cb59146106265761027f565b80633740b648116101f557806355f804b3116101b957806355f804b3146104c85780635c975abb146104e45780636052970c146105025780636352211e14610520578063685158b1146105505780636c0360eb1461056e5761027f565b80633740b648146104245780633f4ba83a1461044257806342842e0e1461044c5780634432fcd5146104685780634f6ccce7146104985761027f565b806318160ddd1161024757806318160ddd1461033c5780631fd37db31461035a57806323b872dd1461037857806324953eaa14610394578063286dd3f5146103c45780632f745c59146103f45761027f565b806301339c211461028457806301ffc9a7146102a257806306fdde03146102d2578063081812fc146102f0578063095ea7b314610320575b600080fd5b61028c61089e565b604051610299919061314f565b60405180910390f35b6102bc60048036038101906102b791906131d6565b6109c6565b6040516102c9919061314f565b60405180910390f35b6102da6109d8565b6040516102e79190613293565b60405180910390f35b61030a600480360381019061030591906132eb565b610a6a565b6040516103179190613359565b60405180910390f35b61033a600480360381019061033591906133a0565b610ab0565b005b610344610bc7565b60405161035191906133ef565b60405180910390f35b610362610bd4565b60405161036f91906133ef565b60405180910390f35b610392600480360381019061038d919061340a565b610bf0565b005b6103ae60048036038101906103a991906135a5565b610c50565b6040516103bb919061314f565b60405180910390f35b6103de60048036038101906103d991906135ee565b610cac565b6040516103eb919061314f565b60405180910390f35b61040e600480360381019061040991906133a0565b610da1565b60405161041b91906133ef565b60405180910390f35b61042c610e46565b60405161043991906133ef565b60405180910390f35b61044a610e4c565b005b6104666004803603810190610461919061340a565b610e5e565b005b610482600480360381019061047d91906135ee565b610e7e565b60405161048f91906133ef565b60405180910390f35b6104b260048036038101906104ad91906132eb565b610e96565b6040516104bf91906133ef565b60405180910390f35b6104e260048036038101906104dd91906136d0565b610f07565b005b6104ec610f22565b6040516104f9919061314f565b60405180910390f35b61050a610f39565b6040516105179190613359565b60405180910390f35b61053a600480360381019061053591906132eb565b610f5f565b6040516105479190613359565b60405180910390f35b610558611010565b6040516105659190613735565b60405180910390f35b610576611023565b6040516105839190613293565b60405180910390f35b6105a660048036038101906105a191906135ee565b6110b1565b6040516105b391906133ef565b60405180910390f35b6105c4611168565b005b6105e060048036038101906105db91906135ee565b61117c565b6040516105ed919061380e565b60405180910390f35b610610600480360381019061060b91906135ee565b61122a565b60405161061d919061314f565b60405180910390f35b61062e61131e565b005b610638611330565b6040516106459190613359565b60405180910390f35b610668600480360381019061066391906136d0565b61135a565b005b610672611375565b60405161067f9190613735565b60405180910390f35b610690611388565b60405161069d9190613293565b60405180910390f35b6106ae61141a565b6040516106bb91906133ef565b60405180910390f35b6106de60048036038101906106d991906135ee565b61142b565b6040516106eb919061314f565b60405180910390f35b61070e6004803603810190610709919061385c565b61144b565b005b61072a6004803603810190610725919061393d565b611461565b005b6107346114c3565b6040516107419190613293565b60405180910390f35b610764600480360381019061075f91906132eb565b611551565b6040516107719190613293565b60405180910390f35b6107826115fb565b60405161078f919061314f565b60405180910390f35b6107a061160e565b6040516107ad91906133ef565b60405180910390f35b6107d060048036038101906107cb91906135a5565b611614565b6040516107dd919061314f565b60405180910390f35b61080060048036038101906107fb91906139c0565b611670565b60405161080d919061314f565b60405180910390f35b61081e611704565b60405161082b91906133ef565b60405180910390f35b61084e600480360381019061084991906135ee565b611acd565b005b61086a600480360381019061086591906132eb565b611b50565b604051610877919061314f565b60405180910390f35b610888611bad565b6040516108959190613a5f565b60405180910390f35b60006108a8611be9565b60001515601060149054906101000a900460ff161515146108fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f590613ac6565b60405180910390fd5b600033905060005b601360019054906101000a900460ff1660ff1681101561093d5761092982611c67565b50808061093590613b15565b915050610906565b506001601060146101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fbd316b06604330313ca095927304d39d3e130154c0ea73f98a4d21f62ccd0a07426040516109b691906133ef565b60405180910390a3600191505090565b60006109d182611c8e565b9050919050565b6060600080546109e790613b8c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1390613b8c565b8015610a605780601f10610a3557610100808354040283529160200191610a60565b820191906000526020600020905b815481529060010190602001808311610a4357829003601f168201915b5050505050905090565b6000610a7582611d08565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610abb82610f5f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2290613c2f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b4a611d53565b73ffffffffffffffffffffffffffffffffffffffff161480610b795750610b7881610b73611d53565b611670565b5b610bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610baf90613cc1565b60405180910390fd5b610bc28383611d5b565b505050565b6000600880549050905090565b6000610bde610bc7565b601554610beb9190613ce1565b905090565b610c01610bfb611d53565b82611e14565b610c40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3790613d87565b60405180910390fd5b610c4b838383611ea9565b505050565b6000610c5a611be9565b60005b8251811015610ca657610c89838281518110610c7c57610c7b613da7565b5b6020026020010151610cac565b15610c9357600191505b8080610c9e90613b15565b915050610c5d565b50919050565b6000610cb6611be9565b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610d9c576000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507ff1abf01a1043b7c244d128e8595cf0c1d10743b022b03a02dffd8ca3bf729f5a82604051610d8f9190613359565b60405180910390a1600190505b919050565b6000610dac836110b1565b8210610ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de490613e48565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60155481565b610e54611be9565b610e5c61210f565b565b610e7983838360405180602001604052806000815250611461565b505050565b60166020528060005260406000206000915090505481565b6000610ea0610bc7565b8210610ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed890613eda565b60405180910390fd5b60088281548110610ef557610ef4613da7565b5b90600052602060002001549050919050565b610f0f611be9565b8060119081610f1e919061409c565b5050565b6000600b60009054906101000a900460ff16905090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611007576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffe906141ba565b60405180910390fd5b80915050919050565b601360009054906101000a900460ff1681565b6011805461103090613b8c565b80601f016020809104026020016040519081016040528092919081815260200182805461105c90613b8c565b80156110a95780601f1061107e576101008083540402835291602001916110a9565b820191906000526020600020905b81548152906001019060200180831161108c57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611121576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111189061424c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611170611be9565b61117a6000612172565b565b60606000611189836110b1565b905060008167ffffffffffffffff8111156111a7576111a6613462565b5b6040519080825280602002602001820160405280156111d55781602001602082028036833780820191505090505b50905060005b8281101561121f576111ed8582610da1565b828281518110611200576111ff613da7565b5b602002602001018181525050808061121790613b15565b9150506111db565b508092505050919050565b6000611234611be9565b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611319576001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fd1bba68c128cc3f427e5831b3c6f99f480b6efa6b9e80c757768f6124158cc3f8260405161130c9190613359565b60405180910390a1600190505b919050565b611326611be9565b61132e612238565b565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611362611be9565b8060129081611371919061409c565b5050565b601360019054906101000a900460ff1681565b60606001805461139790613b8c565b80601f01602080910402602001604051908101604052809291908181526020018280546113c390613b8c565b80156114105780601f106113e557610100808354040283529160200191611410565b820191906000526020600020905b8154815290600101906020018083116113f357829003601f168201915b5050505050905090565b6000611426600e61229b565b905090565b600c6020528060005260406000206000915054906101000a900460ff1681565b61145d611456611d53565b83836122a9565b5050565b61147261146c611d53565b83611e14565b6114b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a890613d87565b60405180910390fd5b6114bd84848484612415565b50505050565b601280546114d090613b8c565b80601f01602080910402602001604051908101604052809291908181526020018280546114fc90613b8c565b80156115495780601f1061151e57610100808354040283529160200191611549565b820191906000526020600020905b81548152906001019060200180831161152c57829003601f168201915b505050505081565b606061155c82612471565b61159b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611592906142de565b60405180910390fd5b60006115a56124dd565b905060008151116115c557604051806020016040528060008152506115f3565b806115cf8461256f565b60126040516020016115e3939291906143bd565b6040516020818303038152906040525b915050919050565b601060149054906101000a900460ff1681565b60145481565b600061161e611be9565b60005b825181101561166a5761164d8382815181106116405761163f613da7565b5b602002602001015161122a565b1561165757600191505b808061166290613b15565b915050611621565b50919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006002600d540361174b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117429061443a565b60405180910390fd5b6002600d8190555061175b6126cf565b60011515601060149054906101000a900460ff161515146117b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a8906144a6565b60405180910390fd5b60006117bb610bc7565b90506015546001826117cd91906144c6565b111561180e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180590614546565b60405180910390fd5b6000339050600c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611a5f57600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166014546040518463ffffffff1660e01b81526004016118e793929190614566565b6020604051808303816000875af1158015611906573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192a91906145b2565b611969576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119609061462b565b60405180910390fd5b601360009054906101000a900460ff1660ff166001601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119c891906144c6565b1115611a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0090614697565b60405180910390fd5b601660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611a5990613b15565b91905055505b6000611a6a82611c67565b90508173ffffffffffffffffffffffffffffffffffffffff167f253d872ec1efa2cd60440408e1a31a3b419aa3a959a2c3035cf6513a25579e6e8242604051611ab49291906146b7565b60405180910390a28093505050506001600d8190555090565b611ad5611be9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3b90614752565b60405180910390fd5b611b4d81612172565b50565b6000611b5a611be9565b60008211611b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b94906147be565b60405180910390fd5b8160148190555060019050919050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6001816000016000828254019250508190555050565b611bf1611d53565b73ffffffffffffffffffffffffffffffffffffffff16611c0f611330565b73ffffffffffffffffffffffffffffffffffffffff1614611c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5c9061482a565b60405180910390fd5b565b6000611c73600e61229b565b9050611c7f600e611bd3565b611c898282612719565b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d015750611d0082612737565b5b9050919050565b611d1181612471565b611d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d47906141ba565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611dce83610f5f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611e2083610f5f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e625750611e618185611670565b5b80611ea057508373ffffffffffffffffffffffffffffffffffffffff16611e8884610a6a565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ec982610f5f565b73ffffffffffffffffffffffffffffffffffffffff1614611f1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f16906148bc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f859061494e565b60405180910390fd5b611f99838383612819565b611fa4600082611d5b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ff49190613ce1565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461204b91906144c6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461210a838383612829565b505050565b61211761282e565b6000600b60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61215b611d53565b6040516121689190613359565b60405180910390a1565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6122406126cf565b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612284611d53565b6040516122919190613359565b60405180910390a1565b600081600001549050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612317576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230e906149ba565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612408919061314f565b60405180910390a3505050565b612420848484611ea9565b61242c84848484612877565b61246b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246290614a4c565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060601180546124ec90613b8c565b80601f016020809104026020016040519081016040528092919081815260200182805461251890613b8c565b80156125655780601f1061253a57610100808354040283529160200191612565565b820191906000526020600020905b81548152906001019060200180831161254857829003601f168201915b5050505050905090565b6060600082036125b6576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126ca565b600082905060005b600082146125e85780806125d190613b15565b915050600a826125e19190614a9b565b91506125be565b60008167ffffffffffffffff81111561260457612603613462565b5b6040519080825280601f01601f1916602001820160405280156126365781602001600182028036833780820191505090505b5090505b600085146126c35760018261264f9190613ce1565b9150600a8561265e9190614acc565b603061266a91906144c6565b60f81b8183815181106126805761267f613da7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126bc9190614a9b565b945061263a565b8093505050505b919050565b6126d7610f22565b15612717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270e90614b49565b60405180910390fd5b565b6127338282604051806020016040528060008152506129fe565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061280257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612812575061281182612a59565b5b9050919050565b612824838383612ac3565b505050565b505050565b612836610f22565b612875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286c90614bb5565b60405180910390fd5b565b60006128988473ffffffffffffffffffffffffffffffffffffffff16612b1b565b156129f1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128c1611d53565b8786866040518563ffffffff1660e01b81526004016128e39493929190614c2a565b6020604051808303816000875af192505050801561291f57506040513d601f19601f8201168201806040525081019061291c9190614c8b565b60015b6129a1573d806000811461294f576040519150601f19603f3d011682016040523d82523d6000602084013e612954565b606091505b506000815103612999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299090614a4c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129f6565b600190505b949350505050565b612a088383612b3e565b612a156000848484612877565b612a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4b90614a4c565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612ace838383612d17565b612ad6610f22565b15612b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0d90614d2a565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba490614d96565b60405180910390fd5b612bb681612471565b15612bf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bed90614e02565b60405180910390fd5b612c0260008383612819565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c5291906144c6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d1360008383612829565b5050565b612d22838383612e29565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612d6457612d5f81612e2e565b612da3565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612da257612da18382612e77565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612de557612de081612fe4565b612e24565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612e2357612e2282826130b5565b5b5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612e84846110b1565b612e8e9190613ce1565b9050600060076000848152602001908152602001600020549050818114612f73576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612ff89190613ce1565b905060006009600084815260200190815260200160002054905060006008838154811061302857613027613da7565b5b90600052602060002001549050806008838154811061304a57613049613da7565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061309957613098614e22565b5b6001900381819060005260206000200160009055905550505050565b60006130c0836110b1565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008115159050919050565b61314981613134565b82525050565b60006020820190506131646000830184613140565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131b38161317e565b81146131be57600080fd5b50565b6000813590506131d0816131aa565b92915050565b6000602082840312156131ec576131eb613174565b5b60006131fa848285016131c1565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561323d578082015181840152602081019050613222565b60008484015250505050565b6000601f19601f8301169050919050565b600061326582613203565b61326f818561320e565b935061327f81856020860161321f565b61328881613249565b840191505092915050565b600060208201905081810360008301526132ad818461325a565b905092915050565b6000819050919050565b6132c8816132b5565b81146132d357600080fd5b50565b6000813590506132e5816132bf565b92915050565b60006020828403121561330157613300613174565b5b600061330f848285016132d6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061334382613318565b9050919050565b61335381613338565b82525050565b600060208201905061336e600083018461334a565b92915050565b61337d81613338565b811461338857600080fd5b50565b60008135905061339a81613374565b92915050565b600080604083850312156133b7576133b6613174565b5b60006133c58582860161338b565b92505060206133d6858286016132d6565b9150509250929050565b6133e9816132b5565b82525050565b600060208201905061340460008301846133e0565b92915050565b60008060006060848603121561342357613422613174565b5b60006134318682870161338b565b93505060206134428682870161338b565b9250506040613453868287016132d6565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61349a82613249565b810181811067ffffffffffffffff821117156134b9576134b8613462565b5b80604052505050565b60006134cc61316a565b90506134d88282613491565b919050565b600067ffffffffffffffff8211156134f8576134f7613462565b5b602082029050602081019050919050565b600080fd5b600061352161351c846134dd565b6134c2565b9050808382526020820190506020840283018581111561354457613543613509565b5b835b8181101561356d5780613559888261338b565b845260208401935050602081019050613546565b5050509392505050565b600082601f83011261358c5761358b61345d565b5b813561359c84826020860161350e565b91505092915050565b6000602082840312156135bb576135ba613174565b5b600082013567ffffffffffffffff8111156135d9576135d8613179565b5b6135e584828501613577565b91505092915050565b60006020828403121561360457613603613174565b5b60006136128482850161338b565b91505092915050565b600080fd5b600067ffffffffffffffff82111561363b5761363a613462565b5b61364482613249565b9050602081019050919050565b82818337600083830152505050565b600061367361366e84613620565b6134c2565b90508281526020810184848401111561368f5761368e61361b565b5b61369a848285613651565b509392505050565b600082601f8301126136b7576136b661345d565b5b81356136c7848260208601613660565b91505092915050565b6000602082840312156136e6576136e5613174565b5b600082013567ffffffffffffffff81111561370457613703613179565b5b613710848285016136a2565b91505092915050565b600060ff82169050919050565b61372f81613719565b82525050565b600060208201905061374a6000830184613726565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613785816132b5565b82525050565b6000613797838361377c565b60208301905092915050565b6000602082019050919050565b60006137bb82613750565b6137c5818561375b565b93506137d08361376c565b8060005b838110156138015781516137e8888261378b565b97506137f3836137a3565b9250506001810190506137d4565b5085935050505092915050565b6000602082019050818103600083015261382881846137b0565b905092915050565b61383981613134565b811461384457600080fd5b50565b60008135905061385681613830565b92915050565b6000806040838503121561387357613872613174565b5b60006138818582860161338b565b925050602061389285828601613847565b9150509250929050565b600067ffffffffffffffff8211156138b7576138b6613462565b5b6138c082613249565b9050602081019050919050565b60006138e06138db8461389c565b6134c2565b9050828152602081018484840111156138fc576138fb61361b565b5b613907848285613651565b509392505050565b600082601f8301126139245761392361345d565b5b81356139348482602086016138cd565b91505092915050565b6000806000806080858703121561395757613956613174565b5b60006139658782880161338b565b94505060206139768782880161338b565b9350506040613987878288016132d6565b925050606085013567ffffffffffffffff8111156139a8576139a7613179565b5b6139b48782880161390f565b91505092959194509250565b600080604083850312156139d7576139d6613174565b5b60006139e58582860161338b565b92505060206139f68582860161338b565b9150509250929050565b6000819050919050565b6000613a25613a20613a1b84613318565b613a00565b613318565b9050919050565b6000613a3782613a0a565b9050919050565b6000613a4982613a2c565b9050919050565b613a5981613a3e565b82525050565b6000602082019050613a746000830184613a50565b92915050565b7f4f4e4c595f4f4e43455f414c4c4f574544000000000000000000000000000000600082015250565b6000613ab060118361320e565b9150613abb82613a7a565b602082019050919050565b60006020820190508181036000830152613adf81613aa3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b20826132b5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b5257613b51613ae6565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ba457607f821691505b602082108103613bb757613bb6613b5d565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613c1960218361320e565b9150613c2482613bbd565b604082019050919050565b60006020820190508181036000830152613c4881613c0c565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000613cab603e8361320e565b9150613cb682613c4f565b604082019050919050565b60006020820190508181036000830152613cda81613c9e565b9050919050565b6000613cec826132b5565b9150613cf7836132b5565b9250828203905081811115613d0f57613d0e613ae6565b5b92915050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000613d71602e8361320e565b9150613d7c82613d15565b604082019050919050565b60006020820190508181036000830152613da081613d64565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613e32602b8361320e565b9150613e3d82613dd6565b604082019050919050565b60006020820190508181036000830152613e6181613e25565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613ec4602c8361320e565b9150613ecf82613e68565b604082019050919050565b60006020820190508181036000830152613ef381613eb7565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613f5c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613f1f565b613f668683613f1f565b95508019841693508086168417925050509392505050565b6000613f99613f94613f8f846132b5565b613a00565b6132b5565b9050919050565b6000819050919050565b613fb383613f7e565b613fc7613fbf82613fa0565b848454613f2c565b825550505050565b600090565b613fdc613fcf565b613fe7818484613faa565b505050565b5b8181101561400b57614000600082613fd4565b600181019050613fed565b5050565b601f8211156140505761402181613efa565b61402a84613f0f565b81016020851015614039578190505b61404d61404585613f0f565b830182613fec565b50505b505050565b600082821c905092915050565b600061407360001984600802614055565b1980831691505092915050565b600061408c8383614062565b9150826002028217905092915050565b6140a582613203565b67ffffffffffffffff8111156140be576140bd613462565b5b6140c88254613b8c565b6140d382828561400f565b600060209050601f83116001811461410657600084156140f4578287015190505b6140fe8582614080565b865550614166565b601f19841661411486613efa565b60005b8281101561413c57848901518255600182019150602085019450602081019050614117565b868310156141595784890151614155601f891682614062565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006141a460188361320e565b91506141af8261416e565b602082019050919050565b600060208201905081810360008301526141d381614197565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b600061423660298361320e565b9150614241826141da565b604082019050919050565b6000602082019050818103600083015261426581614229565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006142c8602f8361320e565b91506142d38261426c565b604082019050919050565b600060208201905081810360008301526142f7816142bb565b9050919050565b600081905092915050565b600061431482613203565b61431e81856142fe565b935061432e81856020860161321f565b80840191505092915050565b6000815461434781613b8c565b61435181866142fe565b9450600182166000811461436c5760018114614381576143b4565b60ff19831686528115158202860193506143b4565b61438a85613efa565b60005b838110156143ac5781548189015260018201915060208101905061438d565b838801955050505b50505092915050565b60006143c98286614309565b91506143d58285614309565b91506143e1828461433a565b9150819050949350505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614424601f8361320e565b915061442f826143ee565b602082019050919050565b6000602082019050818103600083015261445381614417565b9050919050565b7f4f4e4c595f5748454e5f4c41554e434845440000000000000000000000000000600082015250565b600061449060128361320e565b915061449b8261445a565b602082019050919050565b600060208201905081810360008301526144bf81614483565b9050919050565b60006144d1826132b5565b91506144dc836132b5565b92508282019050808211156144f4576144f3613ae6565b5b92915050565b7f4e46543a3a4c494d49545f524541434845440000000000000000000000000000600082015250565b600061453060128361320e565b915061453b826144fa565b602082019050919050565b6000602082019050818103600083015261455f81614523565b9050919050565b600060608201905061457b600083018661334a565b614588602083018561334a565b61459560408301846133e0565b949350505050565b6000815190506145ac81613830565b92915050565b6000602082840312156145c8576145c7613174565b5b60006145d68482850161459d565b91505092915050565b7f4d5553545f5041595f4d494e545f464545000000000000000000000000000000600082015250565b600061461560118361320e565b9150614620826145df565b602082019050919050565b6000602082019050818103600083015261464481614608565b9050919050565b7f4d494e545f4d41585f5245414348454400000000000000000000000000000000600082015250565b600061468160108361320e565b915061468c8261464b565b602082019050919050565b600060208201905081810360008301526146b081614674565b9050919050565b60006040820190506146cc60008301856133e0565b6146d960208301846133e0565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061473c60268361320e565b9150614747826146e0565b604082019050919050565b6000602082019050818103600083015261476b8161472f565b9050919050565b7f494e56414c49445f414d4f554e54000000000000000000000000000000000000600082015250565b60006147a8600e8361320e565b91506147b382614772565b602082019050919050565b600060208201905081810360008301526147d78161479b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061481460208361320e565b915061481f826147de565b602082019050919050565b6000602082019050818103600083015261484381614807565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006148a660258361320e565b91506148b18261484a565b604082019050919050565b600060208201905081810360008301526148d581614899565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061493860248361320e565b9150614943826148dc565b604082019050919050565b600060208201905081810360008301526149678161492b565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006149a460198361320e565b91506149af8261496e565b602082019050919050565b600060208201905081810360008301526149d381614997565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614a3660328361320e565b9150614a41826149da565b604082019050919050565b60006020820190508181036000830152614a6581614a29565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614aa6826132b5565b9150614ab1836132b5565b925082614ac157614ac0614a6c565b5b828204905092915050565b6000614ad7826132b5565b9150614ae2836132b5565b925082614af257614af1614a6c565b5b828206905092915050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614b3360108361320e565b9150614b3e82614afd565b602082019050919050565b60006020820190508181036000830152614b6281614b26565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614b9f60148361320e565b9150614baa82614b69565b602082019050919050565b60006020820190508181036000830152614bce81614b92565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614bfc82614bd5565b614c068185614be0565b9350614c1681856020860161321f565b614c1f81613249565b840191505092915050565b6000608082019050614c3f600083018761334a565b614c4c602083018661334a565b614c5960408301856133e0565b8181036060830152614c6b8184614bf1565b905095945050505050565b600081519050614c85816131aa565b92915050565b600060208284031215614ca157614ca0613174565b5b6000614caf84828501614c76565b91505092915050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b6000614d14602b8361320e565b9150614d1f82614cb8565b604082019050919050565b60006020820190508181036000830152614d4381614d07565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614d8060208361320e565b9150614d8b82614d4a565b602082019050919050565b60006020820190508181036000830152614daf81614d73565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614dec601c8361320e565b9150614df782614db6565b602082019050919050565b60006020820190508181036000830152614e1b81614ddf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212201e2f2f68c763ce9f6605353d689a05a8cfde90ea76907f4d95e0b37e610409ab64736f6c63430008100033

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

000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000002b5e3af16b18800000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000b446567656e20446f6e6e790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005444f4e4e59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d68747470733a2f2f697066732e66696c65626173652e696f2f697066732f516d636a434e6b4273337462343345317a5458765348664c5577584a384b6842744e4134663256616a74616866542f00000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Degen Donny
Arg [1] : _symbol (string): DONNY
Arg [2] : _token (address): 0x6B175474E89094C44Da98b954EedeAC495271d0F
Arg [3] : _reservedItems (uint8): 25
Arg [4] : _mintablePerUser (uint8): 5
Arg [5] : _maxMintableItems (uint256): 1000
Arg [6] : _pricePerItem (uint256): 50000000000000000000
Arg [7] : _uri (string): https://ipfs.filebase.io/ipfs/QmcjCNkBs3tb43E1zTXvSHfLUwXJ8KhBtNA4f2VajtahfT/

-----Encoded View---------------
16 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [2] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [5] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [6] : 000000000000000000000000000000000000000000000002b5e3af16b1880000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [8] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [9] : 446567656e20446f6e6e79000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [11] : 444f4e4e59000000000000000000000000000000000000000000000000000000
Arg [12] : 000000000000000000000000000000000000000000000000000000000000004d
Arg [13] : 68747470733a2f2f697066732e66696c65626173652e696f2f697066732f516d
Arg [14] : 636a434e6b4273337462343345317a5458765348664c5577584a384b6842744e
Arg [15] : 4134663256616a74616866542f00000000000000000000000000000000000000


Deployed Bytecode Sourcemap

70229:7289:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73666:517;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77338:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32158:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33671:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33188:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48985:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75254:120;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34371:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67761:318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67452:297;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48653:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70932:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74873:69;;;:::i;:::-;;34778:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70976:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49175:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74442:108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10522:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70666:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31869:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70823:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70743:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31600:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8032:103;;;:::i;:::-;;75417:382;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66857:263;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74763:65;;;:::i;:::-;;7384:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74597:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70860:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32327:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75102:101;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66571:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33914:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35034:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70773:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75842:444;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70705:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70899:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67132:308;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34140:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72365:1150;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8290:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74195:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70634:19;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73666:517;73710:13;7270;:11;:13::i;:::-;73763:5:::1;73746:22;;:13;;;;;;;;;;;:22;;;73738:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;73807:13;73823:10;73807:26;;73910:6;73906:85;73926:13;;;;;;;;;;;73922:17;;:1;:17;73906:85;;;73962:15;73971:5;73962:8;:15::i;:::-;;73941:3;;;;;:::i;:::-;;;;73906:85;;;;74056:4;74040:13;;:20;;;;;;;;;;;;;;;;;;74126:5;74110:39;;74119:5;74110:39;;;74133:15;74110:39;;;;;;:::i;:::-;;;;;;;;74169:4;74162:11;;;73666:517:::0;:::o;77338:175::-;77441:4;77467:36;77491:11;77467:23;:36::i;:::-;77460:43;;77338:175;;;:::o;32158:100::-;32212:13;32245:5;32238:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32158:100;:::o;33671:171::-;33747:7;33767:23;33782:7;33767:14;:23::i;:::-;33810:15;:24;33826:7;33810:24;;;;;;;;;;;;;;;;;;;;;33803:31;;33671:171;;;:::o;33188:417::-;33269:13;33285:23;33300:7;33285:14;:23::i;:::-;33269:39;;33333:5;33327:11;;:2;:11;;;33319:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;33427:5;33411:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;33436:37;33453:5;33460:12;:10;:12::i;:::-;33436:16;:37::i;:::-;33411:62;33389:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;33576:21;33585:2;33589:7;33576:8;:21::i;:::-;33258:347;33188:417;;:::o;48985:113::-;49046:7;49073:10;:17;;;;49066:24;;48985:113;:::o;75254:120::-;75301:7;75350:13;:11;:13::i;:::-;75331:16;;:32;;;;:::i;:::-;75323:41;;75254:120;:::o;34371:336::-;34566:41;34585:12;:10;:12::i;:::-;34599:7;34566:18;:41::i;:::-;34558:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;34671:28;34681:4;34687:2;34691:7;34671:9;:28::i;:::-;34371:336;;;:::o;67761:318::-;67848:12;7270:13;:11;:13::i;:::-;67880:9:::1;67875:168;67899:5;:12;67895:1;:16;67875:168;;;67939:36;67966:5;67972:1;67966:8;;;;;;;;:::i;:::-;;;;;;;;67939:26;:36::i;:::-;67935:95;;;68008:4;67998:14;;67935:95;67913:3;;;;;:::i;:::-;;;;67875:168;;;;67761:318:::0;;;:::o;67452:297::-;67527:12;7270:13;:11;:13::i;:::-;67558:9:::1;:15;67568:4;67558:15;;;;;;;;;;;;;;;;;;;;;;;;;67554:159;;;67610:5;67592:9;:15;67602:4;67592:15;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;67637:31;67663:4;67637:31;;;;;;:::i;:::-;;;;;;;;67695:4;67685:14;;67554:159;67452:297:::0;;;:::o;48653:256::-;48750:7;48786:23;48803:5;48786:16;:23::i;:::-;48778:5;:31;48770:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;48875:12;:19;48888:5;48875:19;;;;;;;;;;;;;;;:26;48895:5;48875:26;;;;;;;;;;;;48868:33;;48653:256;;;;:::o;70932:31::-;;;;:::o;74873:69::-;7270:13;:11;:13::i;:::-;74922:10:::1;:8;:10::i;:::-;74873:69::o:0;34778:185::-;34916:39;34933:4;34939:2;34943:7;34916:39;;;;;;;;;;;;:16;:39::i;:::-;34778:185;;;:::o;70976:48::-;;;;;;;;;;;;;;;;;:::o;49175:233::-;49250:7;49286:30;:28;:30::i;:::-;49278:5;:38;49270:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;49383:10;49394:5;49383:17;;;;;;;;:::i;:::-;;;;;;;;;;49376:24;;49175:233;;;:::o;74442:108::-;7270:13;:11;:13::i;:::-;74529:11:::1;74519:7;:21;;;;;;:::i;:::-;;74442:108:::0;:::o;10522:86::-;10569:4;10593:7;;;;;;;;;;;10586:14;;10522:86;:::o;70666:26::-;;;;;;;;;;;;;:::o;31869:222::-;31941:7;31961:13;31977:7;:16;31985:7;31977:16;;;;;;;;;;;;;;;;;;;;;31961:32;;32029:1;32012:19;;:5;:19;;;32004:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;32078:5;32071:12;;;31869:222;;;:::o;70823:28::-;;;;;;;;;;;;;:::o;70743:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31600:207::-;31672:7;31717:1;31700:19;;:5;:19;;;31692:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31783:9;:16;31793:5;31783:16;;;;;;;;;;;;;;;;31776:23;;31600:207;;;:::o;8032:103::-;7270:13;:11;:13::i;:::-;8097:30:::1;8124:1;8097:18;:30::i;:::-;8032:103::o:0;75417:382::-;75471:16;75502:23;75528:17;75538:6;75528:9;:17::i;:::-;75502:43;;75558:25;75600:15;75586:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75558:58;;75646:9;75641:117;75661:15;75657:1;:19;75641:117;;;75714:30;75734:6;75742:1;75714:19;:30::i;:::-;75700:8;75709:1;75700:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;75678:3;;;;;:::i;:::-;;;;75641:117;;;;75781:8;75774:15;;;;75417:382;;;:::o;66857:263::-;66927:12;7270:13;:11;:13::i;:::-;66959:9:::1;:15;66969:4;66959:15;;;;;;;;;;;;;;;;;;;;;;;;;66954:157;;67011:4;66993:9;:15;67003:4;66993:15;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;67037:29;67061:4;67037:29;;;;;;:::i;:::-;;;;;;;;67093:4;67083:14;;66954:157;66857:263:::0;;;:::o;74763:65::-;7270:13;:11;:13::i;:::-;74810:8:::1;:6;:8::i;:::-;74763:65::o:0;7384:87::-;7430:7;7457:6;;;;;;;;;;;7450:13;;7384:87;:::o;74597:123::-;7270:13;:11;:13::i;:::-;74697::::1;74681;:29;;;;;;:::i;:::-;;74597:123:::0;:::o;70860:26::-;;;;;;;;;;;;;:::o;32327:104::-;32383:13;32416:7;32409:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32327:104;:::o;75102:101::-;75143:7;75173:19;:9;:17;:19::i;:::-;75165:28;;75102:101;:::o;66571:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;33914:155::-;34009:52;34028:12;:10;:12::i;:::-;34042:8;34052;34009:18;:52::i;:::-;33914:155;;:::o;35034:323::-;35208:41;35227:12;:10;:12::i;:::-;35241:7;35208:18;:41::i;:::-;35200:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;35311:38;35325:4;35331:2;35335:7;35344:4;35311:13;:38::i;:::-;35034:323;;;;:::o;70773:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;75842:444::-;75941:13;75977:16;75985:7;75977;:16::i;:::-;75969:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;76062:28;76093:10;:8;:10::i;:::-;76062:41;;76162:1;76137:14;76131:28;:32;:145;;;;;;;;;;;;;;;;;76205:14;76221:18;:7;:16;:18::i;:::-;76241:13;76188:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;76131:145;76124:152;;;75842:444;;;:::o;70705:25::-;;;;;;;;;;;;;:::o;70899:24::-;;;;:::o;67132:308::-;67214:12;7270:13;:11;:13::i;:::-;67246:9:::1;67241:163;67265:5;:12;67261:1;:16;67241:163;;;67305:31;67327:5;67333:1;67327:8;;;;;;;;:::i;:::-;;;;;;;;67305:21;:31::i;:::-;67301:90;;;67369:4;67359:14;;67301:90;67279:3;;;;;:::i;:::-;;;;67241:163;;;;67132:308:::0;;;:::o;34140:164::-;34237:4;34261:18;:25;34280:5;34261:25;;;;;;;;;;;;;;;:35;34287:8;34261:35;;;;;;;;;;;;;;;;;;;;;;;;;34254:42;;34140:164;;;;:::o;72365:1150::-;72430:11;1812:1;2410:7;;:19;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;10127:19:::1;:17;:19::i;:::-;72481:4:::2;72464:21;;:13;;;;;;;;;;;:21;;;72456:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;72565:14;72582:13;:11;:13::i;:::-;72565:30;;72630:16;;72625:1;72616:6;:10;;;;:::i;:::-;:30;;72608:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;72722:18;72743:10;72722:31;;72832:9;:21;72842:10;72832:21;;;;;;;;;;;;;;;;;;;;;;;;;72827:453;;72934:5;;;;;;;;;;;:18;;;72953:10;72973:11;;;;;;;;;;;72987:9;;72934:63;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72926:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;73119:15;;;;;;;;;;;73086:48;;73114:1;73086:13;:25;73100:10;73086:25;;;;;;;;;;;;;;;;:29;;;;:::i;:::-;:48;;73078:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;73239:13;:25;73253:10;73239:25;;;;;;;;;;;;;;;;:27;;;;;;;;;:::i;:::-;;;;;;72827:453;73342:15;73360:20;73369:10;73360:8;:20::i;:::-;73342:38;;73441:10;73430:48;;;73453:7;73462:15;73430:48;;;;;;;:::i;:::-;;;;;;;;73498:7;73491:14;;;;;1768:1:::0;2722:7;:22;;;;72365:1150;:::o;8290:201::-;7270:13;:11;:13::i;:::-;8399:1:::1;8379:22;;:8;:22;;::::0;8371:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;8455:28;8474:8;8455:18;:28::i;:::-;8290:201:::0;:::o;74195:205::-;74260:13;7270;:11;:13::i;:::-;74306:1:::1;74296:7;:11;74288:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;74355:7;74343:9;:19;;;;74386:4;74379:11;;74195:205:::0;;;:::o;70634:19::-;;;;;;;;;;;;;:::o;65407:127::-;65514:1;65496:7;:14;;;:19;;;;;;;;;;;65407:127;:::o;7549:132::-;7624:12;:10;:12::i;:::-;7613:23;;:7;:5;:7::i;:::-;:23;;;7605:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7549:132::o;76498:260::-;76546:15;76586:19;:9;:17;:19::i;:::-;76576:29;;76656:21;:9;:19;:21::i;:::-;76726:22;76736:2;76740:7;76726:9;:22::i;:::-;76498:260;;;:::o;48345:224::-;48447:4;48486:35;48471:50;;;:11;:50;;;;:90;;;;48525:36;48549:11;48525:23;:36::i;:::-;48471:90;48464:97;;48345:224;;;:::o;41646:135::-;41728:16;41736:7;41728;:16::i;:::-;41720:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;41646:135;:::o;5935:98::-;5988:7;6015:10;6008:17;;5935:98;:::o;40925:174::-;41027:2;41000:15;:24;41016:7;41000:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;41083:7;41079:2;41045:46;;41054:23;41069:7;41054:14;:23::i;:::-;41045:46;;;;;;;;;;;;40925:174;;:::o;37158:264::-;37251:4;37268:13;37284:23;37299:7;37284:14;:23::i;:::-;37268:39;;37337:5;37326:16;;:7;:16;;;:52;;;;37346:32;37363:5;37370:7;37346:16;:32::i;:::-;37326:52;:87;;;;37406:7;37382:31;;:20;37394:7;37382:11;:20::i;:::-;:31;;;37326:87;37318:96;;;37158:264;;;;:::o;40181:625::-;40340:4;40313:31;;:23;40328:7;40313:14;:23::i;:::-;:31;;;40305:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;40419:1;40405:16;;:2;:16;;;40397:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;40475:39;40496:4;40502:2;40506:7;40475:20;:39::i;:::-;40579:29;40596:1;40600:7;40579:8;:29::i;:::-;40640:1;40621:9;:15;40631:4;40621:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;40669:1;40652:9;:13;40662:2;40652:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;40700:2;40681:7;:16;40689:7;40681:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;40739:7;40735:2;40720:27;;40729:4;40720:27;;;;;;;;;;;;40760:38;40780:4;40786:2;40790:7;40760:19;:38::i;:::-;40181:625;;;:::o;11377:120::-;10386:16;:14;:16::i;:::-;11446:5:::1;11436:7;;:15;;;;;;;;;;;;;;;;;;11467:22;11476:12;:10;:12::i;:::-;11467:22;;;;;;:::i;:::-;;;;;;;;11377:120::o:0;8651:191::-;8725:16;8744:6;;;;;;;;;;;8725:25;;8770:8;8761:6;;:17;;;;;;;;;;;;;;;;;;8825:8;8794:40;;8815:8;8794:40;;;;;;;;;;;;8714:128;8651:191;:::o;11118:118::-;10127:19;:17;:19::i;:::-;11188:4:::1;11178:7;;:14;;;;;;;;;;;;;;;;;;11208:20;11215:12;:10;:12::i;:::-;11208:20;;;;;;:::i;:::-;;;;;;;;11118:118::o:0;65285:114::-;65350:7;65377;:14;;;65370:21;;65285:114;;;:::o;41242:315::-;41397:8;41388:17;;:5;:17;;;41380:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;41484:8;41446:18;:25;41465:5;41446:25;;;;;;;;;;;;;;;:35;41472:8;41446:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;41530:8;41508:41;;41523:5;41508:41;;;41540:8;41508:41;;;;;;:::i;:::-;;;;;;;;41242:315;;;:::o;36238:313::-;36394:28;36404:4;36410:2;36414:7;36394:9;:28::i;:::-;36441:47;36464:4;36470:2;36474:7;36483:4;36441:22;:47::i;:::-;36433:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;36238:313;;;;:::o;36864:127::-;36929:4;36981:1;36953:30;;:7;:16;36961:7;36953:16;;;;;;;;;;;;;;;;;;;;;:30;;;;36946:37;;36864:127;;;:::o;76870:112::-;76930:13;76965:7;76958:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76870:112;:::o;3189:723::-;3245:13;3475:1;3466:5;:10;3462:53;;3493:10;;;;;;;;;;;;;;;;;;;;;3462:53;3525:12;3540:5;3525:20;;3556:14;3581:78;3596:1;3588:4;:9;3581:78;;3614:8;;;;;:::i;:::-;;;;3645:2;3637:10;;;;;:::i;:::-;;;3581:78;;;3669:19;3701:6;3691:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3669:39;;3719:154;3735:1;3726:5;:10;3719:154;;3763:1;3753:11;;;;;:::i;:::-;;;3830:2;3822:5;:10;;;;:::i;:::-;3809:2;:24;;;;:::i;:::-;3796:39;;3779:6;3786;3779:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3859:2;3850:11;;;;;:::i;:::-;;;3719:154;;;3897:6;3883:21;;;;;3189:723;;;;:::o;10681:108::-;10752:8;:6;:8::i;:::-;10751:9;10743:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;10681:108::o;37764:110::-;37840:26;37850:2;37854:7;37840:26;;;;;;;;;;;;:9;:26::i;:::-;37764:110;;:::o;31231:305::-;31333:4;31385:25;31370:40;;;:11;:40;;;;:105;;;;31442:33;31427:48;;;:11;:48;;;;31370:105;:158;;;;31492:36;31516:11;31492:23;:36::i;:::-;31370:158;31350:178;;31231:305;;;:::o;77125:201::-;77271:45;77298:4;77304:2;77308:7;77271:26;:45::i;:::-;77125:201;;;:::o;44281:125::-;;;;:::o;10866:108::-;10933:8;:6;:8::i;:::-;10925:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;10866:108::o;42345:853::-;42499:4;42520:15;:2;:13;;;:15::i;:::-;42516:675;;;42572:2;42556:36;;;42593:12;:10;:12::i;:::-;42607:4;42613:7;42622:4;42556:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42552:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42814:1;42797:6;:13;:18;42793:328;;42840:60;;;;;;;;;;:::i;:::-;;;;;;;;42793:328;43071:6;43065:13;43056:6;43052:2;43048:15;43041:38;42552:584;42688:41;;;42678:51;;;:6;:51;;;;42671:58;;;;;42516:675;43175:4;43168:11;;42345:853;;;;;;;:::o;38101:319::-;38230:18;38236:2;38240:7;38230:5;:18::i;:::-;38281:53;38312:1;38316:2;38320:7;38329:4;38281:22;:53::i;:::-;38259:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;38101:319;;;:::o;22893:157::-;22978:4;23017:25;23002:40;;;:11;:40;;;;22995:47;;22893:157;;;:::o;45091:275::-;45235:45;45262:4;45268:2;45272:7;45235:26;:45::i;:::-;45302:8;:6;:8::i;:::-;45301:9;45293:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;45091:275;;;:::o;12737:326::-;12797:4;13054:1;13032:7;:19;;;:23;13025:30;;12737:326;;;:::o;38756:439::-;38850:1;38836:16;;:2;:16;;;38828:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;38909:16;38917:7;38909;:16::i;:::-;38908:17;38900:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;38971:45;39000:1;39004:2;39008:7;38971:20;:45::i;:::-;39046:1;39029:9;:13;39039:2;39029:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39077:2;39058:7;:16;39066:7;39058:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39122:7;39118:2;39097:33;;39114:1;39097:33;;;;;;;;;;;;39143:44;39171:1;39175:2;39179:7;39143:19;:44::i;:::-;38756:439;;:::o;50021:589::-;50165:45;50192:4;50198:2;50202:7;50165:26;:45::i;:::-;50243:1;50227:18;;:4;:18;;;50223:187;;50262:40;50294:7;50262:31;:40::i;:::-;50223:187;;;50332:2;50324:10;;:4;:10;;;50320:90;;50351:47;50384:4;50390:7;50351:32;:47::i;:::-;50320:90;50223:187;50438:1;50424:16;;:2;:16;;;50420:183;;50457:45;50494:7;50457:36;:45::i;:::-;50420:183;;;50530:4;50524:10;;:2;:10;;;50520:83;;50551:40;50579:2;50583:7;50551:27;:40::i;:::-;50520:83;50420:183;50021:589;;;:::o;43770:126::-;;;;:::o;51333:164::-;51437:10;:17;;;;51410:15;:24;51426:7;51410:24;;;;;;;;;;;:44;;;;51465:10;51481:7;51465:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51333:164;:::o;52124:988::-;52390:22;52440:1;52415:22;52432:4;52415:16;:22::i;:::-;:26;;;;:::i;:::-;52390:51;;52452:18;52473:17;:26;52491:7;52473:26;;;;;;;;;;;;52452:47;;52620:14;52606:10;:28;52602:328;;52651:19;52673:12;:18;52686:4;52673:18;;;;;;;;;;;;;;;:34;52692:14;52673:34;;;;;;;;;;;;52651:56;;52757:11;52724:12;:18;52737:4;52724:18;;;;;;;;;;;;;;;:30;52743:10;52724:30;;;;;;;;;;;:44;;;;52874:10;52841:17;:30;52859:11;52841:30;;;;;;;;;;;:43;;;;52636:294;52602:328;53026:17;:26;53044:7;53026:26;;;;;;;;;;;53019:33;;;53070:12;:18;53083:4;53070:18;;;;;;;;;;;;;;;:34;53089:14;53070:34;;;;;;;;;;;53063:41;;;52205:907;;52124:988;;:::o;53407:1079::-;53660:22;53705:1;53685:10;:17;;;;:21;;;;:::i;:::-;53660:46;;53717:18;53738:15;:24;53754:7;53738:24;;;;;;;;;;;;53717:45;;54089:19;54111:10;54122:14;54111:26;;;;;;;;:::i;:::-;;;;;;;;;;54089:48;;54175:11;54150:10;54161;54150:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;54286:10;54255:15;:28;54271:11;54255:28;;;;;;;;;;;:41;;;;54427:15;:24;54443:7;54427:24;;;;;;;;;;;54420:31;;;54462:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53478:1008;;;53407:1079;:::o;50911:221::-;50996:14;51013:20;51030:2;51013:16;:20::i;:::-;50996:37;;51071:7;51044:12;:16;51057:2;51044:16;;;;;;;;;;;;;;;:24;51061:6;51044:24;;;;;;;;;;;:34;;;;51118:6;51089:17;:26;51107:7;51089:26;;;;;;;;;;;:35;;;;50985:147;50911:221;;:::o;7:90:1:-;41:7;84:5;77:13;70:21;59:32;;7:90;;;:::o;103:109::-;184:21;199:5;184:21;:::i;:::-;179:3;172:34;103:109;;:::o;218:210::-;305:4;343:2;332:9;328:18;320:26;;356:65;418:1;407:9;403:17;394:6;356:65;:::i;:::-;218:210;;;;:::o;434:75::-;467:6;500:2;494:9;484:19;;434:75;:::o;515:117::-;624:1;621;614:12;638:117;747:1;744;737:12;761:149;797:7;837:66;830:5;826:78;815:89;;761:149;;;:::o;916:120::-;988:23;1005:5;988:23;:::i;:::-;981:5;978:34;968:62;;1026:1;1023;1016:12;968:62;916:120;:::o;1042:137::-;1087:5;1125:6;1112:20;1103:29;;1141:32;1167:5;1141:32;:::i;:::-;1042:137;;;;:::o;1185:327::-;1243:6;1292:2;1280:9;1271:7;1267:23;1263:32;1260:119;;;1298:79;;:::i;:::-;1260:119;1418:1;1443:52;1487:7;1478:6;1467:9;1463:22;1443:52;:::i;:::-;1433:62;;1389:116;1185:327;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:117::-;5976:1;5973;5966:12;5990:180;6038:77;6035:1;6028:88;6135:4;6132:1;6125:15;6159:4;6156:1;6149:15;6176:281;6259:27;6281:4;6259:27;:::i;:::-;6251:6;6247:40;6389:6;6377:10;6374:22;6353:18;6341:10;6338:34;6335:62;6332:88;;;6400:18;;:::i;:::-;6332:88;6440:10;6436:2;6429:22;6219:238;6176:281;;:::o;6463:129::-;6497:6;6524:20;;:::i;:::-;6514:30;;6553:33;6581:4;6573:6;6553:33;:::i;:::-;6463:129;;;:::o;6598:311::-;6675:4;6765:18;6757:6;6754:30;6751:56;;;6787:18;;:::i;:::-;6751:56;6837:4;6829:6;6825:17;6817:25;;6897:4;6891;6887:15;6879:23;;6598:311;;;:::o;6915:117::-;7024:1;7021;7014:12;7055:710;7151:5;7176:81;7192:64;7249:6;7192:64;:::i;:::-;7176:81;:::i;:::-;7167:90;;7277:5;7306:6;7299:5;7292:21;7340:4;7333:5;7329:16;7322:23;;7393:4;7385:6;7381:17;7373:6;7369:30;7422:3;7414:6;7411:15;7408:122;;;7441:79;;:::i;:::-;7408:122;7556:6;7539:220;7573:6;7568:3;7565:15;7539:220;;;7648:3;7677:37;7710:3;7698:10;7677:37;:::i;:::-;7672:3;7665:50;7744:4;7739:3;7735:14;7728:21;;7615:144;7599:4;7594:3;7590:14;7583:21;;7539:220;;;7543:21;7157:608;;7055:710;;;;;:::o;7788:370::-;7859:5;7908:3;7901:4;7893:6;7889:17;7885:27;7875:122;;7916:79;;:::i;:::-;7875:122;8033:6;8020:20;8058:94;8148:3;8140:6;8133:4;8125:6;8121:17;8058:94;:::i;:::-;8049:103;;7865:293;7788:370;;;;:::o;8164:539::-;8248:6;8297:2;8285:9;8276:7;8272:23;8268:32;8265:119;;;8303:79;;:::i;:::-;8265:119;8451:1;8440:9;8436:17;8423:31;8481:18;8473:6;8470:30;8467:117;;;8503:79;;:::i;:::-;8467:117;8608:78;8678:7;8669:6;8658:9;8654:22;8608:78;:::i;:::-;8598:88;;8394:302;8164:539;;;;:::o;8709:329::-;8768:6;8817:2;8805:9;8796:7;8792:23;8788:32;8785:119;;;8823:79;;:::i;:::-;8785:119;8943:1;8968:53;9013:7;9004:6;8993:9;8989:22;8968:53;:::i;:::-;8958:63;;8914:117;8709:329;;;;:::o;9044:117::-;9153:1;9150;9143:12;9167:308;9229:4;9319:18;9311:6;9308:30;9305:56;;;9341:18;;:::i;:::-;9305:56;9379:29;9401:6;9379:29;:::i;:::-;9371:37;;9463:4;9457;9453:15;9445:23;;9167:308;;;:::o;9481:146::-;9578:6;9573:3;9568;9555:30;9619:1;9610:6;9605:3;9601:16;9594:27;9481:146;;;:::o;9633:425::-;9711:5;9736:66;9752:49;9794:6;9752:49;:::i;:::-;9736:66;:::i;:::-;9727:75;;9825:6;9818:5;9811:21;9863:4;9856:5;9852:16;9901:3;9892:6;9887:3;9883:16;9880:25;9877:112;;;9908:79;;:::i;:::-;9877:112;9998:54;10045:6;10040:3;10035;9998:54;:::i;:::-;9717:341;9633:425;;;;;:::o;10078:340::-;10134:5;10183:3;10176:4;10168:6;10164:17;10160:27;10150:122;;10191:79;;:::i;:::-;10150:122;10308:6;10295:20;10333:79;10408:3;10400:6;10393:4;10385:6;10381:17;10333:79;:::i;:::-;10324:88;;10140:278;10078:340;;;;:::o;10424:509::-;10493:6;10542:2;10530:9;10521:7;10517:23;10513:32;10510:119;;;10548:79;;:::i;:::-;10510:119;10696:1;10685:9;10681:17;10668:31;10726:18;10718:6;10715:30;10712:117;;;10748:79;;:::i;:::-;10712:117;10853:63;10908:7;10899:6;10888:9;10884:22;10853:63;:::i;:::-;10843:73;;10639:287;10424:509;;;;:::o;10939:86::-;10974:7;11014:4;11007:5;11003:16;10992:27;;10939:86;;;:::o;11031:112::-;11114:22;11130:5;11114:22;:::i;:::-;11109:3;11102:35;11031:112;;:::o;11149:214::-;11238:4;11276:2;11265:9;11261:18;11253:26;;11289:67;11353:1;11342:9;11338:17;11329:6;11289:67;:::i;:::-;11149:214;;;;:::o;11369:114::-;11436:6;11470:5;11464:12;11454:22;;11369:114;;;:::o;11489:184::-;11588:11;11622:6;11617:3;11610:19;11662:4;11657:3;11653:14;11638:29;;11489:184;;;;:::o;11679:132::-;11746:4;11769:3;11761:11;;11799:4;11794:3;11790:14;11782:22;;11679:132;;;:::o;11817:108::-;11894:24;11912:5;11894:24;:::i;:::-;11889:3;11882:37;11817:108;;:::o;11931:179::-;12000:10;12021:46;12063:3;12055:6;12021:46;:::i;:::-;12099:4;12094:3;12090:14;12076:28;;11931:179;;;;:::o;12116:113::-;12186:4;12218;12213:3;12209:14;12201:22;;12116:113;;;:::o;12265:732::-;12384:3;12413:54;12461:5;12413:54;:::i;:::-;12483:86;12562:6;12557:3;12483:86;:::i;:::-;12476:93;;12593:56;12643:5;12593:56;:::i;:::-;12672:7;12703:1;12688:284;12713:6;12710:1;12707:13;12688:284;;;12789:6;12783:13;12816:63;12875:3;12860:13;12816:63;:::i;:::-;12809:70;;12902:60;12955:6;12902:60;:::i;:::-;12892:70;;12748:224;12735:1;12732;12728:9;12723:14;;12688:284;;;12692:14;12988:3;12981:10;;12389:608;;;12265:732;;;;:::o;13003:373::-;13146:4;13184:2;13173:9;13169:18;13161:26;;13233:9;13227:4;13223:20;13219:1;13208:9;13204:17;13197:47;13261:108;13364:4;13355:6;13261:108;:::i;:::-;13253:116;;13003:373;;;;:::o;13382:116::-;13452:21;13467:5;13452:21;:::i;:::-;13445:5;13442:32;13432:60;;13488:1;13485;13478:12;13432:60;13382:116;:::o;13504:133::-;13547:5;13585:6;13572:20;13563:29;;13601:30;13625:5;13601:30;:::i;:::-;13504:133;;;;:::o;13643:468::-;13708:6;13716;13765:2;13753:9;13744:7;13740:23;13736:32;13733:119;;;13771:79;;:::i;:::-;13733:119;13891:1;13916:53;13961:7;13952:6;13941:9;13937:22;13916:53;:::i;:::-;13906:63;;13862:117;14018:2;14044:50;14086:7;14077:6;14066:9;14062:22;14044:50;:::i;:::-;14034:60;;13989:115;13643:468;;;;;:::o;14117:307::-;14178:4;14268:18;14260:6;14257:30;14254:56;;;14290:18;;:::i;:::-;14254:56;14328:29;14350:6;14328:29;:::i;:::-;14320:37;;14412:4;14406;14402:15;14394:23;;14117:307;;;:::o;14430:423::-;14507:5;14532:65;14548:48;14589:6;14548:48;:::i;:::-;14532:65;:::i;:::-;14523:74;;14620:6;14613:5;14606:21;14658:4;14651:5;14647:16;14696:3;14687:6;14682:3;14678:16;14675:25;14672:112;;;14703:79;;:::i;:::-;14672:112;14793:54;14840:6;14835:3;14830;14793:54;:::i;:::-;14513:340;14430:423;;;;;:::o;14872:338::-;14927:5;14976:3;14969:4;14961:6;14957:17;14953:27;14943:122;;14984:79;;:::i;:::-;14943:122;15101:6;15088:20;15126:78;15200:3;15192:6;15185:4;15177:6;15173:17;15126:78;:::i;:::-;15117:87;;14933:277;14872:338;;;;:::o;15216:943::-;15311:6;15319;15327;15335;15384:3;15372:9;15363:7;15359:23;15355:33;15352:120;;;15391:79;;:::i;:::-;15352:120;15511:1;15536:53;15581:7;15572:6;15561:9;15557:22;15536:53;:::i;:::-;15526:63;;15482:117;15638:2;15664:53;15709:7;15700:6;15689:9;15685:22;15664:53;:::i;:::-;15654:63;;15609:118;15766:2;15792:53;15837:7;15828:6;15817:9;15813:22;15792:53;:::i;:::-;15782:63;;15737:118;15922:2;15911:9;15907:18;15894:32;15953:18;15945:6;15942:30;15939:117;;;15975:79;;:::i;:::-;15939:117;16080:62;16134:7;16125:6;16114:9;16110:22;16080:62;:::i;:::-;16070:72;;15865:287;15216:943;;;;;;;:::o;16165:474::-;16233:6;16241;16290:2;16278:9;16269:7;16265:23;16261:32;16258:119;;;16296:79;;:::i;:::-;16258:119;16416:1;16441:53;16486:7;16477:6;16466:9;16462:22;16441:53;:::i;:::-;16431:63;;16387:117;16543:2;16569:53;16614:7;16605:6;16594:9;16590:22;16569:53;:::i;:::-;16559:63;;16514:118;16165:474;;;;;:::o;16645:60::-;16673:3;16694:5;16687:12;;16645:60;;;:::o;16711:142::-;16761:9;16794:53;16812:34;16821:24;16839:5;16821:24;:::i;:::-;16812:34;:::i;:::-;16794:53;:::i;:::-;16781:66;;16711:142;;;:::o;16859:126::-;16909:9;16942:37;16973:5;16942:37;:::i;:::-;16929:50;;16859:126;;;:::o;16991:141::-;17056:9;17089:37;17120:5;17089:37;:::i;:::-;17076:50;;16991:141;;;:::o;17138:161::-;17240:52;17286:5;17240:52;:::i;:::-;17235:3;17228:65;17138:161;;:::o;17305:252::-;17413:4;17451:2;17440:9;17436:18;17428:26;;17464:86;17547:1;17536:9;17532:17;17523:6;17464:86;:::i;:::-;17305:252;;;;:::o;17563:167::-;17703:19;17699:1;17691:6;17687:14;17680:43;17563:167;:::o;17736:366::-;17878:3;17899:67;17963:2;17958:3;17899:67;:::i;:::-;17892:74;;17975:93;18064:3;17975:93;:::i;:::-;18093:2;18088:3;18084:12;18077:19;;17736:366;;;:::o;18108:419::-;18274:4;18312:2;18301:9;18297:18;18289:26;;18361:9;18355:4;18351:20;18347:1;18336:9;18332:17;18325:47;18389:131;18515:4;18389:131;:::i;:::-;18381:139;;18108:419;;;:::o;18533:180::-;18581:77;18578:1;18571:88;18678:4;18675:1;18668:15;18702:4;18699:1;18692:15;18719:233;18758:3;18781:24;18799:5;18781:24;:::i;:::-;18772:33;;18827:66;18820:5;18817:77;18814:103;;18897:18;;:::i;:::-;18814:103;18944:1;18937:5;18933:13;18926:20;;18719:233;;;:::o;18958:180::-;19006:77;19003:1;18996:88;19103:4;19100:1;19093:15;19127:4;19124:1;19117:15;19144:320;19188:6;19225:1;19219:4;19215:12;19205:22;;19272:1;19266:4;19262:12;19293:18;19283:81;;19349:4;19341:6;19337:17;19327:27;;19283:81;19411:2;19403:6;19400:14;19380:18;19377:38;19374:84;;19430:18;;:::i;:::-;19374:84;19195:269;19144:320;;;:::o;19470:220::-;19610:34;19606:1;19598:6;19594:14;19587:58;19679:3;19674:2;19666:6;19662:15;19655:28;19470:220;:::o;19696:366::-;19838:3;19859:67;19923:2;19918:3;19859:67;:::i;:::-;19852:74;;19935:93;20024:3;19935:93;:::i;:::-;20053:2;20048:3;20044:12;20037:19;;19696:366;;;:::o;20068:419::-;20234:4;20272:2;20261:9;20257:18;20249:26;;20321:9;20315:4;20311:20;20307:1;20296:9;20292:17;20285:47;20349:131;20475:4;20349:131;:::i;:::-;20341:139;;20068:419;;;:::o;20493:249::-;20633:34;20629:1;20621:6;20617:14;20610:58;20702:32;20697:2;20689:6;20685:15;20678:57;20493:249;:::o;20748:366::-;20890:3;20911:67;20975:2;20970:3;20911:67;:::i;:::-;20904:74;;20987:93;21076:3;20987:93;:::i;:::-;21105:2;21100:3;21096:12;21089:19;;20748:366;;;:::o;21120:419::-;21286:4;21324:2;21313:9;21309:18;21301:26;;21373:9;21367:4;21363:20;21359:1;21348:9;21344:17;21337:47;21401:131;21527:4;21401:131;:::i;:::-;21393:139;;21120:419;;;:::o;21545:194::-;21585:4;21605:20;21623:1;21605:20;:::i;:::-;21600:25;;21639:20;21657:1;21639:20;:::i;:::-;21634:25;;21683:1;21680;21676:9;21668:17;;21707:1;21701:4;21698:11;21695:37;;;21712:18;;:::i;:::-;21695:37;21545:194;;;;:::o;21745:233::-;21885:34;21881:1;21873:6;21869:14;21862:58;21954:16;21949:2;21941:6;21937:15;21930:41;21745:233;:::o;21984:366::-;22126:3;22147:67;22211:2;22206:3;22147:67;:::i;:::-;22140:74;;22223:93;22312:3;22223:93;:::i;:::-;22341:2;22336:3;22332:12;22325:19;;21984:366;;;:::o;22356:419::-;22522:4;22560:2;22549:9;22545:18;22537:26;;22609:9;22603:4;22599:20;22595:1;22584:9;22580:17;22573:47;22637:131;22763:4;22637:131;:::i;:::-;22629:139;;22356:419;;;:::o;22781:180::-;22829:77;22826:1;22819:88;22926:4;22923:1;22916:15;22950:4;22947:1;22940:15;22967:230;23107:34;23103:1;23095:6;23091:14;23084:58;23176:13;23171:2;23163:6;23159:15;23152:38;22967:230;:::o;23203:366::-;23345:3;23366:67;23430:2;23425:3;23366:67;:::i;:::-;23359:74;;23442:93;23531:3;23442:93;:::i;:::-;23560:2;23555:3;23551:12;23544:19;;23203:366;;;:::o;23575:419::-;23741:4;23779:2;23768:9;23764:18;23756:26;;23828:9;23822:4;23818:20;23814:1;23803:9;23799:17;23792:47;23856:131;23982:4;23856:131;:::i;:::-;23848:139;;23575:419;;;:::o;24000:231::-;24140:34;24136:1;24128:6;24124:14;24117:58;24209:14;24204:2;24196:6;24192:15;24185:39;24000:231;:::o;24237:366::-;24379:3;24400:67;24464:2;24459:3;24400:67;:::i;:::-;24393:74;;24476:93;24565:3;24476:93;:::i;:::-;24594:2;24589:3;24585:12;24578:19;;24237:366;;;:::o;24609:419::-;24775:4;24813:2;24802:9;24798:18;24790:26;;24862:9;24856:4;24852:20;24848:1;24837:9;24833:17;24826:47;24890:131;25016:4;24890:131;:::i;:::-;24882:139;;24609:419;;;:::o;25034:141::-;25083:4;25106:3;25098:11;;25129:3;25126:1;25119:14;25163:4;25160:1;25150:18;25142:26;;25034:141;;;:::o;25181:93::-;25218:6;25265:2;25260;25253:5;25249:14;25245:23;25235:33;;25181:93;;;:::o;25280:107::-;25324:8;25374:5;25368:4;25364:16;25343:37;;25280:107;;;;:::o;25393:393::-;25462:6;25512:1;25500:10;25496:18;25535:97;25565:66;25554:9;25535:97;:::i;:::-;25653:39;25683:8;25672:9;25653:39;:::i;:::-;25641:51;;25725:4;25721:9;25714:5;25710:21;25701:30;;25774:4;25764:8;25760:19;25753:5;25750:30;25740:40;;25469:317;;25393:393;;;;;:::o;25792:142::-;25842:9;25875:53;25893:34;25902:24;25920:5;25902:24;:::i;:::-;25893:34;:::i;:::-;25875:53;:::i;:::-;25862:66;;25792:142;;;:::o;25940:75::-;25983:3;26004:5;25997:12;;25940:75;;;:::o;26021:269::-;26131:39;26162:7;26131:39;:::i;:::-;26192:91;26241:41;26265:16;26241:41;:::i;:::-;26233:6;26226:4;26220:11;26192:91;:::i;:::-;26186:4;26179:105;26097:193;26021:269;;;:::o;26296:73::-;26341:3;26296:73;:::o;26375:189::-;26452:32;;:::i;:::-;26493:65;26551:6;26543;26537:4;26493:65;:::i;:::-;26428:136;26375:189;;:::o;26570:186::-;26630:120;26647:3;26640:5;26637:14;26630:120;;;26701:39;26738:1;26731:5;26701:39;:::i;:::-;26674:1;26667:5;26663:13;26654:22;;26630:120;;;26570:186;;:::o;26762:543::-;26863:2;26858:3;26855:11;26852:446;;;26897:38;26929:5;26897:38;:::i;:::-;26981:29;26999:10;26981:29;:::i;:::-;26971:8;26967:44;27164:2;27152:10;27149:18;27146:49;;;27185:8;27170:23;;27146:49;27208:80;27264:22;27282:3;27264:22;:::i;:::-;27254:8;27250:37;27237:11;27208:80;:::i;:::-;26867:431;;26852:446;26762:543;;;:::o;27311:117::-;27365:8;27415:5;27409:4;27405:16;27384:37;;27311:117;;;;:::o;27434:169::-;27478:6;27511:51;27559:1;27555:6;27547:5;27544:1;27540:13;27511:51;:::i;:::-;27507:56;27592:4;27586;27582:15;27572:25;;27485:118;27434:169;;;;:::o;27608:295::-;27684:4;27830:29;27855:3;27849:4;27830:29;:::i;:::-;27822:37;;27892:3;27889:1;27885:11;27879:4;27876:21;27868:29;;27608:295;;;;:::o;27908:1395::-;28025:37;28058:3;28025:37;:::i;:::-;28127:18;28119:6;28116:30;28113:56;;;28149:18;;:::i;:::-;28113:56;28193:38;28225:4;28219:11;28193:38;:::i;:::-;28278:67;28338:6;28330;28324:4;28278:67;:::i;:::-;28372:1;28396:4;28383:17;;28428:2;28420:6;28417:14;28445:1;28440:618;;;;29102:1;29119:6;29116:77;;;29168:9;29163:3;29159:19;29153:26;29144:35;;29116:77;29219:67;29279:6;29272:5;29219:67;:::i;:::-;29213:4;29206:81;29075:222;28410:887;;28440:618;28492:4;28488:9;28480:6;28476:22;28526:37;28558:4;28526:37;:::i;:::-;28585:1;28599:208;28613:7;28610:1;28607:14;28599:208;;;28692:9;28687:3;28683:19;28677:26;28669:6;28662:42;28743:1;28735:6;28731:14;28721:24;;28790:2;28779:9;28775:18;28762:31;;28636:4;28633:1;28629:12;28624:17;;28599:208;;;28835:6;28826:7;28823:19;28820:179;;;28893:9;28888:3;28884:19;28878:26;28936:48;28978:4;28970:6;28966:17;28955:9;28936:48;:::i;:::-;28928:6;28921:64;28843:156;28820:179;29045:1;29041;29033:6;29029:14;29025:22;29019:4;29012:36;28447:611;;;28410:887;;28000:1303;;;27908:1395;;:::o;29309:174::-;29449:26;29445:1;29437:6;29433:14;29426:50;29309:174;:::o;29489:366::-;29631:3;29652:67;29716:2;29711:3;29652:67;:::i;:::-;29645:74;;29728:93;29817:3;29728:93;:::i;:::-;29846:2;29841:3;29837:12;29830:19;;29489:366;;;:::o;29861:419::-;30027:4;30065:2;30054:9;30050:18;30042:26;;30114:9;30108:4;30104:20;30100:1;30089:9;30085:17;30078:47;30142:131;30268:4;30142:131;:::i;:::-;30134:139;;29861:419;;;:::o;30286:228::-;30426:34;30422:1;30414:6;30410:14;30403:58;30495:11;30490:2;30482:6;30478:15;30471:36;30286:228;:::o;30520:366::-;30662:3;30683:67;30747:2;30742:3;30683:67;:::i;:::-;30676:74;;30759:93;30848:3;30759:93;:::i;:::-;30877:2;30872:3;30868:12;30861:19;;30520:366;;;:::o;30892:419::-;31058:4;31096:2;31085:9;31081:18;31073:26;;31145:9;31139:4;31135:20;31131:1;31120:9;31116:17;31109:47;31173:131;31299:4;31173:131;:::i;:::-;31165:139;;30892:419;;;:::o;31317:234::-;31457:34;31453:1;31445:6;31441:14;31434:58;31526:17;31521:2;31513:6;31509:15;31502:42;31317:234;:::o;31557:366::-;31699:3;31720:67;31784:2;31779:3;31720:67;:::i;:::-;31713:74;;31796:93;31885:3;31796:93;:::i;:::-;31914:2;31909:3;31905:12;31898:19;;31557:366;;;:::o;31929:419::-;32095:4;32133:2;32122:9;32118:18;32110:26;;32182:9;32176:4;32172:20;32168:1;32157:9;32153:17;32146:47;32210:131;32336:4;32210:131;:::i;:::-;32202:139;;31929:419;;;:::o;32354:148::-;32456:11;32493:3;32478:18;;32354:148;;;;:::o;32508:390::-;32614:3;32642:39;32675:5;32642:39;:::i;:::-;32697:89;32779:6;32774:3;32697:89;:::i;:::-;32690:96;;32795:65;32853:6;32848:3;32841:4;32834:5;32830:16;32795:65;:::i;:::-;32885:6;32880:3;32876:16;32869:23;;32618:280;32508:390;;;;:::o;32928:874::-;33031:3;33068:5;33062:12;33097:36;33123:9;33097:36;:::i;:::-;33149:89;33231:6;33226:3;33149:89;:::i;:::-;33142:96;;33269:1;33258:9;33254:17;33285:1;33280:166;;;;33460:1;33455:341;;;;33247:549;;33280:166;33364:4;33360:9;33349;33345:25;33340:3;33333:38;33426:6;33419:14;33412:22;33404:6;33400:35;33395:3;33391:45;33384:52;;33280:166;;33455:341;33522:38;33554:5;33522:38;:::i;:::-;33582:1;33596:154;33610:6;33607:1;33604:13;33596:154;;;33684:7;33678:14;33674:1;33669:3;33665:11;33658:35;33734:1;33725:7;33721:15;33710:26;;33632:4;33629:1;33625:12;33620:17;;33596:154;;;33779:6;33774:3;33770:16;33763:23;;33462:334;;33247:549;;33035:767;;32928:874;;;;:::o;33808:589::-;34033:3;34055:95;34146:3;34137:6;34055:95;:::i;:::-;34048:102;;34167:95;34258:3;34249:6;34167:95;:::i;:::-;34160:102;;34279:92;34367:3;34358:6;34279:92;:::i;:::-;34272:99;;34388:3;34381:10;;33808:589;;;;;;:::o;34403:181::-;34543:33;34539:1;34531:6;34527:14;34520:57;34403:181;:::o;34590:366::-;34732:3;34753:67;34817:2;34812:3;34753:67;:::i;:::-;34746:74;;34829:93;34918:3;34829:93;:::i;:::-;34947:2;34942:3;34938:12;34931:19;;34590:366;;;:::o;34962:419::-;35128:4;35166:2;35155:9;35151:18;35143:26;;35215:9;35209:4;35205:20;35201:1;35190:9;35186:17;35179:47;35243:131;35369:4;35243:131;:::i;:::-;35235:139;;34962:419;;;:::o;35387:168::-;35527:20;35523:1;35515:6;35511:14;35504:44;35387:168;:::o;35561:366::-;35703:3;35724:67;35788:2;35783:3;35724:67;:::i;:::-;35717:74;;35800:93;35889:3;35800:93;:::i;:::-;35918:2;35913:3;35909:12;35902:19;;35561:366;;;:::o;35933:419::-;36099:4;36137:2;36126:9;36122:18;36114:26;;36186:9;36180:4;36176:20;36172:1;36161:9;36157:17;36150:47;36214:131;36340:4;36214:131;:::i;:::-;36206:139;;35933:419;;;:::o;36358:191::-;36398:3;36417:20;36435:1;36417:20;:::i;:::-;36412:25;;36451:20;36469:1;36451:20;:::i;:::-;36446:25;;36494:1;36491;36487:9;36480:16;;36515:3;36512:1;36509:10;36506:36;;;36522:18;;:::i;:::-;36506:36;36358:191;;;;:::o;36555:168::-;36695:20;36691:1;36683:6;36679:14;36672:44;36555:168;:::o;36729:366::-;36871:3;36892:67;36956:2;36951:3;36892:67;:::i;:::-;36885:74;;36968:93;37057:3;36968:93;:::i;:::-;37086:2;37081:3;37077:12;37070:19;;36729:366;;;:::o;37101:419::-;37267:4;37305:2;37294:9;37290:18;37282:26;;37354:9;37348:4;37344:20;37340:1;37329:9;37325:17;37318:47;37382:131;37508:4;37382:131;:::i;:::-;37374:139;;37101:419;;;:::o;37526:442::-;37675:4;37713:2;37702:9;37698:18;37690:26;;37726:71;37794:1;37783:9;37779:17;37770:6;37726:71;:::i;:::-;37807:72;37875:2;37864:9;37860:18;37851:6;37807:72;:::i;:::-;37889;37957:2;37946:9;37942:18;37933:6;37889:72;:::i;:::-;37526:442;;;;;;:::o;37974:137::-;38028:5;38059:6;38053:13;38044:22;;38075:30;38099:5;38075:30;:::i;:::-;37974:137;;;;:::o;38117:345::-;38184:6;38233:2;38221:9;38212:7;38208:23;38204:32;38201:119;;;38239:79;;:::i;:::-;38201:119;38359:1;38384:61;38437:7;38428:6;38417:9;38413:22;38384:61;:::i;:::-;38374:71;;38330:125;38117:345;;;;:::o;38468:167::-;38608:19;38604:1;38596:6;38592:14;38585:43;38468:167;:::o;38641:366::-;38783:3;38804:67;38868:2;38863:3;38804:67;:::i;:::-;38797:74;;38880:93;38969:3;38880:93;:::i;:::-;38998:2;38993:3;38989:12;38982:19;;38641:366;;;:::o;39013:419::-;39179:4;39217:2;39206:9;39202:18;39194:26;;39266:9;39260:4;39256:20;39252:1;39241:9;39237:17;39230:47;39294:131;39420:4;39294:131;:::i;:::-;39286:139;;39013:419;;;:::o;39438:166::-;39578:18;39574:1;39566:6;39562:14;39555:42;39438:166;:::o;39610:366::-;39752:3;39773:67;39837:2;39832:3;39773:67;:::i;:::-;39766:74;;39849:93;39938:3;39849:93;:::i;:::-;39967:2;39962:3;39958:12;39951:19;;39610:366;;;:::o;39982:419::-;40148:4;40186:2;40175:9;40171:18;40163:26;;40235:9;40229:4;40225:20;40221:1;40210:9;40206:17;40199:47;40263:131;40389:4;40263:131;:::i;:::-;40255:139;;39982:419;;;:::o;40407:332::-;40528:4;40566:2;40555:9;40551:18;40543:26;;40579:71;40647:1;40636:9;40632:17;40623:6;40579:71;:::i;:::-;40660:72;40728:2;40717:9;40713:18;40704:6;40660:72;:::i;:::-;40407:332;;;;;:::o;40745:225::-;40885:34;40881:1;40873:6;40869:14;40862:58;40954:8;40949:2;40941:6;40937:15;40930:33;40745:225;:::o;40976:366::-;41118:3;41139:67;41203:2;41198:3;41139:67;:::i;:::-;41132:74;;41215:93;41304:3;41215:93;:::i;:::-;41333:2;41328:3;41324:12;41317:19;;40976:366;;;:::o;41348:419::-;41514:4;41552:2;41541:9;41537:18;41529:26;;41601:9;41595:4;41591:20;41587:1;41576:9;41572:17;41565:47;41629:131;41755:4;41629:131;:::i;:::-;41621:139;;41348:419;;;:::o;41773:164::-;41913:16;41909:1;41901:6;41897:14;41890:40;41773:164;:::o;41943:366::-;42085:3;42106:67;42170:2;42165:3;42106:67;:::i;:::-;42099:74;;42182:93;42271:3;42182:93;:::i;:::-;42300:2;42295:3;42291:12;42284:19;;41943:366;;;:::o;42315:419::-;42481:4;42519:2;42508:9;42504:18;42496:26;;42568:9;42562:4;42558:20;42554:1;42543:9;42539:17;42532:47;42596:131;42722:4;42596:131;:::i;:::-;42588:139;;42315:419;;;:::o;42740:182::-;42880:34;42876:1;42868:6;42864:14;42857:58;42740:182;:::o;42928:366::-;43070:3;43091:67;43155:2;43150:3;43091:67;:::i;:::-;43084:74;;43167:93;43256:3;43167:93;:::i;:::-;43285:2;43280:3;43276:12;43269:19;;42928:366;;;:::o;43300:419::-;43466:4;43504:2;43493:9;43489:18;43481:26;;43553:9;43547:4;43543:20;43539:1;43528:9;43524:17;43517:47;43581:131;43707:4;43581:131;:::i;:::-;43573:139;;43300:419;;;:::o;43725:224::-;43865:34;43861:1;43853:6;43849:14;43842:58;43934:7;43929:2;43921:6;43917:15;43910:32;43725:224;:::o;43955:366::-;44097:3;44118:67;44182:2;44177:3;44118:67;:::i;:::-;44111:74;;44194:93;44283:3;44194:93;:::i;:::-;44312:2;44307:3;44303:12;44296:19;;43955:366;;;:::o;44327:419::-;44493:4;44531:2;44520:9;44516:18;44508:26;;44580:9;44574:4;44570:20;44566:1;44555:9;44551:17;44544:47;44608:131;44734:4;44608:131;:::i;:::-;44600:139;;44327:419;;;:::o;44752:223::-;44892:34;44888:1;44880:6;44876:14;44869:58;44961:6;44956:2;44948:6;44944:15;44937:31;44752:223;:::o;44981:366::-;45123:3;45144:67;45208:2;45203:3;45144:67;:::i;:::-;45137:74;;45220:93;45309:3;45220:93;:::i;:::-;45338:2;45333:3;45329:12;45322:19;;44981:366;;;:::o;45353:419::-;45519:4;45557:2;45546:9;45542:18;45534:26;;45606:9;45600:4;45596:20;45592:1;45581:9;45577:17;45570:47;45634:131;45760:4;45634:131;:::i;:::-;45626:139;;45353:419;;;:::o;45778:175::-;45918:27;45914:1;45906:6;45902:14;45895:51;45778:175;:::o;45959:366::-;46101:3;46122:67;46186:2;46181:3;46122:67;:::i;:::-;46115:74;;46198:93;46287:3;46198:93;:::i;:::-;46316:2;46311:3;46307:12;46300:19;;45959:366;;;:::o;46331:419::-;46497:4;46535:2;46524:9;46520:18;46512:26;;46584:9;46578:4;46574:20;46570:1;46559:9;46555:17;46548:47;46612:131;46738:4;46612:131;:::i;:::-;46604:139;;46331:419;;;:::o;46756:237::-;46896:34;46892:1;46884:6;46880:14;46873:58;46965:20;46960:2;46952:6;46948:15;46941:45;46756:237;:::o;46999:366::-;47141:3;47162:67;47226:2;47221:3;47162:67;:::i;:::-;47155:74;;47238:93;47327:3;47238:93;:::i;:::-;47356:2;47351:3;47347:12;47340:19;;46999:366;;;:::o;47371:419::-;47537:4;47575:2;47564:9;47560:18;47552:26;;47624:9;47618:4;47614:20;47610:1;47599:9;47595:17;47588:47;47652:131;47778:4;47652:131;:::i;:::-;47644:139;;47371:419;;;:::o;47796:180::-;47844:77;47841:1;47834:88;47941:4;47938:1;47931:15;47965:4;47962:1;47955:15;47982:185;48022:1;48039:20;48057:1;48039:20;:::i;:::-;48034:25;;48073:20;48091:1;48073:20;:::i;:::-;48068:25;;48112:1;48102:35;;48117:18;;:::i;:::-;48102:35;48159:1;48156;48152:9;48147:14;;47982:185;;;;:::o;48173:176::-;48205:1;48222:20;48240:1;48222:20;:::i;:::-;48217:25;;48256:20;48274:1;48256:20;:::i;:::-;48251:25;;48295:1;48285:35;;48300:18;;:::i;:::-;48285:35;48341:1;48338;48334:9;48329:14;;48173:176;;;;:::o;48355:166::-;48495:18;48491:1;48483:6;48479:14;48472:42;48355:166;:::o;48527:366::-;48669:3;48690:67;48754:2;48749:3;48690:67;:::i;:::-;48683:74;;48766:93;48855:3;48766:93;:::i;:::-;48884:2;48879:3;48875:12;48868:19;;48527:366;;;:::o;48899:419::-;49065:4;49103:2;49092:9;49088:18;49080:26;;49152:9;49146:4;49142:20;49138:1;49127:9;49123:17;49116:47;49180:131;49306:4;49180:131;:::i;:::-;49172:139;;48899:419;;;:::o;49324:170::-;49464:22;49460:1;49452:6;49448:14;49441:46;49324:170;:::o;49500:366::-;49642:3;49663:67;49727:2;49722:3;49663:67;:::i;:::-;49656:74;;49739:93;49828:3;49739:93;:::i;:::-;49857:2;49852:3;49848:12;49841:19;;49500:366;;;:::o;49872:419::-;50038:4;50076:2;50065:9;50061:18;50053:26;;50125:9;50119:4;50115:20;50111:1;50100:9;50096:17;50089:47;50153:131;50279:4;50153:131;:::i;:::-;50145:139;;49872:419;;;:::o;50297:98::-;50348:6;50382:5;50376:12;50366:22;;50297:98;;;:::o;50401:168::-;50484:11;50518:6;50513:3;50506:19;50558:4;50553:3;50549:14;50534:29;;50401:168;;;;:::o;50575:373::-;50661:3;50689:38;50721:5;50689:38;:::i;:::-;50743:70;50806:6;50801:3;50743:70;:::i;:::-;50736:77;;50822:65;50880:6;50875:3;50868:4;50861:5;50857:16;50822:65;:::i;:::-;50912:29;50934:6;50912:29;:::i;:::-;50907:3;50903:39;50896:46;;50665:283;50575:373;;;;:::o;50954:640::-;51149:4;51187:3;51176:9;51172:19;51164:27;;51201:71;51269:1;51258:9;51254:17;51245:6;51201:71;:::i;:::-;51282:72;51350:2;51339:9;51335:18;51326:6;51282:72;:::i;:::-;51364;51432:2;51421:9;51417:18;51408:6;51364:72;:::i;:::-;51483:9;51477:4;51473:20;51468:2;51457:9;51453:18;51446:48;51511:76;51582:4;51573:6;51511:76;:::i;:::-;51503:84;;50954:640;;;;;;;:::o;51600:141::-;51656:5;51687:6;51681:13;51672:22;;51703:32;51729:5;51703:32;:::i;:::-;51600:141;;;;:::o;51747:349::-;51816:6;51865:2;51853:9;51844:7;51840:23;51836:32;51833:119;;;51871:79;;:::i;:::-;51833:119;51991:1;52016:63;52071:7;52062:6;52051:9;52047:22;52016:63;:::i;:::-;52006:73;;51962:127;51747:349;;;;:::o;52102:230::-;52242:34;52238:1;52230:6;52226:14;52219:58;52311:13;52306:2;52298:6;52294:15;52287:38;52102:230;:::o;52338:366::-;52480:3;52501:67;52565:2;52560:3;52501:67;:::i;:::-;52494:74;;52577:93;52666:3;52577:93;:::i;:::-;52695:2;52690:3;52686:12;52679:19;;52338:366;;;:::o;52710:419::-;52876:4;52914:2;52903:9;52899:18;52891:26;;52963:9;52957:4;52953:20;52949:1;52938:9;52934:17;52927:47;52991:131;53117:4;52991:131;:::i;:::-;52983:139;;52710:419;;;:::o;53135:182::-;53275:34;53271:1;53263:6;53259:14;53252:58;53135:182;:::o;53323:366::-;53465:3;53486:67;53550:2;53545:3;53486:67;:::i;:::-;53479:74;;53562:93;53651:3;53562:93;:::i;:::-;53680:2;53675:3;53671:12;53664:19;;53323:366;;;:::o;53695:419::-;53861:4;53899:2;53888:9;53884:18;53876:26;;53948:9;53942:4;53938:20;53934:1;53923:9;53919:17;53912:47;53976:131;54102:4;53976:131;:::i;:::-;53968:139;;53695:419;;;:::o;54120:178::-;54260:30;54256:1;54248:6;54244:14;54237:54;54120:178;:::o;54304:366::-;54446:3;54467:67;54531:2;54526:3;54467:67;:::i;:::-;54460:74;;54543:93;54632:3;54543:93;:::i;:::-;54661:2;54656:3;54652:12;54645:19;;54304:366;;;:::o;54676:419::-;54842:4;54880:2;54869:9;54865:18;54857:26;;54929:9;54923:4;54919:20;54915:1;54904:9;54900:17;54893:47;54957:131;55083:4;54957:131;:::i;:::-;54949:139;;54676:419;;;:::o;55101:180::-;55149:77;55146:1;55139:88;55246:4;55243:1;55236:15;55270:4;55267:1;55260:15

Swarm Source

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