ETH Price: $2,522.22 (+0.28%)

Token

Yoblins (YOBLINS)
 

Overview

Max Total Supply

3,184 YOBLINS

Holders

385

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
10 YOBLINS
0x6e9afed6b857db833a137a0f66e6a983b69b9b9a
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:
Yoblins

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/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 v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


// 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: Yoblins Contracts/IReverseRegistrar.sol



pragma solidity >=0.8.4;

interface IReverseRegistrar {
    function setDefaultResolver(address resolver) external;

    function claim(address owner) external returns (bytes32);

    function claimForAddr(
        address addr,
        address owner,
        address resolver
    ) external returns (bytes32);

    function claimWithResolver(address owner, address resolver)
        external
        returns (bytes32);

    function setName(string memory name) external returns (bytes32);

    function setNameForAddr(
        address addr,
        address owner,
        address resolver,
        string memory name
    ) external returns (bytes32);

    function node(address addr) external pure returns (bytes32);
}
// File: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

// 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/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: Yoblins Contracts/ERC721.sol


// Creator: Chiru Labs

pragma solidity ^0.8.10;









/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 private currentIndex = 0;

    uint256 internal immutable maxBatchSize;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Base URI
    string private _baseURI;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) private _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // 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
     * `maxBatchSize` refers to how much a minter can mint at a time.
     */
    constructor(
        string memory name_,
        string memory symbol_,
        uint256 maxBatchSize_
    ) {
        require(maxBatchSize_ > 0, "b");
        _name = name_;
        _symbol = symbol_;
        maxBatchSize = maxBatchSize_;
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), "g");
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), "b");
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        revert("u");
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        require(owner != address(0), "0");
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), "0");
        return uint256(_addressData[owner].numberMinted);
    }

    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), "t");

        uint256 lowestTokenToCheck;
        if (tokenId >= maxBatchSize) {
            lowestTokenToCheck = tokenId - maxBatchSize + 1;
        }

        for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (ownership.addr != address(0)) {
                return ownership;
            }
        }

        revert("o");
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

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

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

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

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

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

    /**
     * @dev Internal function to set the base URI for all token IDs. It is
     * automatically added as a prefix to the value returned in {tokenURI},
     * or to the token ID if {tokenURI} is empty.
     */
    function _setBaseURI(string memory baseURI_) internal virtual {
        _baseURI = baseURI_;
    }



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

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "a"
        );

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        require(_exists(tokenId), "a");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), "a");

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "z"
        );
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, "");
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` cannot be larger than the max batch size.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), "0");
        // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
        require(!_exists(startTokenId), "a");
        require(quantity <= maxBatchSize, "m");

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        AddressData memory addressData = _addressData[to];
        _addressData[to] = AddressData(
            addressData.balance + uint128(quantity),
            addressData.numberMinted + uint128(quantity)
        );
        _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

        uint256 updatedIndex = startTokenId;

        for (uint256 i = 0; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            require(
                _checkOnERC721Received(address(0), to, updatedIndex, _data),
                "z"
            );
            updatedIndex++;
        }

        currentIndex = updatedIndex;
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, "a");

        require(prevOwnership.addr == from, "o");
        require(to != address(0), "0");

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        _addressData[from].balance -= 1;
        _addressData[to].balance += 1;
        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId] = TokenOwnership(prevOwnership.addr, prevOwnership.startTimestamp);
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

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

    uint256 public nextOwnerToExplicitlySet = 0;

    /**
     * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
     */
    function _setOwnersExplicit(uint256 quantity) internal {
        uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
        require(quantity > 0, "q");
        uint256 endIndex = oldNextOwnerToSet + quantity - 1;
        if (endIndex > currentIndex - 1) {
            endIndex = currentIndex - 1;
        }
        // We know if the last one in the group exists, all in the group exist, due to serial ordering.
        require(_exists(endIndex), "n");
        for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
            if (_ownerships[i].addr == address(0)) {
                TokenOwnership memory ownership = ownershipOf(i);
                _ownerships[i] = TokenOwnership(ownership.addr, ownership.startTimestamp);
            }
        }
        nextOwnerToExplicitlySet = endIndex + 1;
    }

    /**
     * @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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("z");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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`.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}
// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: Yoblins Contracts/MasterchefMasatoshiJuniorX.sol


pragma solidity ^0.8.10;






/**
 * @title MasterchefMasatoshi
 * NFT + DAO = NEW META
 * Vitalik, remove contract size limit pls
 */
contract Yoblins is ERC721, Ownable {
  using ECDSA for bytes32;
  string public PROVENANCE;
  bool provenanceSet;

  uint256 public mintPrice;
  uint256 public maxPossibleSupply;
  uint256 public allowListMintPrice;
  uint256 public maxAllowedMints;

  address public immutable currency;
  address immutable wrappedNativeCoinAddress;

  address private signerAddress;
  bool public paused;

  address immutable ENSReverseRegistrar = 0x084b1c3C81545d370f3634392De611CaaBFf8148;

  enum MintStatus {
    PreMint,
    AllowList,
    Public,
    Finished
  }

  MintStatus public mintStatus = MintStatus.PreMint;

  mapping (address => uint256) totalMintsPerAddress;

  constructor(
      string memory _name,
      string memory _symbol,
      uint256 _maxPossibleSupply,
      uint256 _mintPrice,
      uint256 _allowListMintPrice,
      uint256 _maxAllowedMints,
      address _signerAddress,
      address _currency,
      address _wrappedNativeCoinAddress
  ) ERC721(_name, _symbol, _maxAllowedMints) {
    maxPossibleSupply = _maxPossibleSupply;
    mintPrice = _mintPrice;
    allowListMintPrice = _allowListMintPrice;
    maxAllowedMints = _maxAllowedMints;
    signerAddress = _signerAddress;
    currency = _currency;
    wrappedNativeCoinAddress = _wrappedNativeCoinAddress;
  }

  function flipPaused() external onlyOwner {
    paused = !paused;
  }

  function preMint(uint amount) public onlyOwner {
    require(mintStatus == MintStatus.PreMint, "s");
    require(totalSupply() + amount <= maxPossibleSupply, "m");  
    _safeMint(msg.sender, amount);
  }

  function setProvenanceHash(string memory provenanceHash) public onlyOwner {
    require(!provenanceSet);
    PROVENANCE = provenanceHash;
    provenanceSet = true;
  }

  function setBaseURI(string memory baseURI) public onlyOwner {
    _setBaseURI(baseURI);
  }
  
  function changeMintStatus(MintStatus _status) external onlyOwner {
    require(_status != MintStatus.PreMint);
    mintStatus = _status;
  }

  function mintAllowList(
    bytes32 messageHash,
    bytes calldata signature,
    uint amount
  ) public payable {
    require(mintStatus == MintStatus.AllowList && !paused, "s");
    require(totalSupply() + amount <= maxPossibleSupply, "m");
    require(hashMessage(msg.sender, address(this)) == messageHash, "i");
    require(verifyAddressSigner(messageHash, signature), "f");
    require(totalMintsPerAddress[msg.sender] + amount <= maxAllowedMints, "l");

    if (currency == wrappedNativeCoinAddress) {
      require(allowListMintPrice * amount <= msg.value, "a");
    } else {
      IERC20 _currency = IERC20(currency);
      _currency.transferFrom(msg.sender, address(this), amount * allowListMintPrice);
    }

    totalMintsPerAddress[msg.sender] = totalMintsPerAddress[msg.sender] + amount;
    _safeMint(msg.sender, amount);
  }

  function mintPublic(uint amount) public payable {
    require(mintStatus == MintStatus.Public && !paused, "s");
    require(totalSupply() + amount <= maxPossibleSupply, "m");
    require(totalMintsPerAddress[msg.sender] + amount <= maxAllowedMints, "l");

    if (currency == wrappedNativeCoinAddress) {
      require(mintPrice * amount <= msg.value, "a");
    } else {
      IERC20 _currency = IERC20(currency);
      _currency.transferFrom(msg.sender, address(this), amount * mintPrice);
    }

    totalMintsPerAddress[msg.sender] = totalMintsPerAddress[msg.sender] + amount;
    _safeMint(msg.sender, amount);

    if (totalSupply() == maxPossibleSupply) {
      mintStatus = MintStatus.Finished;
    }
  }

  function addReverseENSRecord(string memory name) external onlyOwner{
    IReverseRegistrar(ENSReverseRegistrar).setName(name);
  }

  receive() external payable {
    mintPublic(msg.value / mintPrice);
  }

  function verifyAddressSigner(bytes32 messageHash, bytes memory signature) private view returns (bool) {
    return signerAddress == messageHash.toEthSignedMessageHash().recover(signature);
  }

  function hashMessage(address sender, address thisContract) public pure returns (bytes32) {
    return keccak256(abi.encodePacked(sender, thisContract));
  }

  function withdraw() external onlyOwner() {
    uint balance = address(this).balance;
    payable(msg.sender).transfer(balance);
  }

  function withdrawTokens(address tokenAddress) external onlyOwner() {
    IERC20(tokenAddress).transfer(msg.sender, IERC20(tokenAddress).balanceOf(address(this)));
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_maxPossibleSupply","type":"uint256"},{"internalType":"uint256","name":"_mintPrice","type":"uint256"},{"internalType":"uint256","name":"_allowListMintPrice","type":"uint256"},{"internalType":"uint256","name":"_maxAllowedMints","type":"uint256"},{"internalType":"address","name":"_signerAddress","type":"address"},{"internalType":"address","name":"_currency","type":"address"},{"internalType":"address","name":"_wrappedNativeCoinAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"addReverseENSRecord","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allowListMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum Yoblins.MintStatus","name":"_status","type":"uint8"}],"name":"changeMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currency","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"thisContract","type":"address"}],"name":"hashMessage","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","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":"maxAllowedMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPossibleSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"messageHash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintAllowList","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintStatus","outputs":[{"internalType":"enum Yoblins.MintStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"preMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

61010060405260008055600060085573084b1c3c81545d370f3634392de611caabff814873ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff168152506000601060156101000a81548160ff021916908360038111156200007e576200007d620002f0565b5b02179055503480156200009057600080fd5b50604051620063a9380380620063a98339818101604052810190620000b691906200055c565b88888560008111620000ff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000f690620006da565b60405180910390fd5b82600190816200011091906200093d565b5081600290816200012291906200093d565b5080608081815250505050506200014e620001426200022260201b60201c565b6200022a60201b60201c565b86600d8190555085600c8190555084600e8190555083600f8190555082601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505050505050505050505062000a24565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000388826200033d565b810181811067ffffffffffffffff82111715620003aa57620003a96200034e565b5b80604052505050565b6000620003bf6200031f565b9050620003cd82826200037d565b919050565b600067ffffffffffffffff821115620003f057620003ef6200034e565b5b620003fb826200033d565b9050602081019050919050565b60005b83811015620004285780820151818401526020810190506200040b565b8381111562000438576000848401525b50505050565b6000620004556200044f84620003d2565b620003b3565b90508281526020810184848401111562000474576200047362000338565b5b6200048184828562000408565b509392505050565b600082601f830112620004a157620004a062000333565b5b8151620004b38482602086016200043e565b91505092915050565b6000819050919050565b620004d181620004bc565b8114620004dd57600080fd5b50565b600081519050620004f181620004c6565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200052482620004f7565b9050919050565b620005368162000517565b81146200054257600080fd5b50565b60008151905062000556816200052b565b92915050565b60008060008060008060008060006101208a8c03121562000582576200058162000329565b5b60008a015167ffffffffffffffff811115620005a357620005a26200032e565b5b620005b18c828d0162000489565b99505060208a015167ffffffffffffffff811115620005d557620005d46200032e565b5b620005e38c828d0162000489565b9850506040620005f68c828d01620004e0565b9750506060620006098c828d01620004e0565b96505060806200061c8c828d01620004e0565b95505060a06200062f8c828d01620004e0565b94505060c0620006428c828d0162000545565b93505060e0620006558c828d0162000545565b925050610100620006698c828d0162000545565b9150509295985092959850929598565b600082825260208201905092915050565b7f6200000000000000000000000000000000000000000000000000000000000000600082015250565b6000620006c260018362000679565b9150620006cf826200068a565b602082019050919050565b60006020820190508181036000830152620006f581620006b3565b9050919050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200074f57607f821691505b60208210810362000765576200076462000707565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620007cf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000790565b620007db868362000790565b95508019841693508086168417925050509392505050565b6000819050919050565b60006200081e620008186200081284620004bc565b620007f3565b620004bc565b9050919050565b6000819050919050565b6200083a83620007fd565b62000852620008498262000825565b8484546200079d565b825550505050565b600090565b620008696200085a565b620008768184846200082f565b505050565b5b818110156200089e57620008926000826200085f565b6001810190506200087c565b5050565b601f821115620008ed57620008b7816200076b565b620008c28462000780565b81016020851015620008d2578190505b620008ea620008e18562000780565b8301826200087b565b50505b505050565b600082821c905092915050565b60006200091260001984600802620008f2565b1980831691505092915050565b60006200092d8383620008ff565b9150826002028217905092915050565b6200094882620006fc565b67ffffffffffffffff8111156200096457620009636200034e565b5b62000970825462000736565b6200097d828285620008a2565b600060209050601f831160018114620009b55760008415620009a0578287015190505b620009ac85826200091f565b86555062000a1c565b601f198416620009c5866200076b565b60005b82811015620009ef57848901518255600182019150602085019450602081019050620009c8565b8683101562000a0f578489015162000a0b601f891682620008ff565b8355505b6001600288020188555050505b505050505050565b60805160a05160c05160e05161591a62000a8f60003960006124bc015260008181610ac0015261211b015260008181610af701528181610b8a01528181612152015281816121e5015261255c015260008181612e7601528181612e9f0152613507015261591a6000f3fe60806040526004361061023f5760003560e01c806368855b641161012e578063a22cb465116100ab578063dfb5259c1161006f578063dfb5259c14610873578063e5a6b10f1461089c578063e985e9c5146108c7578063efd0cbf914610904578063f2fde38b146109205761025c565b8063a22cb4651461079d578063a9cbd06d146107c6578063b88d4fde146107e2578063c87b56dd1461080b578063d7224ba0146108485761025c565b80637cac2602116100f25780637cac2602146106ca5780638ad433ac146106f35780638da5cb5b1461071c57806395d89b41146107475780639da3f8fd146107725761025c565b806368855b64146105e35780636c0360eb1461060e5780636c82054b1461063957806370a0823114610676578063715018a6146106b35761025c565b80633ccfd60b116101bc57806355f804b31161018057806355f804b3146104fc5780635c975abb146105255780636352211e146105505780636373a6b11461058d5780636817c76c146105b85761025c565b80633ccfd60b1461042b57806342842e0e1461044257806344fead9e1461046b57806349df728c146104965780634f6ccce7146104bf5761025c565b806318160ddd1161020357806318160ddd1461035857806323b872dd146103835780632f745c59146103ac578063333171bb146103e9578063386b7691146104005761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b314610306578063109695231461032f5761025c565b3661025c5761025a600c54346102559190613e05565b610949565b005b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613ea2565b610d12565b6040516102959190613eea565b60405180910390f35b3480156102aa57600080fd5b506102b3610e5c565b6040516102c09190613f9e565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613fec565b610eee565b6040516102fd919061405a565b60405180910390f35b34801561031257600080fd5b5061032d600480360381019061032891906140a1565b610f73565b005b34801561033b57600080fd5b5061035660048036038101906103519190614216565b61108b565b005b34801561036457600080fd5b5061036d61114f565b60405161037a919061426e565b60405180910390f35b34801561038f57600080fd5b506103aa60048036038101906103a59190614289565b611158565b005b3480156103b857600080fd5b506103d360048036038101906103ce91906140a1565b611168565b6040516103e0919061426e565b60405180910390f35b3480156103f557600080fd5b506103fe611364565b005b34801561040c57600080fd5b5061041561140c565b604051610422919061426e565b60405180910390f35b34801561043757600080fd5b50610440611412565b005b34801561044e57600080fd5b5061046960048036038101906104649190614289565b6114dd565b005b34801561047757600080fd5b506104806114fd565b60405161048d919061426e565b60405180910390f35b3480156104a257600080fd5b506104bd60048036038101906104b891906142dc565b611503565b005b3480156104cb57600080fd5b506104e660048036038101906104e19190613fec565b61167a565b6040516104f3919061426e565b60405180910390f35b34801561050857600080fd5b50610523600480360381019061051e9190614216565b6116cd565b005b34801561053157600080fd5b5061053a611755565b6040516105479190613eea565b60405180910390f35b34801561055c57600080fd5b5061057760048036038101906105729190613fec565b611768565b604051610584919061405a565b60405180910390f35b34801561059957600080fd5b506105a261177e565b6040516105af9190613f9e565b60405180910390f35b3480156105c457600080fd5b506105cd61180c565b6040516105da919061426e565b60405180910390f35b3480156105ef57600080fd5b506105f8611812565b604051610605919061426e565b60405180910390f35b34801561061a57600080fd5b50610623611818565b6040516106309190613f9e565b60405180910390f35b34801561064557600080fd5b50610660600480360381019061065b9190614309565b6118aa565b60405161066d9190614362565b60405180910390f35b34801561068257600080fd5b5061069d600480360381019061069891906142dc565b6118dd565b6040516106aa919061426e565b60405180910390f35b3480156106bf57600080fd5b506106c86119c5565b005b3480156106d657600080fd5b506106f160048036038101906106ec91906143a2565b611a4d565b005b3480156106ff57600080fd5b5061071a60048036038101906107159190613fec565b611b27565b005b34801561072857600080fd5b50610731611c7d565b60405161073e919061405a565b60405180910390f35b34801561075357600080fd5b5061075c611ca7565b6040516107699190613f9e565b60405180910390f35b34801561077e57600080fd5b50610787611d39565b6040516107949190614446565b60405180910390f35b3480156107a957600080fd5b506107c460048036038101906107bf919061448d565b611d4c565b005b6107e060048036038101906107db9190614559565b611ecc565b005b3480156107ee57600080fd5b506108096004803603810190610804919061466e565b612334565b005b34801561081757600080fd5b50610832600480360381019061082d9190613fec565b612390565b60405161083f9190613f9e565b60405180910390f35b34801561085457600080fd5b5061085d612438565b60405161086a919061426e565b60405180910390f35b34801561087f57600080fd5b5061089a60048036038101906108959190614216565b61243e565b005b3480156108a857600080fd5b506108b161255a565b6040516108be919061405a565b60405180910390f35b3480156108d357600080fd5b506108ee60048036038101906108e99190614309565b61257e565b6040516108fb9190613eea565b60405180910390f35b61091e60048036038101906109199190613fec565b610949565b005b34801561092c57600080fd5b50610947600480360381019061094291906142dc565b612612565b005b6002600381111561095d5761095c6143cf565b5b601060159054906101000a900460ff16600381111561097f5761097e6143cf565b5b1480156109995750601060149054906101000a900460ff16155b6109d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cf9061473d565b60405180910390fd5b600d54816109e461114f565b6109ee919061475d565b1115610a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a26906147ff565b60405180910390fd5b600f5481601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a7d919061475d565b1115610abe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab59061486b565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1603610b86573481600c54610b40919061488b565b1115610b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7890614931565b60405180910390fd5b610c3b565b60007f000000000000000000000000000000000000000000000000000000000000000090508073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330600c5486610bd7919061488b565b6040518463ffffffff1660e01b8152600401610bf593929190614951565b6020604051808303816000875af1158015610c14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c38919061499d565b50505b80601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c86919061475d565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610cd33382612709565b600d54610cde61114f565b03610d0f576003601060156101000a81548160ff02191690836003811115610d0957610d086143cf565b5b02179055505b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ddd57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e4557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e555750610e5482612727565b5b9050919050565b606060018054610e6b906149f9565b80601f0160208091040260200160405190810160405280929190818152602001828054610e97906149f9565b8015610ee45780601f10610eb957610100808354040283529160200191610ee4565b820191906000526020600020905b815481529060010190602001808311610ec757829003601f168201915b5050505050905090565b6000610ef982612791565b610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f90614931565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f7e82611768565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe590614a76565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661100d61279e565b73ffffffffffffffffffffffffffffffffffffffff16148061103c575061103b8161103661279e565b61257e565b5b61107b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107290614931565b60405180910390fd5b6110868383836127a6565b505050565b61109361279e565b73ffffffffffffffffffffffffffffffffffffffff166110b1611c7d565b73ffffffffffffffffffffffffffffffffffffffff1614611107576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fe90614ae2565b60405180910390fd5b600b60009054906101000a900460ff161561112157600080fd5b80600a90816111309190614cae565b506001600b60006101000a81548160ff02191690831515021790555050565b60008054905090565b611163838383612858565b505050565b6000611173836118dd565b82106111b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ab90614dcc565b60405180910390fd5b60006111be61114f565b905060008060005b83811015611322576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146112b857806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361130e578684036112ff57819550505050505061135e565b838061130a90614dec565b9450505b50808061131a90614dec565b9150506111c6565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135590614e80565b60405180910390fd5b92915050565b61136c61279e565b73ffffffffffffffffffffffffffffffffffffffff1661138a611c7d565b73ffffffffffffffffffffffffffffffffffffffff16146113e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d790614ae2565b60405180910390fd5b601060149054906101000a900460ff1615601060146101000a81548160ff021916908315150217905550565b600d5481565b61141a61279e565b73ffffffffffffffffffffffffffffffffffffffff16611438611c7d565b73ffffffffffffffffffffffffffffffffffffffff161461148e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148590614ae2565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156114d9573d6000803e3d6000fd5b5050565b6114f883838360405180602001604052806000815250612334565b505050565b600f5481565b61150b61279e565b73ffffffffffffffffffffffffffffffffffffffff16611529611c7d565b73ffffffffffffffffffffffffffffffffffffffff161461157f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157690614ae2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115d5919061405a565b602060405180830381865afa1580156115f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116169190614eb5565b6040518363ffffffff1660e01b8152600401611633929190614ee2565b6020604051808303816000875af1158015611652573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611676919061499d565b5050565b600061168461114f565b82106116c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bc90614f57565b60405180910390fd5b819050919050565b6116d561279e565b73ffffffffffffffffffffffffffffffffffffffff166116f3611c7d565b73ffffffffffffffffffffffffffffffffffffffff1614611749576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174090614ae2565b60405180910390fd5b61175281612e0f565b50565b601060149054906101000a900460ff1681565b600061177382612e22565b600001519050919050565b600a805461178b906149f9565b80601f01602080910402602001604051908101604052809291908181526020018280546117b7906149f9565b80156118045780601f106117d957610100808354040283529160200191611804565b820191906000526020600020905b8154815290600101906020018083116117e757829003601f168201915b505050505081565b600c5481565b600e5481565b606060038054611827906149f9565b80601f0160208091040260200160405190810160405280929190818152602001828054611853906149f9565b80156118a05780601f10611875576101008083540402835291602001916118a0565b820191906000526020600020905b81548152906001019060200180831161188357829003601f168201915b5050505050905090565b600082826040516020016118bf929190614fbf565b60405160208183030381529060405280519060200120905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361194d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194490615037565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6119cd61279e565b73ffffffffffffffffffffffffffffffffffffffff166119eb611c7d565b73ffffffffffffffffffffffffffffffffffffffff1614611a41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3890614ae2565b60405180910390fd5b611a4b6000613025565b565b611a5561279e565b73ffffffffffffffffffffffffffffffffffffffff16611a73611c7d565b73ffffffffffffffffffffffffffffffffffffffff1614611ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac090614ae2565b60405180910390fd5b60006003811115611add57611adc6143cf565b5b816003811115611af057611aef6143cf565b5b03611afa57600080fd5b80601060156101000a81548160ff02191690836003811115611b1f57611b1e6143cf565b5b021790555050565b611b2f61279e565b73ffffffffffffffffffffffffffffffffffffffff16611b4d611c7d565b73ffffffffffffffffffffffffffffffffffffffff1614611ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9a90614ae2565b60405180910390fd5b60006003811115611bb757611bb66143cf565b5b601060159054906101000a900460ff166003811115611bd957611bd86143cf565b5b14611c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c109061473d565b60405180910390fd5b600d5481611c2561114f565b611c2f919061475d565b1115611c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c67906147ff565b60405180910390fd5b611c7a3382612709565b50565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054611cb6906149f9565b80601f0160208091040260200160405190810160405280929190818152602001828054611ce2906149f9565b8015611d2f5780601f10611d0457610100808354040283529160200191611d2f565b820191906000526020600020905b815481529060010190602001808311611d1257829003601f168201915b5050505050905090565b601060159054906101000a900460ff1681565b611d5461279e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db890614931565b60405180910390fd5b8060076000611dce61279e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e7b61279e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ec09190613eea565b60405180910390a35050565b60016003811115611ee057611edf6143cf565b5b601060159054906101000a900460ff166003811115611f0257611f016143cf565b5b148015611f1c5750601060149054906101000a900460ff16155b611f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f529061473d565b60405180910390fd5b600d5481611f6761114f565b611f71919061475d565b1115611fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa9906147ff565b60405180910390fd5b83611fbd33306118aa565b14611ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff4906150a3565b60405180910390fd5b61204b8484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506130eb565b61208a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120819061510f565b60405180910390fd5b600f5481601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120d8919061475d565b1115612119576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121109061486b565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16036121e1573481600e5461219b919061488b565b11156121dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d390614931565b60405180910390fd5b612296565b60007f000000000000000000000000000000000000000000000000000000000000000090508073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330600e5486612232919061488b565b6040518463ffffffff1660e01b815260040161225093929190614951565b6020604051808303816000875af115801561226f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612293919061499d565b50505b80601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122e1919061475d565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061232e3382612709565b50505050565b61233f848484612858565b61234b84848484613160565b61238a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123819061517b565b60405180910390fd5b50505050565b606061239b82612791565b6123da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d19061517b565b60405180910390fd5b6000600380546123e9906149f9565b9050116124055760405180602001604052806000815250612431565b6003612410836132e7565b60405160200161242192919061525a565b6040516020818303038152906040525b9050919050565b60085481565b61244661279e565b73ffffffffffffffffffffffffffffffffffffffff16612464611c7d565b73ffffffffffffffffffffffffffffffffffffffff16146124ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b190614ae2565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c47f0027826040518263ffffffff1660e01b81526004016125139190613f9e565b6020604051808303816000875af1158015612532573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125569190615293565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61261a61279e565b73ffffffffffffffffffffffffffffffffffffffff16612638611c7d565b73ffffffffffffffffffffffffffffffffffffffff161461268e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268590614ae2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036126fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f490615332565b60405180910390fd5b61270681613025565b50565b612723828260405180602001604052806000815250613447565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061286382612e22565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661288a61279e565b73ffffffffffffffffffffffffffffffffffffffff1614806128e657506128af61279e565b73ffffffffffffffffffffffffffffffffffffffff166128ce84610eee565b73ffffffffffffffffffffffffffffffffffffffff16145b80612902575061290182600001516128fc61279e565b61257e565b5b905080612944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293b90614931565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146129b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ad90614a76565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612a25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1c90615037565b60405180910390fd5b612a328585856001613925565b612a4260008484600001516127a6565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612ab0919061536e565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612b5491906153a2565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612c5a919061475d565b9050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612d9f57612ccf81612791565b15612d9e576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506004600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e07868686600161392b565b505050505050565b8060039081612e1e9190614cae565b5050565b612e2a613d63565b612e3382612791565b612e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6990615434565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000008310612ed65760017f000000000000000000000000000000000000000000000000000000000000000084612ec99190615454565b612ed3919061475d565b90505b60008390505b818110612fe4576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612fd057809350505050613020565b508080612fdc90615488565b915050612edc565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301790614a76565b60405180910390fd5b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000613108826130fa85613931565b61396190919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b60006131818473ffffffffffffffffffffffffffffffffffffffff16613988565b156132da578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026131aa61279e565b8786866040518563ffffffff1660e01b81526004016131cc9493929190615506565b6020604051808303816000875af192505050801561320857506040513d601f19601f820116820180604052508101906132059190615567565b60015b61328a573d8060008114613238576040519150601f19603f3d011682016040523d82523d6000602084013e61323d565b606091505b506000815103613282576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132799061517b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506132df565b600190505b949350505050565b60606000820361332e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613442565b600082905060005b6000821461336057808061334990614dec565b915050600a826133599190613e05565b9150613336565b60008167ffffffffffffffff81111561337c5761337b6140eb565b5b6040519080825280601f01601f1916602001820160405280156133ae5781602001600182028036833780820191505090505b5090505b6000851461343b576001826133c79190615454565b9150600a856133d69190615594565b60306133e2919061475d565b60f81b8183815181106133f8576133f76155c5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134349190613e05565b94506133b2565b8093505050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036134bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134b390615037565b60405180910390fd5b6134c581612791565b15613505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134fc90614931565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000831115613568576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161355f906147ff565b60405180910390fd5b6135756000858386613925565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050604051806040016040528085836000015161367291906153a2565b6fffffffffffffffffffffffffffffffff16815260200185836020015161369991906153a2565b6fffffffffffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561390857818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46138a86000888488613160565b6138e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138de9061517b565b60405180910390fd5b81806138f290614dec565b925050808061390090614dec565b915050613837565b508060008190555061391d600087858861392b565b505050505050565b50505050565b50505050565b6000816040516020016139449190615661565b604051602081830303815290604052805190602001209050919050565b600080600061397085856139ab565b9150915061397d81613a2c565b819250505092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008060418351036139ec5760008060006020860151925060408601519150606086015160001a90506139e087828585613bf8565b94509450505050613a25565b6040835103613a1c576000806020850151915060408501519050613a11868383613d04565b935093505050613a25565b60006002915091505b9250929050565b60006004811115613a4057613a3f6143cf565b5b816004811115613a5357613a526143cf565b5b0315613bf55760016004811115613a6d57613a6c6143cf565b5b816004811115613a8057613a7f6143cf565b5b03613ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ab7906156d3565b60405180910390fd5b60026004811115613ad457613ad36143cf565b5b816004811115613ae757613ae66143cf565b5b03613b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b1e9061573f565b60405180910390fd5b60036004811115613b3b57613b3a6143cf565b5b816004811115613b4e57613b4d6143cf565b5b03613b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b85906157d1565b60405180910390fd5b600480811115613ba157613ba06143cf565b5b816004811115613bb457613bb36143cf565b5b03613bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613beb90615863565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613c33576000600391509150613cfb565b601b8560ff1614158015613c4b5750601c8560ff1614155b15613c5d576000600491509150613cfb565b600060018787878760405160008152602001604052604051613c82949392919061589f565b6020604051602081039080840390855afa158015613ca4573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613cf257600060019250925050613cfb565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c613d47919061475d565b9050613d5587828885613bf8565b935093505050935093915050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e1082613d9d565b9150613e1b83613d9d565b925082613e2b57613e2a613da7565b5b828204905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613e7f81613e4a565b8114613e8a57600080fd5b50565b600081359050613e9c81613e76565b92915050565b600060208284031215613eb857613eb7613e40565b5b6000613ec684828501613e8d565b91505092915050565b60008115159050919050565b613ee481613ecf565b82525050565b6000602082019050613eff6000830184613edb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f3f578082015181840152602081019050613f24565b83811115613f4e576000848401525b50505050565b6000601f19601f8301169050919050565b6000613f7082613f05565b613f7a8185613f10565b9350613f8a818560208601613f21565b613f9381613f54565b840191505092915050565b60006020820190508181036000830152613fb88184613f65565b905092915050565b613fc981613d9d565b8114613fd457600080fd5b50565b600081359050613fe681613fc0565b92915050565b60006020828403121561400257614001613e40565b5b600061401084828501613fd7565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061404482614019565b9050919050565b61405481614039565b82525050565b600060208201905061406f600083018461404b565b92915050565b61407e81614039565b811461408957600080fd5b50565b60008135905061409b81614075565b92915050565b600080604083850312156140b8576140b7613e40565b5b60006140c68582860161408c565b92505060206140d785828601613fd7565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61412382613f54565b810181811067ffffffffffffffff82111715614142576141416140eb565b5b80604052505050565b6000614155613e36565b9050614161828261411a565b919050565b600067ffffffffffffffff821115614181576141806140eb565b5b61418a82613f54565b9050602081019050919050565b82818337600083830152505050565b60006141b96141b484614166565b61414b565b9050828152602081018484840111156141d5576141d46140e6565b5b6141e0848285614197565b509392505050565b600082601f8301126141fd576141fc6140e1565b5b813561420d8482602086016141a6565b91505092915050565b60006020828403121561422c5761422b613e40565b5b600082013567ffffffffffffffff81111561424a57614249613e45565b5b614256848285016141e8565b91505092915050565b61426881613d9d565b82525050565b6000602082019050614283600083018461425f565b92915050565b6000806000606084860312156142a2576142a1613e40565b5b60006142b08682870161408c565b93505060206142c18682870161408c565b92505060406142d286828701613fd7565b9150509250925092565b6000602082840312156142f2576142f1613e40565b5b60006143008482850161408c565b91505092915050565b600080604083850312156143205761431f613e40565b5b600061432e8582860161408c565b925050602061433f8582860161408c565b9150509250929050565b6000819050919050565b61435c81614349565b82525050565b60006020820190506143776000830184614353565b92915050565b6004811061438a57600080fd5b50565b60008135905061439c8161437d565b92915050565b6000602082840312156143b8576143b7613e40565b5b60006143c68482850161438d565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061440f5761440e6143cf565b5b50565b6000819050614420826143fe565b919050565b600061443082614412565b9050919050565b61444081614425565b82525050565b600060208201905061445b6000830184614437565b92915050565b61446a81613ecf565b811461447557600080fd5b50565b60008135905061448781614461565b92915050565b600080604083850312156144a4576144a3613e40565b5b60006144b28582860161408c565b92505060206144c385828601614478565b9150509250929050565b6144d681614349565b81146144e157600080fd5b50565b6000813590506144f3816144cd565b92915050565b600080fd5b600080fd5b60008083601f840112614519576145186140e1565b5b8235905067ffffffffffffffff811115614536576145356144f9565b5b602083019150836001820283011115614552576145516144fe565b5b9250929050565b6000806000806060858703121561457357614572613e40565b5b6000614581878288016144e4565b945050602085013567ffffffffffffffff8111156145a2576145a1613e45565b5b6145ae87828801614503565b935093505060406145c187828801613fd7565b91505092959194509250565b600067ffffffffffffffff8211156145e8576145e76140eb565b5b6145f182613f54565b9050602081019050919050565b600061461161460c846145cd565b61414b565b90508281526020810184848401111561462d5761462c6140e6565b5b614638848285614197565b509392505050565b600082601f830112614655576146546140e1565b5b81356146658482602086016145fe565b91505092915050565b6000806000806080858703121561468857614687613e40565b5b60006146968782880161408c565b94505060206146a78782880161408c565b93505060406146b887828801613fd7565b925050606085013567ffffffffffffffff8111156146d9576146d8613e45565b5b6146e587828801614640565b91505092959194509250565b7f7300000000000000000000000000000000000000000000000000000000000000600082015250565b6000614727600183613f10565b9150614732826146f1565b602082019050919050565b600060208201905081810360008301526147568161471a565b9050919050565b600061476882613d9d565b915061477383613d9d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147a8576147a7613dd6565b5b828201905092915050565b7f6d00000000000000000000000000000000000000000000000000000000000000600082015250565b60006147e9600183613f10565b91506147f4826147b3565b602082019050919050565b60006020820190508181036000830152614818816147dc565b9050919050565b7f6c00000000000000000000000000000000000000000000000000000000000000600082015250565b6000614855600183613f10565b91506148608261481f565b602082019050919050565b6000602082019050818103600083015261488481614848565b9050919050565b600061489682613d9d565b91506148a183613d9d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156148da576148d9613dd6565b5b828202905092915050565b7f6100000000000000000000000000000000000000000000000000000000000000600082015250565b600061491b600183613f10565b9150614926826148e5565b602082019050919050565b6000602082019050818103600083015261494a8161490e565b9050919050565b6000606082019050614966600083018661404b565b614973602083018561404b565b614980604083018461425f565b949350505050565b60008151905061499781614461565b92915050565b6000602082840312156149b3576149b2613e40565b5b60006149c184828501614988565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614a1157607f821691505b602082108103614a2457614a236149ca565b5b50919050565b7f6f00000000000000000000000000000000000000000000000000000000000000600082015250565b6000614a60600183613f10565b9150614a6b82614a2a565b602082019050919050565b60006020820190508181036000830152614a8f81614a53565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614acc602083613f10565b9150614ad782614a96565b602082019050919050565b60006020820190508181036000830152614afb81614abf565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614b647fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614b27565b614b6e8683614b27565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614bab614ba6614ba184613d9d565b614b86565b613d9d565b9050919050565b6000819050919050565b614bc583614b90565b614bd9614bd182614bb2565b848454614b34565b825550505050565b600090565b614bee614be1565b614bf9818484614bbc565b505050565b5b81811015614c1d57614c12600082614be6565b600181019050614bff565b5050565b601f821115614c6257614c3381614b02565b614c3c84614b17565b81016020851015614c4b578190505b614c5f614c5785614b17565b830182614bfe565b50505b505050565b600082821c905092915050565b6000614c8560001984600802614c67565b1980831691505092915050565b6000614c9e8383614c74565b9150826002028217905092915050565b614cb782613f05565b67ffffffffffffffff811115614cd057614ccf6140eb565b5b614cda82546149f9565b614ce5828285614c21565b600060209050601f831160018114614d185760008415614d06578287015190505b614d108582614c92565b865550614d78565b601f198416614d2686614b02565b60005b82811015614d4e57848901518255600182019150602085019450602081019050614d29565b86831015614d6b5784890151614d67601f891682614c74565b8355505b6001600288020188555050505b505050505050565b7f6200000000000000000000000000000000000000000000000000000000000000600082015250565b6000614db6600183613f10565b9150614dc182614d80565b602082019050919050565b60006020820190508181036000830152614de581614da9565b9050919050565b6000614df782613d9d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e2957614e28613dd6565b5b600182019050919050565b7f7500000000000000000000000000000000000000000000000000000000000000600082015250565b6000614e6a600183613f10565b9150614e7582614e34565b602082019050919050565b60006020820190508181036000830152614e9981614e5d565b9050919050565b600081519050614eaf81613fc0565b92915050565b600060208284031215614ecb57614eca613e40565b5b6000614ed984828501614ea0565b91505092915050565b6000604082019050614ef7600083018561404b565b614f04602083018461425f565b9392505050565b7f6700000000000000000000000000000000000000000000000000000000000000600082015250565b6000614f41600183613f10565b9150614f4c82614f0b565b602082019050919050565b60006020820190508181036000830152614f7081614f34565b9050919050565b60008160601b9050919050565b6000614f8f82614f77565b9050919050565b6000614fa182614f84565b9050919050565b614fb9614fb482614039565b614f96565b82525050565b6000614fcb8285614fa8565b601482019150614fdb8284614fa8565b6014820191508190509392505050565b7f3000000000000000000000000000000000000000000000000000000000000000600082015250565b6000615021600183613f10565b915061502c82614feb565b602082019050919050565b6000602082019050818103600083015261505081615014565b9050919050565b7f6900000000000000000000000000000000000000000000000000000000000000600082015250565b600061508d600183613f10565b915061509882615057565b602082019050919050565b600060208201905081810360008301526150bc81615080565b9050919050565b7f6600000000000000000000000000000000000000000000000000000000000000600082015250565b60006150f9600183613f10565b9150615104826150c3565b602082019050919050565b60006020820190508181036000830152615128816150ec565b9050919050565b7f7a00000000000000000000000000000000000000000000000000000000000000600082015250565b6000615165600183613f10565b91506151708261512f565b602082019050919050565b6000602082019050818103600083015261519481615158565b9050919050565b600081905092915050565b600081546151b3816149f9565b6151bd818661519b565b945060018216600081146151d857600181146151ed57615220565b60ff1983168652811515820286019350615220565b6151f685614b02565b60005b83811015615218578154818901526001820191506020810190506151f9565b838801955050505b50505092915050565b600061523482613f05565b61523e818561519b565b935061524e818560208601613f21565b80840191505092915050565b600061526682856151a6565b91506152728284615229565b91508190509392505050565b60008151905061528d816144cd565b92915050565b6000602082840312156152a9576152a8613e40565b5b60006152b78482850161527e565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061531c602683613f10565b9150615327826152c0565b604082019050919050565b6000602082019050818103600083015261534b8161530f565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600061537982615352565b915061538483615352565b92508282101561539757615396613dd6565b5b828203905092915050565b60006153ad82615352565b91506153b883615352565b9250826fffffffffffffffffffffffffffffffff038211156153dd576153dc613dd6565b5b828201905092915050565b7f7400000000000000000000000000000000000000000000000000000000000000600082015250565b600061541e600183613f10565b9150615429826153e8565b602082019050919050565b6000602082019050818103600083015261544d81615411565b9050919050565b600061545f82613d9d565b915061546a83613d9d565b92508282101561547d5761547c613dd6565b5b828203905092915050565b600061549382613d9d565b9150600082036154a6576154a5613dd6565b5b600182039050919050565b600081519050919050565b600082825260208201905092915050565b60006154d8826154b1565b6154e281856154bc565b93506154f2818560208601613f21565b6154fb81613f54565b840191505092915050565b600060808201905061551b600083018761404b565b615528602083018661404b565b615535604083018561425f565b818103606083015261554781846154cd565b905095945050505050565b60008151905061556181613e76565b92915050565b60006020828403121561557d5761557c613e40565b5b600061558b84828501615552565b91505092915050565b600061559f82613d9d565b91506155aa83613d9d565b9250826155ba576155b9613da7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b600061562a601c8361519b565b9150615635826155f4565b601c82019050919050565b6000819050919050565b61565b61565682614349565b615640565b82525050565b600061566c8261561d565b9150615678828461564a565b60208201915081905092915050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006156bd601883613f10565b91506156c882615687565b602082019050919050565b600060208201905081810360008301526156ec816156b0565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000615729601f83613f10565b9150615734826156f3565b602082019050919050565b600060208201905081810360008301526157588161571c565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006157bb602283613f10565b91506157c68261575f565b604082019050919050565b600060208201905081810360008301526157ea816157ae565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061584d602283613f10565b9150615858826157f1565b604082019050919050565b6000602082019050818103600083015261587c81615840565b9050919050565b600060ff82169050919050565b61589981615883565b82525050565b60006080820190506158b46000830187614353565b6158c16020830186615890565b6158ce6040830185614353565b6158db6060830184614353565b9594505050505056fea2646970667358221220d44f45d62da68ab62d98da08bfeef415327dc98aff570585b9bafd496d447a3464736f6c634300080f003300000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000b263e399781ac16fe32e1713fbfcbe642007f27d000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000007596f626c696e73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007594f424c494e5300000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061023f5760003560e01c806368855b641161012e578063a22cb465116100ab578063dfb5259c1161006f578063dfb5259c14610873578063e5a6b10f1461089c578063e985e9c5146108c7578063efd0cbf914610904578063f2fde38b146109205761025c565b8063a22cb4651461079d578063a9cbd06d146107c6578063b88d4fde146107e2578063c87b56dd1461080b578063d7224ba0146108485761025c565b80637cac2602116100f25780637cac2602146106ca5780638ad433ac146106f35780638da5cb5b1461071c57806395d89b41146107475780639da3f8fd146107725761025c565b806368855b64146105e35780636c0360eb1461060e5780636c82054b1461063957806370a0823114610676578063715018a6146106b35761025c565b80633ccfd60b116101bc57806355f804b31161018057806355f804b3146104fc5780635c975abb146105255780636352211e146105505780636373a6b11461058d5780636817c76c146105b85761025c565b80633ccfd60b1461042b57806342842e0e1461044257806344fead9e1461046b57806349df728c146104965780634f6ccce7146104bf5761025c565b806318160ddd1161020357806318160ddd1461035857806323b872dd146103835780632f745c59146103ac578063333171bb146103e9578063386b7691146104005761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b314610306578063109695231461032f5761025c565b3661025c5761025a600c54346102559190613e05565b610949565b005b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613ea2565b610d12565b6040516102959190613eea565b60405180910390f35b3480156102aa57600080fd5b506102b3610e5c565b6040516102c09190613f9e565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613fec565b610eee565b6040516102fd919061405a565b60405180910390f35b34801561031257600080fd5b5061032d600480360381019061032891906140a1565b610f73565b005b34801561033b57600080fd5b5061035660048036038101906103519190614216565b61108b565b005b34801561036457600080fd5b5061036d61114f565b60405161037a919061426e565b60405180910390f35b34801561038f57600080fd5b506103aa60048036038101906103a59190614289565b611158565b005b3480156103b857600080fd5b506103d360048036038101906103ce91906140a1565b611168565b6040516103e0919061426e565b60405180910390f35b3480156103f557600080fd5b506103fe611364565b005b34801561040c57600080fd5b5061041561140c565b604051610422919061426e565b60405180910390f35b34801561043757600080fd5b50610440611412565b005b34801561044e57600080fd5b5061046960048036038101906104649190614289565b6114dd565b005b34801561047757600080fd5b506104806114fd565b60405161048d919061426e565b60405180910390f35b3480156104a257600080fd5b506104bd60048036038101906104b891906142dc565b611503565b005b3480156104cb57600080fd5b506104e660048036038101906104e19190613fec565b61167a565b6040516104f3919061426e565b60405180910390f35b34801561050857600080fd5b50610523600480360381019061051e9190614216565b6116cd565b005b34801561053157600080fd5b5061053a611755565b6040516105479190613eea565b60405180910390f35b34801561055c57600080fd5b5061057760048036038101906105729190613fec565b611768565b604051610584919061405a565b60405180910390f35b34801561059957600080fd5b506105a261177e565b6040516105af9190613f9e565b60405180910390f35b3480156105c457600080fd5b506105cd61180c565b6040516105da919061426e565b60405180910390f35b3480156105ef57600080fd5b506105f8611812565b604051610605919061426e565b60405180910390f35b34801561061a57600080fd5b50610623611818565b6040516106309190613f9e565b60405180910390f35b34801561064557600080fd5b50610660600480360381019061065b9190614309565b6118aa565b60405161066d9190614362565b60405180910390f35b34801561068257600080fd5b5061069d600480360381019061069891906142dc565b6118dd565b6040516106aa919061426e565b60405180910390f35b3480156106bf57600080fd5b506106c86119c5565b005b3480156106d657600080fd5b506106f160048036038101906106ec91906143a2565b611a4d565b005b3480156106ff57600080fd5b5061071a60048036038101906107159190613fec565b611b27565b005b34801561072857600080fd5b50610731611c7d565b60405161073e919061405a565b60405180910390f35b34801561075357600080fd5b5061075c611ca7565b6040516107699190613f9e565b60405180910390f35b34801561077e57600080fd5b50610787611d39565b6040516107949190614446565b60405180910390f35b3480156107a957600080fd5b506107c460048036038101906107bf919061448d565b611d4c565b005b6107e060048036038101906107db9190614559565b611ecc565b005b3480156107ee57600080fd5b506108096004803603810190610804919061466e565b612334565b005b34801561081757600080fd5b50610832600480360381019061082d9190613fec565b612390565b60405161083f9190613f9e565b60405180910390f35b34801561085457600080fd5b5061085d612438565b60405161086a919061426e565b60405180910390f35b34801561087f57600080fd5b5061089a60048036038101906108959190614216565b61243e565b005b3480156108a857600080fd5b506108b161255a565b6040516108be919061405a565b60405180910390f35b3480156108d357600080fd5b506108ee60048036038101906108e99190614309565b61257e565b6040516108fb9190613eea565b60405180910390f35b61091e60048036038101906109199190613fec565b610949565b005b34801561092c57600080fd5b50610947600480360381019061094291906142dc565b612612565b005b6002600381111561095d5761095c6143cf565b5b601060159054906101000a900460ff16600381111561097f5761097e6143cf565b5b1480156109995750601060149054906101000a900460ff16155b6109d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cf9061473d565b60405180910390fd5b600d54816109e461114f565b6109ee919061475d565b1115610a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a26906147ff565b60405180910390fd5b600f5481601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a7d919061475d565b1115610abe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab59061486b565b60405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1603610b86573481600c54610b40919061488b565b1115610b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7890614931565b60405180910390fd5b610c3b565b60007f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290508073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330600c5486610bd7919061488b565b6040518463ffffffff1660e01b8152600401610bf593929190614951565b6020604051808303816000875af1158015610c14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c38919061499d565b50505b80601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c86919061475d565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610cd33382612709565b600d54610cde61114f565b03610d0f576003601060156101000a81548160ff02191690836003811115610d0957610d086143cf565b5b02179055505b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ddd57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e4557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e555750610e5482612727565b5b9050919050565b606060018054610e6b906149f9565b80601f0160208091040260200160405190810160405280929190818152602001828054610e97906149f9565b8015610ee45780601f10610eb957610100808354040283529160200191610ee4565b820191906000526020600020905b815481529060010190602001808311610ec757829003601f168201915b5050505050905090565b6000610ef982612791565b610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f90614931565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f7e82611768565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe590614a76565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661100d61279e565b73ffffffffffffffffffffffffffffffffffffffff16148061103c575061103b8161103661279e565b61257e565b5b61107b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107290614931565b60405180910390fd5b6110868383836127a6565b505050565b61109361279e565b73ffffffffffffffffffffffffffffffffffffffff166110b1611c7d565b73ffffffffffffffffffffffffffffffffffffffff1614611107576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fe90614ae2565b60405180910390fd5b600b60009054906101000a900460ff161561112157600080fd5b80600a90816111309190614cae565b506001600b60006101000a81548160ff02191690831515021790555050565b60008054905090565b611163838383612858565b505050565b6000611173836118dd565b82106111b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ab90614dcc565b60405180910390fd5b60006111be61114f565b905060008060005b83811015611322576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146112b857806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361130e578684036112ff57819550505050505061135e565b838061130a90614dec565b9450505b50808061131a90614dec565b9150506111c6565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135590614e80565b60405180910390fd5b92915050565b61136c61279e565b73ffffffffffffffffffffffffffffffffffffffff1661138a611c7d565b73ffffffffffffffffffffffffffffffffffffffff16146113e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d790614ae2565b60405180910390fd5b601060149054906101000a900460ff1615601060146101000a81548160ff021916908315150217905550565b600d5481565b61141a61279e565b73ffffffffffffffffffffffffffffffffffffffff16611438611c7d565b73ffffffffffffffffffffffffffffffffffffffff161461148e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148590614ae2565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156114d9573d6000803e3d6000fd5b5050565b6114f883838360405180602001604052806000815250612334565b505050565b600f5481565b61150b61279e565b73ffffffffffffffffffffffffffffffffffffffff16611529611c7d565b73ffffffffffffffffffffffffffffffffffffffff161461157f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157690614ae2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115d5919061405a565b602060405180830381865afa1580156115f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116169190614eb5565b6040518363ffffffff1660e01b8152600401611633929190614ee2565b6020604051808303816000875af1158015611652573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611676919061499d565b5050565b600061168461114f565b82106116c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bc90614f57565b60405180910390fd5b819050919050565b6116d561279e565b73ffffffffffffffffffffffffffffffffffffffff166116f3611c7d565b73ffffffffffffffffffffffffffffffffffffffff1614611749576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174090614ae2565b60405180910390fd5b61175281612e0f565b50565b601060149054906101000a900460ff1681565b600061177382612e22565b600001519050919050565b600a805461178b906149f9565b80601f01602080910402602001604051908101604052809291908181526020018280546117b7906149f9565b80156118045780601f106117d957610100808354040283529160200191611804565b820191906000526020600020905b8154815290600101906020018083116117e757829003601f168201915b505050505081565b600c5481565b600e5481565b606060038054611827906149f9565b80601f0160208091040260200160405190810160405280929190818152602001828054611853906149f9565b80156118a05780601f10611875576101008083540402835291602001916118a0565b820191906000526020600020905b81548152906001019060200180831161188357829003601f168201915b5050505050905090565b600082826040516020016118bf929190614fbf565b60405160208183030381529060405280519060200120905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361194d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194490615037565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6119cd61279e565b73ffffffffffffffffffffffffffffffffffffffff166119eb611c7d565b73ffffffffffffffffffffffffffffffffffffffff1614611a41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3890614ae2565b60405180910390fd5b611a4b6000613025565b565b611a5561279e565b73ffffffffffffffffffffffffffffffffffffffff16611a73611c7d565b73ffffffffffffffffffffffffffffffffffffffff1614611ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac090614ae2565b60405180910390fd5b60006003811115611add57611adc6143cf565b5b816003811115611af057611aef6143cf565b5b03611afa57600080fd5b80601060156101000a81548160ff02191690836003811115611b1f57611b1e6143cf565b5b021790555050565b611b2f61279e565b73ffffffffffffffffffffffffffffffffffffffff16611b4d611c7d565b73ffffffffffffffffffffffffffffffffffffffff1614611ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9a90614ae2565b60405180910390fd5b60006003811115611bb757611bb66143cf565b5b601060159054906101000a900460ff166003811115611bd957611bd86143cf565b5b14611c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c109061473d565b60405180910390fd5b600d5481611c2561114f565b611c2f919061475d565b1115611c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c67906147ff565b60405180910390fd5b611c7a3382612709565b50565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054611cb6906149f9565b80601f0160208091040260200160405190810160405280929190818152602001828054611ce2906149f9565b8015611d2f5780601f10611d0457610100808354040283529160200191611d2f565b820191906000526020600020905b815481529060010190602001808311611d1257829003601f168201915b5050505050905090565b601060159054906101000a900460ff1681565b611d5461279e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db890614931565b60405180910390fd5b8060076000611dce61279e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e7b61279e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ec09190613eea565b60405180910390a35050565b60016003811115611ee057611edf6143cf565b5b601060159054906101000a900460ff166003811115611f0257611f016143cf565b5b148015611f1c5750601060149054906101000a900460ff16155b611f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f529061473d565b60405180910390fd5b600d5481611f6761114f565b611f71919061475d565b1115611fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa9906147ff565b60405180910390fd5b83611fbd33306118aa565b14611ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff4906150a3565b60405180910390fd5b61204b8484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506130eb565b61208a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120819061510f565b60405180910390fd5b600f5481601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120d8919061475d565b1115612119576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121109061486b565b60405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16036121e1573481600e5461219b919061488b565b11156121dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d390614931565b60405180910390fd5b612296565b60007f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290508073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330600e5486612232919061488b565b6040518463ffffffff1660e01b815260040161225093929190614951565b6020604051808303816000875af115801561226f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612293919061499d565b50505b80601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122e1919061475d565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061232e3382612709565b50505050565b61233f848484612858565b61234b84848484613160565b61238a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123819061517b565b60405180910390fd5b50505050565b606061239b82612791565b6123da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d19061517b565b60405180910390fd5b6000600380546123e9906149f9565b9050116124055760405180602001604052806000815250612431565b6003612410836132e7565b60405160200161242192919061525a565b6040516020818303038152906040525b9050919050565b60085481565b61244661279e565b73ffffffffffffffffffffffffffffffffffffffff16612464611c7d565b73ffffffffffffffffffffffffffffffffffffffff16146124ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b190614ae2565b60405180910390fd5b7f000000000000000000000000084b1c3c81545d370f3634392de611caabff814873ffffffffffffffffffffffffffffffffffffffff1663c47f0027826040518263ffffffff1660e01b81526004016125139190613f9e565b6020604051808303816000875af1158015612532573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125569190615293565b5050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61261a61279e565b73ffffffffffffffffffffffffffffffffffffffff16612638611c7d565b73ffffffffffffffffffffffffffffffffffffffff161461268e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268590614ae2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036126fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f490615332565b60405180910390fd5b61270681613025565b50565b612723828260405180602001604052806000815250613447565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061286382612e22565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661288a61279e565b73ffffffffffffffffffffffffffffffffffffffff1614806128e657506128af61279e565b73ffffffffffffffffffffffffffffffffffffffff166128ce84610eee565b73ffffffffffffffffffffffffffffffffffffffff16145b80612902575061290182600001516128fc61279e565b61257e565b5b905080612944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293b90614931565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146129b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ad90614a76565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612a25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1c90615037565b60405180910390fd5b612a328585856001613925565b612a4260008484600001516127a6565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612ab0919061536e565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612b5491906153a2565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612c5a919061475d565b9050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612d9f57612ccf81612791565b15612d9e576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506004600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e07868686600161392b565b505050505050565b8060039081612e1e9190614cae565b5050565b612e2a613d63565b612e3382612791565b612e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6990615434565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000a8310612ed65760017f000000000000000000000000000000000000000000000000000000000000000a84612ec99190615454565b612ed3919061475d565b90505b60008390505b818110612fe4576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612fd057809350505050613020565b508080612fdc90615488565b915050612edc565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301790614a76565b60405180910390fd5b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000613108826130fa85613931565b61396190919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b60006131818473ffffffffffffffffffffffffffffffffffffffff16613988565b156132da578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026131aa61279e565b8786866040518563ffffffff1660e01b81526004016131cc9493929190615506565b6020604051808303816000875af192505050801561320857506040513d601f19601f820116820180604052508101906132059190615567565b60015b61328a573d8060008114613238576040519150601f19603f3d011682016040523d82523d6000602084013e61323d565b606091505b506000815103613282576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132799061517b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506132df565b600190505b949350505050565b60606000820361332e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613442565b600082905060005b6000821461336057808061334990614dec565b915050600a826133599190613e05565b9150613336565b60008167ffffffffffffffff81111561337c5761337b6140eb565b5b6040519080825280601f01601f1916602001820160405280156133ae5781602001600182028036833780820191505090505b5090505b6000851461343b576001826133c79190615454565b9150600a856133d69190615594565b60306133e2919061475d565b60f81b8183815181106133f8576133f76155c5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134349190613e05565b94506133b2565b8093505050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036134bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134b390615037565b60405180910390fd5b6134c581612791565b15613505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134fc90614931565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000a831115613568576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161355f906147ff565b60405180910390fd5b6135756000858386613925565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050604051806040016040528085836000015161367291906153a2565b6fffffffffffffffffffffffffffffffff16815260200185836020015161369991906153a2565b6fffffffffffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561390857818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46138a86000888488613160565b6138e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138de9061517b565b60405180910390fd5b81806138f290614dec565b925050808061390090614dec565b915050613837565b508060008190555061391d600087858861392b565b505050505050565b50505050565b50505050565b6000816040516020016139449190615661565b604051602081830303815290604052805190602001209050919050565b600080600061397085856139ab565b9150915061397d81613a2c565b819250505092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008060418351036139ec5760008060006020860151925060408601519150606086015160001a90506139e087828585613bf8565b94509450505050613a25565b6040835103613a1c576000806020850151915060408501519050613a11868383613d04565b935093505050613a25565b60006002915091505b9250929050565b60006004811115613a4057613a3f6143cf565b5b816004811115613a5357613a526143cf565b5b0315613bf55760016004811115613a6d57613a6c6143cf565b5b816004811115613a8057613a7f6143cf565b5b03613ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ab7906156d3565b60405180910390fd5b60026004811115613ad457613ad36143cf565b5b816004811115613ae757613ae66143cf565b5b03613b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b1e9061573f565b60405180910390fd5b60036004811115613b3b57613b3a6143cf565b5b816004811115613b4e57613b4d6143cf565b5b03613b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b85906157d1565b60405180910390fd5b600480811115613ba157613ba06143cf565b5b816004811115613bb457613bb36143cf565b5b03613bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613beb90615863565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613c33576000600391509150613cfb565b601b8560ff1614158015613c4b5750601c8560ff1614155b15613c5d576000600491509150613cfb565b600060018787878760405160008152602001604052604051613c82949392919061589f565b6020604051602081039080840390855afa158015613ca4573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613cf257600060019250925050613cfb565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c613d47919061475d565b9050613d5587828885613bf8565b935093505050935093915050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e1082613d9d565b9150613e1b83613d9d565b925082613e2b57613e2a613da7565b5b828204905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613e7f81613e4a565b8114613e8a57600080fd5b50565b600081359050613e9c81613e76565b92915050565b600060208284031215613eb857613eb7613e40565b5b6000613ec684828501613e8d565b91505092915050565b60008115159050919050565b613ee481613ecf565b82525050565b6000602082019050613eff6000830184613edb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f3f578082015181840152602081019050613f24565b83811115613f4e576000848401525b50505050565b6000601f19601f8301169050919050565b6000613f7082613f05565b613f7a8185613f10565b9350613f8a818560208601613f21565b613f9381613f54565b840191505092915050565b60006020820190508181036000830152613fb88184613f65565b905092915050565b613fc981613d9d565b8114613fd457600080fd5b50565b600081359050613fe681613fc0565b92915050565b60006020828403121561400257614001613e40565b5b600061401084828501613fd7565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061404482614019565b9050919050565b61405481614039565b82525050565b600060208201905061406f600083018461404b565b92915050565b61407e81614039565b811461408957600080fd5b50565b60008135905061409b81614075565b92915050565b600080604083850312156140b8576140b7613e40565b5b60006140c68582860161408c565b92505060206140d785828601613fd7565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61412382613f54565b810181811067ffffffffffffffff82111715614142576141416140eb565b5b80604052505050565b6000614155613e36565b9050614161828261411a565b919050565b600067ffffffffffffffff821115614181576141806140eb565b5b61418a82613f54565b9050602081019050919050565b82818337600083830152505050565b60006141b96141b484614166565b61414b565b9050828152602081018484840111156141d5576141d46140e6565b5b6141e0848285614197565b509392505050565b600082601f8301126141fd576141fc6140e1565b5b813561420d8482602086016141a6565b91505092915050565b60006020828403121561422c5761422b613e40565b5b600082013567ffffffffffffffff81111561424a57614249613e45565b5b614256848285016141e8565b91505092915050565b61426881613d9d565b82525050565b6000602082019050614283600083018461425f565b92915050565b6000806000606084860312156142a2576142a1613e40565b5b60006142b08682870161408c565b93505060206142c18682870161408c565b92505060406142d286828701613fd7565b9150509250925092565b6000602082840312156142f2576142f1613e40565b5b60006143008482850161408c565b91505092915050565b600080604083850312156143205761431f613e40565b5b600061432e8582860161408c565b925050602061433f8582860161408c565b9150509250929050565b6000819050919050565b61435c81614349565b82525050565b60006020820190506143776000830184614353565b92915050565b6004811061438a57600080fd5b50565b60008135905061439c8161437d565b92915050565b6000602082840312156143b8576143b7613e40565b5b60006143c68482850161438d565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061440f5761440e6143cf565b5b50565b6000819050614420826143fe565b919050565b600061443082614412565b9050919050565b61444081614425565b82525050565b600060208201905061445b6000830184614437565b92915050565b61446a81613ecf565b811461447557600080fd5b50565b60008135905061448781614461565b92915050565b600080604083850312156144a4576144a3613e40565b5b60006144b28582860161408c565b92505060206144c385828601614478565b9150509250929050565b6144d681614349565b81146144e157600080fd5b50565b6000813590506144f3816144cd565b92915050565b600080fd5b600080fd5b60008083601f840112614519576145186140e1565b5b8235905067ffffffffffffffff811115614536576145356144f9565b5b602083019150836001820283011115614552576145516144fe565b5b9250929050565b6000806000806060858703121561457357614572613e40565b5b6000614581878288016144e4565b945050602085013567ffffffffffffffff8111156145a2576145a1613e45565b5b6145ae87828801614503565b935093505060406145c187828801613fd7565b91505092959194509250565b600067ffffffffffffffff8211156145e8576145e76140eb565b5b6145f182613f54565b9050602081019050919050565b600061461161460c846145cd565b61414b565b90508281526020810184848401111561462d5761462c6140e6565b5b614638848285614197565b509392505050565b600082601f830112614655576146546140e1565b5b81356146658482602086016145fe565b91505092915050565b6000806000806080858703121561468857614687613e40565b5b60006146968782880161408c565b94505060206146a78782880161408c565b93505060406146b887828801613fd7565b925050606085013567ffffffffffffffff8111156146d9576146d8613e45565b5b6146e587828801614640565b91505092959194509250565b7f7300000000000000000000000000000000000000000000000000000000000000600082015250565b6000614727600183613f10565b9150614732826146f1565b602082019050919050565b600060208201905081810360008301526147568161471a565b9050919050565b600061476882613d9d565b915061477383613d9d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147a8576147a7613dd6565b5b828201905092915050565b7f6d00000000000000000000000000000000000000000000000000000000000000600082015250565b60006147e9600183613f10565b91506147f4826147b3565b602082019050919050565b60006020820190508181036000830152614818816147dc565b9050919050565b7f6c00000000000000000000000000000000000000000000000000000000000000600082015250565b6000614855600183613f10565b91506148608261481f565b602082019050919050565b6000602082019050818103600083015261488481614848565b9050919050565b600061489682613d9d565b91506148a183613d9d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156148da576148d9613dd6565b5b828202905092915050565b7f6100000000000000000000000000000000000000000000000000000000000000600082015250565b600061491b600183613f10565b9150614926826148e5565b602082019050919050565b6000602082019050818103600083015261494a8161490e565b9050919050565b6000606082019050614966600083018661404b565b614973602083018561404b565b614980604083018461425f565b949350505050565b60008151905061499781614461565b92915050565b6000602082840312156149b3576149b2613e40565b5b60006149c184828501614988565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614a1157607f821691505b602082108103614a2457614a236149ca565b5b50919050565b7f6f00000000000000000000000000000000000000000000000000000000000000600082015250565b6000614a60600183613f10565b9150614a6b82614a2a565b602082019050919050565b60006020820190508181036000830152614a8f81614a53565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614acc602083613f10565b9150614ad782614a96565b602082019050919050565b60006020820190508181036000830152614afb81614abf565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614b647fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614b27565b614b6e8683614b27565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614bab614ba6614ba184613d9d565b614b86565b613d9d565b9050919050565b6000819050919050565b614bc583614b90565b614bd9614bd182614bb2565b848454614b34565b825550505050565b600090565b614bee614be1565b614bf9818484614bbc565b505050565b5b81811015614c1d57614c12600082614be6565b600181019050614bff565b5050565b601f821115614c6257614c3381614b02565b614c3c84614b17565b81016020851015614c4b578190505b614c5f614c5785614b17565b830182614bfe565b50505b505050565b600082821c905092915050565b6000614c8560001984600802614c67565b1980831691505092915050565b6000614c9e8383614c74565b9150826002028217905092915050565b614cb782613f05565b67ffffffffffffffff811115614cd057614ccf6140eb565b5b614cda82546149f9565b614ce5828285614c21565b600060209050601f831160018114614d185760008415614d06578287015190505b614d108582614c92565b865550614d78565b601f198416614d2686614b02565b60005b82811015614d4e57848901518255600182019150602085019450602081019050614d29565b86831015614d6b5784890151614d67601f891682614c74565b8355505b6001600288020188555050505b505050505050565b7f6200000000000000000000000000000000000000000000000000000000000000600082015250565b6000614db6600183613f10565b9150614dc182614d80565b602082019050919050565b60006020820190508181036000830152614de581614da9565b9050919050565b6000614df782613d9d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e2957614e28613dd6565b5b600182019050919050565b7f7500000000000000000000000000000000000000000000000000000000000000600082015250565b6000614e6a600183613f10565b9150614e7582614e34565b602082019050919050565b60006020820190508181036000830152614e9981614e5d565b9050919050565b600081519050614eaf81613fc0565b92915050565b600060208284031215614ecb57614eca613e40565b5b6000614ed984828501614ea0565b91505092915050565b6000604082019050614ef7600083018561404b565b614f04602083018461425f565b9392505050565b7f6700000000000000000000000000000000000000000000000000000000000000600082015250565b6000614f41600183613f10565b9150614f4c82614f0b565b602082019050919050565b60006020820190508181036000830152614f7081614f34565b9050919050565b60008160601b9050919050565b6000614f8f82614f77565b9050919050565b6000614fa182614f84565b9050919050565b614fb9614fb482614039565b614f96565b82525050565b6000614fcb8285614fa8565b601482019150614fdb8284614fa8565b6014820191508190509392505050565b7f3000000000000000000000000000000000000000000000000000000000000000600082015250565b6000615021600183613f10565b915061502c82614feb565b602082019050919050565b6000602082019050818103600083015261505081615014565b9050919050565b7f6900000000000000000000000000000000000000000000000000000000000000600082015250565b600061508d600183613f10565b915061509882615057565b602082019050919050565b600060208201905081810360008301526150bc81615080565b9050919050565b7f6600000000000000000000000000000000000000000000000000000000000000600082015250565b60006150f9600183613f10565b9150615104826150c3565b602082019050919050565b60006020820190508181036000830152615128816150ec565b9050919050565b7f7a00000000000000000000000000000000000000000000000000000000000000600082015250565b6000615165600183613f10565b91506151708261512f565b602082019050919050565b6000602082019050818103600083015261519481615158565b9050919050565b600081905092915050565b600081546151b3816149f9565b6151bd818661519b565b945060018216600081146151d857600181146151ed57615220565b60ff1983168652811515820286019350615220565b6151f685614b02565b60005b83811015615218578154818901526001820191506020810190506151f9565b838801955050505b50505092915050565b600061523482613f05565b61523e818561519b565b935061524e818560208601613f21565b80840191505092915050565b600061526682856151a6565b91506152728284615229565b91508190509392505050565b60008151905061528d816144cd565b92915050565b6000602082840312156152a9576152a8613e40565b5b60006152b78482850161527e565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061531c602683613f10565b9150615327826152c0565b604082019050919050565b6000602082019050818103600083015261534b8161530f565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600061537982615352565b915061538483615352565b92508282101561539757615396613dd6565b5b828203905092915050565b60006153ad82615352565b91506153b883615352565b9250826fffffffffffffffffffffffffffffffff038211156153dd576153dc613dd6565b5b828201905092915050565b7f7400000000000000000000000000000000000000000000000000000000000000600082015250565b600061541e600183613f10565b9150615429826153e8565b602082019050919050565b6000602082019050818103600083015261544d81615411565b9050919050565b600061545f82613d9d565b915061546a83613d9d565b92508282101561547d5761547c613dd6565b5b828203905092915050565b600061549382613d9d565b9150600082036154a6576154a5613dd6565b5b600182039050919050565b600081519050919050565b600082825260208201905092915050565b60006154d8826154b1565b6154e281856154bc565b93506154f2818560208601613f21565b6154fb81613f54565b840191505092915050565b600060808201905061551b600083018761404b565b615528602083018661404b565b615535604083018561425f565b818103606083015261554781846154cd565b905095945050505050565b60008151905061556181613e76565b92915050565b60006020828403121561557d5761557c613e40565b5b600061558b84828501615552565b91505092915050565b600061559f82613d9d565b91506155aa83613d9d565b9250826155ba576155b9613da7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b600061562a601c8361519b565b9150615635826155f4565b601c82019050919050565b6000819050919050565b61565b61565682614349565b615640565b82525050565b600061566c8261561d565b9150615678828461564a565b60208201915081905092915050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006156bd601883613f10565b91506156c882615687565b602082019050919050565b600060208201905081810360008301526156ec816156b0565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000615729601f83613f10565b9150615734826156f3565b602082019050919050565b600060208201905081810360008301526157588161571c565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006157bb602283613f10565b91506157c68261575f565b604082019050919050565b600060208201905081810360008301526157ea816157ae565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061584d602283613f10565b9150615858826157f1565b604082019050919050565b6000602082019050818103600083015261587c81615840565b9050919050565b600060ff82169050919050565b61589981615883565b82525050565b60006080820190506158b46000830187614353565b6158c16020830186615890565b6158ce6040830185614353565b6158db6060830184614353565b9594505050505056fea2646970667358221220d44f45d62da68ab62d98da08bfeef415327dc98aff570585b9bafd496d447a3464736f6c634300080f0033

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

00000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000b263e399781ac16fe32e1713fbfcbe642007f27d000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000007596f626c696e73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007594f424c494e5300000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Yoblins
Arg [1] : _symbol (string): YOBLINS
Arg [2] : _maxPossibleSupply (uint256): 10000
Arg [3] : _mintPrice (uint256): 0
Arg [4] : _allowListMintPrice (uint256): 0
Arg [5] : _maxAllowedMints (uint256): 10
Arg [6] : _signerAddress (address): 0xb263E399781ac16FE32E1713FbfCBe642007f27d
Arg [7] : _currency (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [8] : _wrappedNativeCoinAddress (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2

-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [2] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [6] : 000000000000000000000000b263e399781ac16fe32e1713fbfcbe642007f27d
Arg [7] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [8] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [10] : 596f626c696e7300000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [12] : 594f424c494e5300000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

53218:4548:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57046:33;57069:9;;57057;:21;;;;:::i;:::-;57046:10;:33::i;:::-;53218:4548;;;;;37975:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39603:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41322:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40933:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54847:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36528:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42129:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37158:745;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54557:70;;;;;;;;;;;;;:::i;:::-;;53370:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57455:134;;;;;;;;;;;;;:::i;:::-;;42362:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53445:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57595:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36705:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55024:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53603:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39412:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53287:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53341;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53407:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40440:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57291:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38411:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52190:103;;;;;;;;;;;;;:::i;:::-;;55125:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54633:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51539:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39772:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53802:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41564:263;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55274:860;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42610:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39947:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46955:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56874:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53482:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41898:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56140:728;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52448:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56140:728;56217:17;56203:31;;;;;;;;:::i;:::-;;:10;;;;;;;;;;;:31;;;;;;;;:::i;:::-;;;:42;;;;;56239:6;;;;;;;;;;;56238:7;56203:42;56195:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;56292:17;;56282:6;56266:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:43;;56258:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;56375:15;;56365:6;56330:20;:32;56351:10;56330:32;;;;;;;;;;;;;;;;:41;;;;:::i;:::-;:60;;56322:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;56421:24;56409:36;;:8;:36;;;56405:240;;56486:9;56476:6;56464:9;;:18;;;;:::i;:::-;:31;;56456:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;56405:240;;;56524:16;56550:8;56524:35;;56568:9;:22;;;56591:10;56611:4;56627:9;;56618:6;:18;;;;:::i;:::-;56568:69;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;56515:130;56405:240;56723:6;56688:20;:32;56709:10;56688:32;;;;;;;;;;;;;;;;:41;;;;:::i;:::-;56653:20;:32;56674:10;56653:32;;;;;;;;;;;;;;;:76;;;;56736:29;56746:10;56758:6;56736:9;:29::i;:::-;56795:17;;56778:13;:11;:13::i;:::-;:34;56774:89;;56836:19;56823:10;;:32;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;56774:89;56140:728;:::o;37975:372::-;38077:4;38129:25;38114:40;;;:11;:40;;;;:105;;;;38186:33;38171:48;;;:11;:48;;;;38114:105;:172;;;;38251:35;38236:50;;;:11;:50;;;;38114:172;:225;;;;38303:36;38327:11;38303:23;:36::i;:::-;38114:225;38094:245;;37975:372;;;:::o;39603:100::-;39657:13;39690:5;39683:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39603:100;:::o;41322:170::-;41390:7;41418:16;41426:7;41418;:16::i;:::-;41410:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;41460:15;:24;41476:7;41460:24;;;;;;;;;;;;;;;;;;;;;41453:31;;41322:170;;;:::o;40933:323::-;41006:13;41022:23;41037:7;41022:14;:23::i;:::-;41006:39;;41070:5;41064:11;;:2;:11;;;41056:25;;;;;;;;;;;;:::i;:::-;;;;;;;;;41132:5;41116:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;41141:37;41158:5;41165:12;:10;:12::i;:::-;41141:16;:37::i;:::-;41116:62;41094:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;41220:28;41229:2;41233:7;41242:5;41220:8;:28::i;:::-;40995:261;40933:323;;:::o;54847:171::-;51770:12;:10;:12::i;:::-;51759:23;;:7;:5;:7::i;:::-;:23;;;51751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54937:13:::1;;;;;;;;;;;54936:14;54928:23;;;::::0;::::1;;54971:14;54958:10;:27;;;;;;:::i;:::-;;55008:4;54992:13;;:20;;;;;;;;;;;;;;;;;;54847:171:::0;:::o;36528:100::-;36581:7;36608:12;;36601:19;;36528:100;:::o;42129:162::-;42255:28;42265:4;42271:2;42275:7;42255:9;:28::i;:::-;42129:162;;;:::o;37158:745::-;37247:7;37283:16;37293:5;37283:9;:16::i;:::-;37275:5;:24;37267:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;37316:22;37341:13;:11;:13::i;:::-;37316:38;;37365:19;37399:25;37453:9;37448:426;37472:14;37468:1;:18;37448:426;;;37508:31;37542:11;:14;37554:1;37542:14;;;;;;;;;;;37508:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37601:1;37575:28;;:9;:14;;;:28;;;37571:103;;37644:9;:14;;;37624:34;;37571:103;37713:5;37692:26;;:17;:26;;;37688:175;;37758:5;37743:11;:20;37739:77;;37795:1;37788:8;;;;;;;;;37739:77;37834:13;;;;;:::i;:::-;;;;37688:175;37493:381;37488:3;;;;;:::i;:::-;;;;37448:426;;;;37884:11;;;;;;;;;;:::i;:::-;;;;;;;;37158:745;;;;;:::o;54557:70::-;51770:12;:10;:12::i;:::-;51759:23;;:7;:5;:7::i;:::-;:23;;;51751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54615:6:::1;;;;;;;;;;;54614:7;54605:6;;:16;;;;;;;;;;;;;;;;;;54557:70::o:0;53370:32::-;;;;:::o;57455:134::-;51770:12;:10;:12::i;:::-;51759:23;;:7;:5;:7::i;:::-;:23;;;51751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57503:12:::1;57518:21;57503:36;;57554:10;57546:28;;:37;57575:7;57546:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57496:93;57455:134::o:0;42362:177::-;42492:39;42509:4;42515:2;42519:7;42492:39;;;;;;;;;;;;:16;:39::i;:::-;42362:177;;;:::o;53445:30::-;;;;:::o;57595:168::-;51770:12;:10;:12::i;:::-;51759:23;;:7;:5;:7::i;:::-;:23;;;51751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57676:12:::1;57669:29;;;57699:10;57718:12;57711:30;;;57750:4;57711:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57669:88;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57595:168:::0;:::o;36705:153::-;36772:7;36808:13;:11;:13::i;:::-;36800:5;:21;36792:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;36845:5;36838:12;;36705:153;;;:::o;55024:93::-;51770:12;:10;:12::i;:::-;51759:23;;:7;:5;:7::i;:::-;:23;;;51751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55091:20:::1;55103:7;55091:11;:20::i;:::-;55024:93:::0;:::o;53603:18::-;;;;;;;;;;;;;:::o;39412:124::-;39476:7;39503:20;39515:7;39503:11;:20::i;:::-;:25;;;39496:32;;39412:124;;;:::o;53287:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53341:::-;;;;:::o;53407:33::-;;;;:::o;40440:97::-;40488:13;40521:8;40514:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40440:97;:::o;57291:158::-;57371:7;57421:6;57429:12;57404:38;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57394:49;;;;;;57387:56;;57291:158;;;;:::o;38411:179::-;38475:7;38520:1;38503:19;;:5;:19;;;38495:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;38554:12;:19;38567:5;38554:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;38546:36;;38539:43;;38411:179;;;:::o;52190:103::-;51770:12;:10;:12::i;:::-;51759:23;;:7;:5;:7::i;:::-;:23;;;51751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52255:30:::1;52282:1;52255:18;:30::i;:::-;52190:103::o:0;55125:143::-;51770:12;:10;:12::i;:::-;51759:23;;:7;:5;:7::i;:::-;:23;;;51751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55216:18:::1;55205:29;;;;;;;;:::i;:::-;;:7;:29;;;;;;;;:::i;:::-;;::::0;55197:38:::1;;;::::0;::::1;;55255:7;55242:10;;:20;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;55125:143:::0;:::o;54633:208::-;51770:12;:10;:12::i;:::-;51759:23;;:7;:5;:7::i;:::-;:23;;;51751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54709:18:::1;54695:32;;;;;;;;:::i;:::-;;:10;;;;;;;;;;;:32;;;;;;;;:::i;:::-;;;54687:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;54774:17;;54764:6;54748:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:43;;54740:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;54806:29;54816:10;54828:6;54806:9;:29::i;:::-;54633:208:::0;:::o;51539:87::-;51585:7;51612:6;;;;;;;;;;;51605:13;;51539:87;:::o;39772:104::-;39828:13;39861:7;39854:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39772:104;:::o;53802:49::-;;;;;;;;;;;;;:::o;41564:263::-;41671:12;:10;:12::i;:::-;41659:24;;:8;:24;;;41651:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;41747:8;41702:18;:32;41721:12;:10;:12::i;:::-;41702:32;;;;;;;;;;;;;;;:42;41735:8;41702:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;41800:8;41771:48;;41786:12;:10;:12::i;:::-;41771:48;;;41810:8;41771:48;;;;;;:::i;:::-;;;;;;;;41564:263;;:::o;55274:860::-;55421:20;55407:34;;;;;;;;:::i;:::-;;:10;;;;;;;;;;;:34;;;;;;;;:::i;:::-;;;:45;;;;;55446:6;;;;;;;;;;;55445:7;55407:45;55399:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;55499:17;;55489:6;55473:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:43;;55465:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;55579:11;55537:38;55549:10;55569:4;55537:11;:38::i;:::-;:53;55529:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;55611:43;55631:11;55644:9;;55611:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:19;:43::i;:::-;55603:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;55720:15;;55710:6;55675:20;:32;55696:10;55675:32;;;;;;;;;;;;;;;;:41;;;;:::i;:::-;:60;;55667:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;55766:24;55754:36;;:8;:36;;;55750:258;;55840:9;55830:6;55809:18;;:27;;;;:::i;:::-;:40;;55801:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;55750:258;;;55878:16;55904:8;55878:35;;55922:9;:22;;;55945:10;55965:4;55981:18;;55972:6;:27;;;;:::i;:::-;55922:78;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55869:139;55750:258;56086:6;56051:20;:32;56072:10;56051:32;;;;;;;;;;;;;;;;:41;;;;:::i;:::-;56016:20;:32;56037:10;56016:32;;;;;;;;;;;;;;;:76;;;;56099:29;56109:10;56121:6;56099:9;:29::i;:::-;55274:860;;;;:::o;42610:305::-;42769:28;42779:4;42785:2;42789:7;42769:9;:28::i;:::-;42830:48;42853:4;42859:2;42863:7;42872:5;42830:22;:48::i;:::-;42808:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;42610:305;;;;:::o;39947:245::-;40020:13;40054:16;40062:7;40054;:16::i;:::-;40046:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;40121:1;40102:8;40096:22;;;;;:::i;:::-;;;:26;:88;;;;;;;;;;;;;;;;;40149:8;40159:18;:7;:16;:18::i;:::-;40132:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40096:88;40089:95;;39947:245;;;:::o;46955:43::-;;;;:::o;56874:132::-;51770:12;:10;:12::i;:::-;51759:23;;:7;:5;:7::i;:::-;:23;;;51751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56966:19:::1;56948:46;;;56995:4;56948:52;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;56874:132:::0;:::o;53482:33::-;;;:::o;41898:164::-;41995:4;42019:18;:25;42038:5;42019:25;;;;;;;;;;;;;;;:35;42045:8;42019:35;;;;;;;;;;;;;;;;;;;;;;;;;42012:42;;41898:164;;;;:::o;52448:201::-;51770:12;:10;:12::i;:::-;51759:23;;:7;:5;:7::i;:::-;:23;;;51751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52557:1:::1;52537:22;;:8;:22;;::::0;52529:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;52613:28;52632:8;52613:18;:28::i;:::-;52448:201:::0;:::o;43289:104::-;43358:27;43368:2;43372:8;43358:27;;;;;;;;;;;;:9;:27::i;:::-;43289:104;;:::o;11316:157::-;11401:4;11440:25;11425:40;;;:11;:40;;;;11418:47;;11316:157;;;:::o;43170:111::-;43227:4;43261:12;;43251:7;:22;43244:29;;43170:111;;;:::o;34255:98::-;34308:7;34335:10;34328:17;;34255:98;:::o;46751:196::-;46893:2;46866:15;:24;46882:7;46866:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;46931:7;46927:2;46911:28;;46920:5;46911:28;;;;;;;;;;;;46751:196;;;:::o;45181:1452::-;45296:35;45334:20;45346:7;45334:11;:20::i;:::-;45296:58;;45367:22;45409:13;:18;;;45393:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;45468:12;:10;:12::i;:::-;45444:36;;:20;45456:7;45444:11;:20::i;:::-;:36;;;45393:87;:154;;;;45497:50;45514:13;:18;;;45534:12;:10;:12::i;:::-;45497:16;:50::i;:::-;45393:154;45367:181;;45569:17;45561:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;45635:4;45613:26;;:13;:18;;;:26;;;45605:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;45678:1;45664:16;;:2;:16;;;45656:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;45699:43;45721:4;45727:2;45731:7;45740:1;45699:21;:43::i;:::-;45807:49;45824:1;45828:7;45837:13;:18;;;45807:8;:49::i;:::-;45899:1;45869:12;:18;45882:4;45869:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;45939:1;45911:12;:16;45924:2;45911:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;45974:43;;;;;;;;45989:2;45974:43;;;;;;46000:15;45974:43;;;;;45951:11;:20;45963:7;45951:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46257:19;46289:1;46279:7;:11;;;;:::i;:::-;46257:33;;46346:1;46305:43;;:11;:24;46317:11;46305:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;46301:227;;46369:20;46377:11;46369:7;:20::i;:::-;46365:152;;;46437:64;;;;;;;;46452:13;:18;;;46437:64;;;;;;46472:13;:28;;;46437:64;;;;;46410:11;:24;46422:11;46410:24;;;;;;;;;;;:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46365:152;46301:227;46564:7;46560:2;46545:27;;46554:4;46545:27;;;;;;;;;;;;46583:42;46604:4;46610:2;46614:7;46623:1;46583:20;:42::i;:::-;45285:1348;;;45181:1452;;;:::o;40767:100::-;40851:8;40840;:19;;;;;;:::i;:::-;;40767:100;:::o;38787:563::-;38848:21;;:::i;:::-;38890:16;38898:7;38890;:16::i;:::-;38882:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;38925:26;38977:12;38966:7;:23;38962:103;;39052:1;39037:12;39027:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;39006:47;;38962:103;39082:12;39097:7;39082:22;;39077:242;39114:18;39106:4;:26;39077:242;;39157:31;39191:11;:17;39203:4;39191:17;;;;;;;;;;;39157:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39253:1;39227:28;;:9;:14;;;:28;;;39223:85;;39283:9;39276:16;;;;;;;39223:85;39142:177;39134:6;;;;;:::i;:::-;;;;39077:242;;;;39331:11;;;;;;;;;;:::i;:::-;;;;;;;;38787:563;;;;:::o;52809:191::-;52883:16;52902:6;;;;;;;;;;;52883:25;;52928:8;52919:6;;:17;;;;;;;;;;;;;;;;;;52983:8;52952:40;;52973:8;52952:40;;;;;;;;;;;;52872:128;52809:191;:::o;57091:194::-;57187:4;57224:55;57269:9;57224:36;:11;:34;:36::i;:::-;:44;;:55;;;;:::i;:::-;57207:72;;:13;;;;;;;;;;;:72;;;57200:79;;57091:194;;;;:::o;48501:754::-;48656:4;48677:15;:2;:13;;;:15::i;:::-;48673:575;;;48729:2;48713:36;;;48750:12;:10;:12::i;:::-;48764:4;48770:7;48779:5;48713:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;48709:484;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48976:1;48959:6;:13;:18;48955:223;;49002:11;;;;;;;;;;:::i;:::-;;;;;;;;48955:223;49128:6;49122:13;49113:6;49109:2;49105:15;49098:38;48709:484;48846:45;;;48836:55;;;:6;:55;;;;48829:62;;;;;48673:575;49232:4;49225:11;;48501:754;;;;;;;:::o;19404:723::-;19460:13;19690:1;19681:5;:10;19677:53;;19708:10;;;;;;;;;;;;;;;;;;;;;19677:53;19740:12;19755:5;19740:20;;19771:14;19796:78;19811:1;19803:4;:9;19796:78;;19829:8;;;;;:::i;:::-;;;;19860:2;19852:10;;;;;:::i;:::-;;;19796:78;;;19884:19;19916:6;19906:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19884:39;;19934:154;19950:1;19941:5;:10;19934:154;;19978:1;19968:11;;;;;:::i;:::-;;;20045:2;20037:5;:10;;;;:::i;:::-;20024:2;:24;;;;:::i;:::-;20011:39;;19994:6;20001;19994:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;20074:2;20065:11;;;;;:::i;:::-;;;19934:154;;;20112:6;20098:21;;;;;19404:723;;;;:::o;43670:1257::-;43793:20;43816:12;;43793:35;;43861:1;43847:16;;:2;:16;;;43839:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;44014:21;44022:12;44014:7;:21::i;:::-;44013:22;44005:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;44072:12;44060:8;:24;;44052:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;44103:61;44133:1;44137:2;44141:12;44155:8;44103:21;:61::i;:::-;44177:30;44210:12;:16;44223:2;44210:16;;;;;;;;;;;;;;;44177:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44256:135;;;;;;;;44312:8;44282:11;:19;;;:39;;;;:::i;:::-;44256:135;;;;;;44371:8;44336:11;:24;;;:44;;;;:::i;:::-;44256:135;;;;;44237:12;:16;44250:2;44237:16;;;;;;;;;;;;;;;:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44430:43;;;;;;;;44445:2;44430:43;;;;;;44456:15;44430:43;;;;;44402:11;:25;44414:12;44402:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44486:20;44509:12;44486:35;;44539:9;44534:275;44558:8;44554:1;:12;44534:275;;;44618:12;44614:2;44593:38;;44610:1;44593:38;;;;;;;;;;;;44672:59;44703:1;44707:2;44711:12;44725:5;44672:22;:59::i;:::-;44646:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;44783:14;;;;;:::i;:::-;;;;44568:3;;;;;:::i;:::-;;;;44534:275;;;;44836:12;44821;:27;;;;44859:60;44888:1;44892:2;44896:12;44910:8;44859:20;:60::i;:::-;43782:1145;;;43670:1257;;;:::o;49743:159::-;;;;;:::o;50314:158::-;;;;;:::o;29382:269::-;29451:7;29637:4;29584:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;29574:69;;;;;;29567:76;;29382:269;;;:::o;25580:231::-;25658:7;25679:17;25698:18;25720:27;25731:4;25737:9;25720:10;:27::i;:::-;25678:69;;;;25758:18;25770:5;25758:11;:18::i;:::-;25794:9;25787:16;;;;25580:231;;;;:::o;1233:326::-;1293:4;1550:1;1528:7;:19;;;:23;1521:30;;1233:326;;;:::o;23470:1308::-;23551:7;23560:12;23805:2;23785:9;:16;:22;23781:990;;23824:9;23848;23872:7;24081:4;24070:9;24066:20;24060:27;24055:32;;24131:4;24120:9;24116:20;24110:27;24105:32;;24189:4;24178:9;24174:20;24168:27;24165:1;24160:36;24155:41;;24232:25;24243:4;24249:1;24252;24255;24232:10;:25::i;:::-;24225:32;;;;;;;;;23781:990;24299:2;24279:9;:16;:22;24275:496;;24318:9;24342:10;24554:4;24543:9;24539:20;24533:27;24528:32;;24605:4;24594:9;24590:20;24584:27;24578:33;;24647:23;24658:4;24664:1;24667:2;24647:10;:23::i;:::-;24640:30;;;;;;;;24275:496;24719:1;24723:35;24703:56;;;;23470:1308;;;;;;:::o;21741:643::-;21819:20;21810:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;21806:571;21856:7;21806:571;21917:29;21908:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;21904:473;;21963:34;;;;;;;;;;:::i;:::-;;;;;;;;21904:473;22028:35;22019:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;22015:362;;22080:41;;;;;;;;;;:::i;:::-;;;;;;;;22015:362;22152:30;22143:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;22139:238;;22199:44;;;;;;;;;;:::i;:::-;;;;;;;;22139:238;22274:30;22265:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;22261:116;;22321:44;;;;;;;;;;:::i;:::-;;;;;;;;22261:116;21741:643;;:::o;27032:1632::-;27163:7;27172:12;28097:66;28092:1;28084:10;;:79;28080:163;;;28196:1;28200:30;28180:51;;;;;;28080:163;28262:2;28257:1;:7;;;;:18;;;;;28273:2;28268:1;:7;;;;28257:18;28253:102;;;28308:1;28312:30;28292:51;;;;;;28253:102;28452:14;28469:24;28479:4;28485:1;28488;28491;28469:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28452:41;;28526:1;28508:20;;:6;:20;;;28504:103;;28561:1;28565:29;28545:50;;;;;;;28504:103;28627:6;28635:20;28619:37;;;;;27032:1632;;;;;;;;:::o;26074:344::-;26188:7;26197:12;26222:9;26247:66;26239:75;;26234:2;:80;26222:92;;26325:7;26364:2;26357:3;26350:2;26342:11;;:18;;26341:25;;;;:::i;:::-;26325:42;;26385:25;26396:4;26402:1;26405;26408;26385:10;:25::i;:::-;26378:32;;;;;;26074:344;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:180::-;138:77;135:1;128:88;235:4;232:1;225:15;259:4;256:1;249:15;276:180;324:77;321:1;314:88;421:4;418:1;411:15;445:4;442:1;435:15;462:185;502:1;519:20;537:1;519:20;:::i;:::-;514:25;;553:20;571:1;553:20;:::i;:::-;548:25;;592:1;582:35;;597:18;;:::i;:::-;582:35;639:1;636;632:9;627:14;;462:185;;;;:::o;653:75::-;686:6;719:2;713:9;703:19;;653:75;:::o;734:117::-;843:1;840;833:12;857:117;966:1;963;956:12;980:149;1016:7;1056:66;1049:5;1045:78;1034:89;;980:149;;;:::o;1135:120::-;1207:23;1224:5;1207:23;:::i;:::-;1200:5;1197:34;1187:62;;1245:1;1242;1235:12;1187:62;1135:120;:::o;1261:137::-;1306:5;1344:6;1331:20;1322:29;;1360:32;1386:5;1360:32;:::i;:::-;1261:137;;;;:::o;1404:327::-;1462:6;1511:2;1499:9;1490:7;1486:23;1482:32;1479:119;;;1517:79;;:::i;:::-;1479:119;1637:1;1662:52;1706:7;1697:6;1686:9;1682:22;1662:52;:::i;:::-;1652:62;;1608:116;1404:327;;;;:::o;1737:90::-;1771:7;1814:5;1807:13;1800:21;1789:32;;1737:90;;;:::o;1833:109::-;1914:21;1929:5;1914:21;:::i;:::-;1909:3;1902:34;1833:109;;:::o;1948:210::-;2035:4;2073:2;2062:9;2058:18;2050:26;;2086:65;2148:1;2137:9;2133:17;2124:6;2086:65;:::i;:::-;1948:210;;;;:::o;2164:99::-;2216:6;2250:5;2244:12;2234:22;;2164:99;;;:::o;2269:169::-;2353:11;2387:6;2382:3;2375:19;2427:4;2422:3;2418:14;2403:29;;2269:169;;;;:::o;2444:307::-;2512:1;2522:113;2536:6;2533:1;2530:13;2522:113;;;2621:1;2616:3;2612:11;2606:18;2602:1;2597:3;2593:11;2586:39;2558:2;2555:1;2551:10;2546:15;;2522:113;;;2653:6;2650:1;2647:13;2644:101;;;2733:1;2724:6;2719:3;2715:16;2708:27;2644:101;2493:258;2444:307;;;:::o;2757:102::-;2798:6;2849:2;2845:7;2840:2;2833:5;2829:14;2825:28;2815:38;;2757:102;;;:::o;2865:364::-;2953:3;2981:39;3014:5;2981:39;:::i;:::-;3036:71;3100:6;3095:3;3036:71;:::i;:::-;3029:78;;3116:52;3161:6;3156:3;3149:4;3142:5;3138:16;3116:52;:::i;:::-;3193:29;3215:6;3193:29;:::i;:::-;3188:3;3184:39;3177:46;;2957:272;2865:364;;;;:::o;3235:313::-;3348:4;3386:2;3375:9;3371:18;3363:26;;3435:9;3429:4;3425:20;3421:1;3410:9;3406:17;3399:47;3463:78;3536:4;3527:6;3463:78;:::i;:::-;3455:86;;3235:313;;;;:::o;3554:122::-;3627:24;3645:5;3627:24;:::i;:::-;3620:5;3617:35;3607:63;;3666:1;3663;3656:12;3607:63;3554:122;:::o;3682:139::-;3728:5;3766:6;3753:20;3744:29;;3782:33;3809:5;3782:33;:::i;:::-;3682:139;;;;:::o;3827:329::-;3886:6;3935:2;3923:9;3914:7;3910:23;3906:32;3903:119;;;3941:79;;:::i;:::-;3903:119;4061:1;4086:53;4131:7;4122:6;4111:9;4107:22;4086:53;:::i;:::-;4076:63;;4032:117;3827:329;;;;:::o;4162:126::-;4199:7;4239:42;4232:5;4228:54;4217:65;;4162:126;;;:::o;4294:96::-;4331:7;4360:24;4378:5;4360:24;:::i;:::-;4349:35;;4294:96;;;:::o;4396:118::-;4483:24;4501:5;4483:24;:::i;:::-;4478:3;4471:37;4396:118;;:::o;4520:222::-;4613:4;4651:2;4640:9;4636:18;4628:26;;4664:71;4732:1;4721:9;4717:17;4708:6;4664:71;:::i;:::-;4520:222;;;;:::o;4748:122::-;4821:24;4839:5;4821:24;:::i;:::-;4814:5;4811:35;4801:63;;4860:1;4857;4850:12;4801:63;4748:122;:::o;4876:139::-;4922:5;4960:6;4947:20;4938:29;;4976:33;5003:5;4976:33;:::i;:::-;4876:139;;;;:::o;5021:474::-;5089:6;5097;5146:2;5134:9;5125:7;5121:23;5117:32;5114:119;;;5152:79;;:::i;:::-;5114:119;5272:1;5297:53;5342:7;5333:6;5322:9;5318:22;5297:53;:::i;:::-;5287:63;;5243:117;5399:2;5425:53;5470:7;5461:6;5450:9;5446:22;5425:53;:::i;:::-;5415:63;;5370:118;5021:474;;;;;:::o;5501:117::-;5610:1;5607;5600:12;5624:117;5733:1;5730;5723:12;5747:180;5795:77;5792:1;5785:88;5892:4;5889:1;5882:15;5916:4;5913:1;5906:15;5933:281;6016:27;6038:4;6016:27;:::i;:::-;6008:6;6004:40;6146:6;6134:10;6131:22;6110:18;6098:10;6095:34;6092:62;6089:88;;;6157:18;;:::i;:::-;6089:88;6197:10;6193:2;6186:22;5976:238;5933:281;;:::o;6220:129::-;6254:6;6281:20;;:::i;:::-;6271:30;;6310:33;6338:4;6330:6;6310:33;:::i;:::-;6220:129;;;:::o;6355:308::-;6417:4;6507:18;6499:6;6496:30;6493:56;;;6529:18;;:::i;:::-;6493:56;6567:29;6589:6;6567:29;:::i;:::-;6559:37;;6651:4;6645;6641:15;6633:23;;6355:308;;;:::o;6669:154::-;6753:6;6748:3;6743;6730:30;6815:1;6806:6;6801:3;6797:16;6790:27;6669:154;;;:::o;6829:412::-;6907:5;6932:66;6948:49;6990:6;6948:49;:::i;:::-;6932:66;:::i;:::-;6923:75;;7021:6;7014:5;7007:21;7059:4;7052:5;7048:16;7097:3;7088:6;7083:3;7079:16;7076:25;7073:112;;;7104:79;;:::i;:::-;7073:112;7194:41;7228:6;7223:3;7218;7194:41;:::i;:::-;6913:328;6829:412;;;;;:::o;7261:340::-;7317:5;7366:3;7359:4;7351:6;7347:17;7343:27;7333:122;;7374:79;;:::i;:::-;7333:122;7491:6;7478:20;7516:79;7591:3;7583:6;7576:4;7568:6;7564:17;7516:79;:::i;:::-;7507:88;;7323:278;7261:340;;;;:::o;7607:509::-;7676:6;7725:2;7713:9;7704:7;7700:23;7696:32;7693:119;;;7731:79;;:::i;:::-;7693:119;7879:1;7868:9;7864:17;7851:31;7909:18;7901:6;7898:30;7895:117;;;7931:79;;:::i;:::-;7895:117;8036:63;8091:7;8082:6;8071:9;8067:22;8036:63;:::i;:::-;8026:73;;7822:287;7607:509;;;;:::o;8122:118::-;8209:24;8227:5;8209:24;:::i;:::-;8204:3;8197:37;8122:118;;:::o;8246:222::-;8339:4;8377:2;8366:9;8362:18;8354:26;;8390:71;8458:1;8447:9;8443:17;8434:6;8390:71;:::i;:::-;8246:222;;;;:::o;8474:619::-;8551:6;8559;8567;8616:2;8604:9;8595:7;8591:23;8587:32;8584:119;;;8622:79;;:::i;:::-;8584:119;8742:1;8767:53;8812:7;8803:6;8792:9;8788:22;8767:53;:::i;:::-;8757:63;;8713:117;8869:2;8895:53;8940:7;8931:6;8920:9;8916:22;8895:53;:::i;:::-;8885:63;;8840:118;8997:2;9023:53;9068:7;9059:6;9048:9;9044:22;9023:53;:::i;:::-;9013:63;;8968:118;8474:619;;;;;:::o;9099:329::-;9158:6;9207:2;9195:9;9186:7;9182:23;9178:32;9175:119;;;9213:79;;:::i;:::-;9175:119;9333:1;9358:53;9403:7;9394:6;9383:9;9379:22;9358:53;:::i;:::-;9348:63;;9304:117;9099:329;;;;:::o;9434:474::-;9502:6;9510;9559:2;9547:9;9538:7;9534:23;9530:32;9527:119;;;9565:79;;:::i;:::-;9527:119;9685:1;9710:53;9755:7;9746:6;9735:9;9731:22;9710:53;:::i;:::-;9700:63;;9656:117;9812:2;9838:53;9883:7;9874:6;9863:9;9859:22;9838:53;:::i;:::-;9828:63;;9783:118;9434:474;;;;;:::o;9914:77::-;9951:7;9980:5;9969:16;;9914:77;;;:::o;9997:118::-;10084:24;10102:5;10084:24;:::i;:::-;10079:3;10072:37;9997:118;;:::o;10121:222::-;10214:4;10252:2;10241:9;10237:18;10229:26;;10265:71;10333:1;10322:9;10318:17;10309:6;10265:71;:::i;:::-;10121:222;;;;:::o;10349:114::-;10437:1;10430:5;10427:12;10417:40;;10453:1;10450;10443:12;10417:40;10349:114;:::o;10469:169::-;10530:5;10568:6;10555:20;10546:29;;10584:48;10626:5;10584:48;:::i;:::-;10469:169;;;;:::o;10644:359::-;10718:6;10767:2;10755:9;10746:7;10742:23;10738:32;10735:119;;;10773:79;;:::i;:::-;10735:119;10893:1;10918:68;10978:7;10969:6;10958:9;10954:22;10918:68;:::i;:::-;10908:78;;10864:132;10644:359;;;;:::o;11009:180::-;11057:77;11054:1;11047:88;11154:4;11151:1;11144:15;11178:4;11175:1;11168:15;11195:120;11283:1;11276:5;11273:12;11263:46;;11289:18;;:::i;:::-;11263:46;11195:120;:::o;11321:141::-;11373:7;11402:5;11391:16;;11408:48;11450:5;11408:48;:::i;:::-;11321:141;;;:::o;11468:::-;11531:9;11564:39;11597:5;11564:39;:::i;:::-;11551:52;;11468:141;;;:::o;11615:157::-;11715:50;11759:5;11715:50;:::i;:::-;11710:3;11703:63;11615:157;;:::o;11778:248::-;11884:4;11922:2;11911:9;11907:18;11899:26;;11935:84;12016:1;12005:9;12001:17;11992:6;11935:84;:::i;:::-;11778:248;;;;:::o;12032:116::-;12102:21;12117:5;12102:21;:::i;:::-;12095:5;12092:32;12082:60;;12138:1;12135;12128:12;12082:60;12032:116;:::o;12154:133::-;12197:5;12235:6;12222:20;12213:29;;12251:30;12275:5;12251:30;:::i;:::-;12154:133;;;;:::o;12293:468::-;12358:6;12366;12415:2;12403:9;12394:7;12390:23;12386:32;12383:119;;;12421:79;;:::i;:::-;12383:119;12541:1;12566:53;12611:7;12602:6;12591:9;12587:22;12566:53;:::i;:::-;12556:63;;12512:117;12668:2;12694:50;12736:7;12727:6;12716:9;12712:22;12694:50;:::i;:::-;12684:60;;12639:115;12293:468;;;;;:::o;12767:122::-;12840:24;12858:5;12840:24;:::i;:::-;12833:5;12830:35;12820:63;;12879:1;12876;12869:12;12820:63;12767:122;:::o;12895:139::-;12941:5;12979:6;12966:20;12957:29;;12995:33;13022:5;12995:33;:::i;:::-;12895:139;;;;:::o;13040:117::-;13149:1;13146;13139:12;13163:117;13272:1;13269;13262:12;13299:552;13356:8;13366:6;13416:3;13409:4;13401:6;13397:17;13393:27;13383:122;;13424:79;;:::i;:::-;13383:122;13537:6;13524:20;13514:30;;13567:18;13559:6;13556:30;13553:117;;;13589:79;;:::i;:::-;13553:117;13703:4;13695:6;13691:17;13679:29;;13757:3;13749:4;13741:6;13737:17;13727:8;13723:32;13720:41;13717:128;;;13764:79;;:::i;:::-;13717:128;13299:552;;;;;:::o;13857:817::-;13945:6;13953;13961;13969;14018:2;14006:9;13997:7;13993:23;13989:32;13986:119;;;14024:79;;:::i;:::-;13986:119;14144:1;14169:53;14214:7;14205:6;14194:9;14190:22;14169:53;:::i;:::-;14159:63;;14115:117;14299:2;14288:9;14284:18;14271:32;14330:18;14322:6;14319:30;14316:117;;;14352:79;;:::i;:::-;14316:117;14465:64;14521:7;14512:6;14501:9;14497:22;14465:64;:::i;:::-;14447:82;;;;14242:297;14578:2;14604:53;14649:7;14640:6;14629:9;14625:22;14604:53;:::i;:::-;14594:63;;14549:118;13857:817;;;;;;;:::o;14680:307::-;14741:4;14831:18;14823:6;14820:30;14817:56;;;14853:18;;:::i;:::-;14817:56;14891:29;14913:6;14891:29;:::i;:::-;14883:37;;14975:4;14969;14965:15;14957:23;;14680:307;;;:::o;14993:410::-;15070:5;15095:65;15111:48;15152:6;15111:48;:::i;:::-;15095:65;:::i;:::-;15086:74;;15183:6;15176:5;15169:21;15221:4;15214:5;15210:16;15259:3;15250:6;15245:3;15241:16;15238:25;15235:112;;;15266:79;;:::i;:::-;15235:112;15356:41;15390:6;15385:3;15380;15356:41;:::i;:::-;15076:327;14993:410;;;;;:::o;15422:338::-;15477:5;15526:3;15519:4;15511:6;15507:17;15503:27;15493:122;;15534:79;;:::i;:::-;15493:122;15651:6;15638:20;15676:78;15750:3;15742:6;15735:4;15727:6;15723:17;15676:78;:::i;:::-;15667:87;;15483:277;15422:338;;;;:::o;15766:943::-;15861:6;15869;15877;15885;15934:3;15922:9;15913:7;15909:23;15905:33;15902:120;;;15941:79;;:::i;:::-;15902:120;16061:1;16086:53;16131:7;16122:6;16111:9;16107:22;16086:53;:::i;:::-;16076:63;;16032:117;16188:2;16214:53;16259:7;16250:6;16239:9;16235:22;16214:53;:::i;:::-;16204:63;;16159:118;16316:2;16342:53;16387:7;16378:6;16367:9;16363:22;16342:53;:::i;:::-;16332:63;;16287:118;16472:2;16461:9;16457:18;16444:32;16503:18;16495:6;16492:30;16489:117;;;16525:79;;:::i;:::-;16489:117;16630:62;16684:7;16675:6;16664:9;16660:22;16630:62;:::i;:::-;16620:72;;16415:287;15766:943;;;;;;;:::o;16715:151::-;16855:3;16851:1;16843:6;16839:14;16832:27;16715:151;:::o;16872:365::-;17014:3;17035:66;17099:1;17094:3;17035:66;:::i;:::-;17028:73;;17110:93;17199:3;17110:93;:::i;:::-;17228:2;17223:3;17219:12;17212:19;;16872:365;;;:::o;17243:419::-;17409:4;17447:2;17436:9;17432:18;17424:26;;17496:9;17490:4;17486:20;17482:1;17471:9;17467:17;17460:47;17524:131;17650:4;17524:131;:::i;:::-;17516:139;;17243:419;;;:::o;17668:305::-;17708:3;17727:20;17745:1;17727:20;:::i;:::-;17722:25;;17761:20;17779:1;17761:20;:::i;:::-;17756:25;;17915:1;17847:66;17843:74;17840:1;17837:81;17834:107;;;17921:18;;:::i;:::-;17834:107;17965:1;17962;17958:9;17951:16;;17668:305;;;;:::o;17979:151::-;18119:3;18115:1;18107:6;18103:14;18096:27;17979:151;:::o;18136:365::-;18278:3;18299:66;18363:1;18358:3;18299:66;:::i;:::-;18292:73;;18374:93;18463:3;18374:93;:::i;:::-;18492:2;18487:3;18483:12;18476:19;;18136:365;;;:::o;18507:419::-;18673:4;18711:2;18700:9;18696:18;18688:26;;18760:9;18754:4;18750:20;18746:1;18735:9;18731:17;18724:47;18788:131;18914:4;18788:131;:::i;:::-;18780:139;;18507:419;;;:::o;18932:151::-;19072:3;19068:1;19060:6;19056:14;19049:27;18932:151;:::o;19089:365::-;19231:3;19252:66;19316:1;19311:3;19252:66;:::i;:::-;19245:73;;19327:93;19416:3;19327:93;:::i;:::-;19445:2;19440:3;19436:12;19429:19;;19089:365;;;:::o;19460:419::-;19626:4;19664:2;19653:9;19649:18;19641:26;;19713:9;19707:4;19703:20;19699:1;19688:9;19684:17;19677:47;19741:131;19867:4;19741:131;:::i;:::-;19733:139;;19460:419;;;:::o;19885:348::-;19925:7;19948:20;19966:1;19948:20;:::i;:::-;19943:25;;19982:20;20000:1;19982:20;:::i;:::-;19977:25;;20170:1;20102:66;20098:74;20095:1;20092:81;20087:1;20080:9;20073:17;20069:105;20066:131;;;20177:18;;:::i;:::-;20066:131;20225:1;20222;20218:9;20207:20;;19885:348;;;;:::o;20239:151::-;20379:3;20375:1;20367:6;20363:14;20356:27;20239:151;:::o;20396:365::-;20538:3;20559:66;20623:1;20618:3;20559:66;:::i;:::-;20552:73;;20634:93;20723:3;20634:93;:::i;:::-;20752:2;20747:3;20743:12;20736:19;;20396:365;;;:::o;20767:419::-;20933:4;20971:2;20960:9;20956:18;20948:26;;21020:9;21014:4;21010:20;21006:1;20995:9;20991:17;20984:47;21048:131;21174:4;21048:131;:::i;:::-;21040:139;;20767:419;;;:::o;21192:442::-;21341:4;21379:2;21368:9;21364:18;21356:26;;21392:71;21460:1;21449:9;21445:17;21436:6;21392:71;:::i;:::-;21473:72;21541:2;21530:9;21526:18;21517:6;21473:72;:::i;:::-;21555;21623:2;21612:9;21608:18;21599:6;21555:72;:::i;:::-;21192:442;;;;;;:::o;21640:137::-;21694:5;21725:6;21719:13;21710:22;;21741:30;21765:5;21741:30;:::i;:::-;21640:137;;;;:::o;21783:345::-;21850:6;21899:2;21887:9;21878:7;21874:23;21870:32;21867:119;;;21905:79;;:::i;:::-;21867:119;22025:1;22050:61;22103:7;22094:6;22083:9;22079:22;22050:61;:::i;:::-;22040:71;;21996:125;21783:345;;;;:::o;22134:180::-;22182:77;22179:1;22172:88;22279:4;22276:1;22269:15;22303:4;22300:1;22293:15;22320:320;22364:6;22401:1;22395:4;22391:12;22381:22;;22448:1;22442:4;22438:12;22469:18;22459:81;;22525:4;22517:6;22513:17;22503:27;;22459:81;22587:2;22579:6;22576:14;22556:18;22553:38;22550:84;;22606:18;;:::i;:::-;22550:84;22371:269;22320:320;;;:::o;22646:151::-;22786:3;22782:1;22774:6;22770:14;22763:27;22646:151;:::o;22803:365::-;22945:3;22966:66;23030:1;23025:3;22966:66;:::i;:::-;22959:73;;23041:93;23130:3;23041:93;:::i;:::-;23159:2;23154:3;23150:12;23143:19;;22803:365;;;:::o;23174:419::-;23340:4;23378:2;23367:9;23363:18;23355:26;;23427:9;23421:4;23417:20;23413:1;23402:9;23398:17;23391:47;23455:131;23581:4;23455:131;:::i;:::-;23447:139;;23174:419;;;:::o;23599:182::-;23739:34;23735:1;23727:6;23723:14;23716:58;23599:182;:::o;23787:366::-;23929:3;23950:67;24014:2;24009:3;23950:67;:::i;:::-;23943:74;;24026:93;24115:3;24026:93;:::i;:::-;24144:2;24139:3;24135:12;24128:19;;23787:366;;;:::o;24159:419::-;24325:4;24363:2;24352:9;24348:18;24340:26;;24412:9;24406:4;24402:20;24398:1;24387:9;24383:17;24376:47;24440:131;24566:4;24440:131;:::i;:::-;24432:139;;24159:419;;;:::o;24584:141::-;24633:4;24656:3;24648:11;;24679:3;24676:1;24669:14;24713:4;24710:1;24700:18;24692:26;;24584:141;;;:::o;24731:93::-;24768:6;24815:2;24810;24803:5;24799:14;24795:23;24785:33;;24731:93;;;:::o;24830:107::-;24874:8;24924:5;24918:4;24914:16;24893:37;;24830:107;;;;:::o;24943:393::-;25012:6;25062:1;25050:10;25046:18;25085:97;25115:66;25104:9;25085:97;:::i;:::-;25203:39;25233:8;25222:9;25203:39;:::i;:::-;25191:51;;25275:4;25271:9;25264:5;25260:21;25251:30;;25324:4;25314:8;25310:19;25303:5;25300:30;25290:40;;25019:317;;24943:393;;;;;:::o;25342:60::-;25370:3;25391:5;25384:12;;25342:60;;;:::o;25408:142::-;25458:9;25491:53;25509:34;25518:24;25536:5;25518:24;:::i;:::-;25509:34;:::i;:::-;25491:53;:::i;:::-;25478:66;;25408:142;;;:::o;25556:75::-;25599:3;25620:5;25613:12;;25556:75;;;:::o;25637:269::-;25747:39;25778:7;25747:39;:::i;:::-;25808:91;25857:41;25881:16;25857:41;:::i;:::-;25849:6;25842:4;25836:11;25808:91;:::i;:::-;25802:4;25795:105;25713:193;25637:269;;;:::o;25912:73::-;25957:3;25912:73;:::o;25991:189::-;26068:32;;:::i;:::-;26109:65;26167:6;26159;26153:4;26109:65;:::i;:::-;26044:136;25991:189;;:::o;26186:186::-;26246:120;26263:3;26256:5;26253:14;26246:120;;;26317:39;26354:1;26347:5;26317:39;:::i;:::-;26290:1;26283:5;26279:13;26270:22;;26246:120;;;26186:186;;:::o;26378:543::-;26479:2;26474:3;26471:11;26468:446;;;26513:38;26545:5;26513:38;:::i;:::-;26597:29;26615:10;26597:29;:::i;:::-;26587:8;26583:44;26780:2;26768:10;26765:18;26762:49;;;26801:8;26786:23;;26762:49;26824:80;26880:22;26898:3;26880:22;:::i;:::-;26870:8;26866:37;26853:11;26824:80;:::i;:::-;26483:431;;26468:446;26378:543;;;:::o;26927:117::-;26981:8;27031:5;27025:4;27021:16;27000:37;;26927:117;;;;:::o;27050:169::-;27094:6;27127:51;27175:1;27171:6;27163:5;27160:1;27156:13;27127:51;:::i;:::-;27123:56;27208:4;27202;27198:15;27188:25;;27101:118;27050:169;;;;:::o;27224:295::-;27300:4;27446:29;27471:3;27465:4;27446:29;:::i;:::-;27438:37;;27508:3;27505:1;27501:11;27495:4;27492:21;27484:29;;27224:295;;;;:::o;27524:1395::-;27641:37;27674:3;27641:37;:::i;:::-;27743:18;27735:6;27732:30;27729:56;;;27765:18;;:::i;:::-;27729:56;27809:38;27841:4;27835:11;27809:38;:::i;:::-;27894:67;27954:6;27946;27940:4;27894:67;:::i;:::-;27988:1;28012:4;27999:17;;28044:2;28036:6;28033:14;28061:1;28056:618;;;;28718:1;28735:6;28732:77;;;28784:9;28779:3;28775:19;28769:26;28760:35;;28732:77;28835:67;28895:6;28888:5;28835:67;:::i;:::-;28829:4;28822:81;28691:222;28026:887;;28056:618;28108:4;28104:9;28096:6;28092:22;28142:37;28174:4;28142:37;:::i;:::-;28201:1;28215:208;28229:7;28226:1;28223:14;28215:208;;;28308:9;28303:3;28299:19;28293:26;28285:6;28278:42;28359:1;28351:6;28347:14;28337:24;;28406:2;28395:9;28391:18;28378:31;;28252:4;28249:1;28245:12;28240:17;;28215:208;;;28451:6;28442:7;28439:19;28436:179;;;28509:9;28504:3;28500:19;28494:26;28552:48;28594:4;28586:6;28582:17;28571:9;28552:48;:::i;:::-;28544:6;28537:64;28459:156;28436:179;28661:1;28657;28649:6;28645:14;28641:22;28635:4;28628:36;28063:611;;;28026:887;;27616:1303;;;27524:1395;;:::o;28925:151::-;29065:3;29061:1;29053:6;29049:14;29042:27;28925:151;:::o;29082:365::-;29224:3;29245:66;29309:1;29304:3;29245:66;:::i;:::-;29238:73;;29320:93;29409:3;29320:93;:::i;:::-;29438:2;29433:3;29429:12;29422:19;;29082:365;;;:::o;29453:419::-;29619:4;29657:2;29646:9;29642:18;29634:26;;29706:9;29700:4;29696:20;29692:1;29681:9;29677:17;29670:47;29734:131;29860:4;29734:131;:::i;:::-;29726:139;;29453:419;;;:::o;29878:233::-;29917:3;29940:24;29958:5;29940:24;:::i;:::-;29931:33;;29986:66;29979:5;29976:77;29973:103;;30056:18;;:::i;:::-;29973:103;30103:1;30096:5;30092:13;30085:20;;29878:233;;;:::o;30117:151::-;30257:3;30253:1;30245:6;30241:14;30234:27;30117:151;:::o;30274:365::-;30416:3;30437:66;30501:1;30496:3;30437:66;:::i;:::-;30430:73;;30512:93;30601:3;30512:93;:::i;:::-;30630:2;30625:3;30621:12;30614:19;;30274:365;;;:::o;30645:419::-;30811:4;30849:2;30838:9;30834:18;30826:26;;30898:9;30892:4;30888:20;30884:1;30873:9;30869:17;30862:47;30926:131;31052:4;30926:131;:::i;:::-;30918:139;;30645:419;;;:::o;31070:143::-;31127:5;31158:6;31152:13;31143:22;;31174:33;31201:5;31174:33;:::i;:::-;31070:143;;;;:::o;31219:351::-;31289:6;31338:2;31326:9;31317:7;31313:23;31309:32;31306:119;;;31344:79;;:::i;:::-;31306:119;31464:1;31489:64;31545:7;31536:6;31525:9;31521:22;31489:64;:::i;:::-;31479:74;;31435:128;31219:351;;;;:::o;31576:332::-;31697:4;31735:2;31724:9;31720:18;31712:26;;31748:71;31816:1;31805:9;31801:17;31792:6;31748:71;:::i;:::-;31829:72;31897:2;31886:9;31882:18;31873:6;31829:72;:::i;:::-;31576:332;;;;;:::o;31914:151::-;32054:3;32050:1;32042:6;32038:14;32031:27;31914:151;:::o;32071:365::-;32213:3;32234:66;32298:1;32293:3;32234:66;:::i;:::-;32227:73;;32309:93;32398:3;32309:93;:::i;:::-;32427:2;32422:3;32418:12;32411:19;;32071:365;;;:::o;32442:419::-;32608:4;32646:2;32635:9;32631:18;32623:26;;32695:9;32689:4;32685:20;32681:1;32670:9;32666:17;32659:47;32723:131;32849:4;32723:131;:::i;:::-;32715:139;;32442:419;;;:::o;32867:94::-;32900:8;32948:5;32944:2;32940:14;32919:35;;32867:94;;;:::o;32967:::-;33006:7;33035:20;33049:5;33035:20;:::i;:::-;33024:31;;32967:94;;;:::o;33067:100::-;33106:7;33135:26;33155:5;33135:26;:::i;:::-;33124:37;;33067:100;;;:::o;33173:157::-;33278:45;33298:24;33316:5;33298:24;:::i;:::-;33278:45;:::i;:::-;33273:3;33266:58;33173:157;;:::o;33336:397::-;33476:3;33491:75;33562:3;33553:6;33491:75;:::i;:::-;33591:2;33586:3;33582:12;33575:19;;33604:75;33675:3;33666:6;33604:75;:::i;:::-;33704:2;33699:3;33695:12;33688:19;;33724:3;33717:10;;33336:397;;;;;:::o;33739:151::-;33879:3;33875:1;33867:6;33863:14;33856:27;33739:151;:::o;33896:365::-;34038:3;34059:66;34123:1;34118:3;34059:66;:::i;:::-;34052:73;;34134:93;34223:3;34134:93;:::i;:::-;34252:2;34247:3;34243:12;34236:19;;33896:365;;;:::o;34267:419::-;34433:4;34471:2;34460:9;34456:18;34448:26;;34520:9;34514:4;34510:20;34506:1;34495:9;34491:17;34484:47;34548:131;34674:4;34548:131;:::i;:::-;34540:139;;34267:419;;;:::o;34692:151::-;34832:3;34828:1;34820:6;34816:14;34809:27;34692:151;:::o;34849:365::-;34991:3;35012:66;35076:1;35071:3;35012:66;:::i;:::-;35005:73;;35087:93;35176:3;35087:93;:::i;:::-;35205:2;35200:3;35196:12;35189:19;;34849:365;;;:::o;35220:419::-;35386:4;35424:2;35413:9;35409:18;35401:26;;35473:9;35467:4;35463:20;35459:1;35448:9;35444:17;35437:47;35501:131;35627:4;35501:131;:::i;:::-;35493:139;;35220:419;;;:::o;35645:151::-;35785:3;35781:1;35773:6;35769:14;35762:27;35645:151;:::o;35802:365::-;35944:3;35965:66;36029:1;36024:3;35965:66;:::i;:::-;35958:73;;36040:93;36129:3;36040:93;:::i;:::-;36158:2;36153:3;36149:12;36142:19;;35802:365;;;:::o;36173:419::-;36339:4;36377:2;36366:9;36362:18;36354:26;;36426:9;36420:4;36416:20;36412:1;36401:9;36397:17;36390:47;36454:131;36580:4;36454:131;:::i;:::-;36446:139;;36173:419;;;:::o;36598:151::-;36738:3;36734:1;36726:6;36722:14;36715:27;36598:151;:::o;36755:365::-;36897:3;36918:66;36982:1;36977:3;36918:66;:::i;:::-;36911:73;;36993:93;37082:3;36993:93;:::i;:::-;37111:2;37106:3;37102:12;37095:19;;36755:365;;;:::o;37126:419::-;37292:4;37330:2;37319:9;37315:18;37307:26;;37379:9;37373:4;37369:20;37365:1;37354:9;37350:17;37343:47;37407:131;37533:4;37407:131;:::i;:::-;37399:139;;37126:419;;;:::o;37551:148::-;37653:11;37690:3;37675:18;;37551:148;;;;:::o;37729:874::-;37832:3;37869:5;37863:12;37898:36;37924:9;37898:36;:::i;:::-;37950:89;38032:6;38027:3;37950:89;:::i;:::-;37943:96;;38070:1;38059:9;38055:17;38086:1;38081:166;;;;38261:1;38256:341;;;;38048:549;;38081:166;38165:4;38161:9;38150;38146:25;38141:3;38134:38;38227:6;38220:14;38213:22;38205:6;38201:35;38196:3;38192:45;38185:52;;38081:166;;38256:341;38323:38;38355:5;38323:38;:::i;:::-;38383:1;38397:154;38411:6;38408:1;38405:13;38397:154;;;38485:7;38479:14;38475:1;38470:3;38466:11;38459:35;38535:1;38526:7;38522:15;38511:26;;38433:4;38430:1;38426:12;38421:17;;38397:154;;;38580:6;38575:3;38571:16;38564:23;;38263:334;;38048:549;;37836:767;;37729:874;;;;:::o;38609:377::-;38715:3;38743:39;38776:5;38743:39;:::i;:::-;38798:89;38880:6;38875:3;38798:89;:::i;:::-;38791:96;;38896:52;38941:6;38936:3;38929:4;38922:5;38918:16;38896:52;:::i;:::-;38973:6;38968:3;38964:16;38957:23;;38719:267;38609:377;;;;:::o;38992:429::-;39169:3;39191:92;39279:3;39270:6;39191:92;:::i;:::-;39184:99;;39300:95;39391:3;39382:6;39300:95;:::i;:::-;39293:102;;39412:3;39405:10;;38992:429;;;;;:::o;39427:143::-;39484:5;39515:6;39509:13;39500:22;;39531:33;39558:5;39531:33;:::i;:::-;39427:143;;;;:::o;39576:351::-;39646:6;39695:2;39683:9;39674:7;39670:23;39666:32;39663:119;;;39701:79;;:::i;:::-;39663:119;39821:1;39846:64;39902:7;39893:6;39882:9;39878:22;39846:64;:::i;:::-;39836:74;;39792:128;39576:351;;;;:::o;39933:225::-;40073:34;40069:1;40061:6;40057:14;40050:58;40142:8;40137:2;40129:6;40125:15;40118:33;39933:225;:::o;40164:366::-;40306:3;40327:67;40391:2;40386:3;40327:67;:::i;:::-;40320:74;;40403:93;40492:3;40403:93;:::i;:::-;40521:2;40516:3;40512:12;40505:19;;40164:366;;;:::o;40536:419::-;40702:4;40740:2;40729:9;40725:18;40717:26;;40789:9;40783:4;40779:20;40775:1;40764:9;40760:17;40753:47;40817:131;40943:4;40817:131;:::i;:::-;40809:139;;40536:419;;;:::o;40961:118::-;40998:7;41038:34;41031:5;41027:46;41016:57;;40961:118;;;:::o;41085:191::-;41125:4;41145:20;41163:1;41145:20;:::i;:::-;41140:25;;41179:20;41197:1;41179:20;:::i;:::-;41174:25;;41218:1;41215;41212:8;41209:34;;;41223:18;;:::i;:::-;41209:34;41268:1;41265;41261:9;41253:17;;41085:191;;;;:::o;41282:273::-;41322:3;41341:20;41359:1;41341:20;:::i;:::-;41336:25;;41375:20;41393:1;41375:20;:::i;:::-;41370:25;;41497:1;41461:34;41457:42;41454:1;41451:49;41448:75;;;41503:18;;:::i;:::-;41448:75;41547:1;41544;41540:9;41533:16;;41282:273;;;;:::o;41561:151::-;41701:3;41697:1;41689:6;41685:14;41678:27;41561:151;:::o;41718:365::-;41860:3;41881:66;41945:1;41940:3;41881:66;:::i;:::-;41874:73;;41956:93;42045:3;41956:93;:::i;:::-;42074:2;42069:3;42065:12;42058:19;;41718:365;;;:::o;42089:419::-;42255:4;42293:2;42282:9;42278:18;42270:26;;42342:9;42336:4;42332:20;42328:1;42317:9;42313:17;42306:47;42370:131;42496:4;42370:131;:::i;:::-;42362:139;;42089:419;;;:::o;42514:191::-;42554:4;42574:20;42592:1;42574:20;:::i;:::-;42569:25;;42608:20;42626:1;42608:20;:::i;:::-;42603:25;;42647:1;42644;42641:8;42638:34;;;42652:18;;:::i;:::-;42638:34;42697:1;42694;42690:9;42682:17;;42514:191;;;;:::o;42711:171::-;42750:3;42773:24;42791:5;42773:24;:::i;:::-;42764:33;;42819:4;42812:5;42809:15;42806:41;;42827:18;;:::i;:::-;42806:41;42874:1;42867:5;42863:13;42856:20;;42711:171;;;:::o;42888:98::-;42939:6;42973:5;42967:12;42957:22;;42888:98;;;:::o;42992:168::-;43075:11;43109:6;43104:3;43097:19;43149:4;43144:3;43140:14;43125:29;;42992:168;;;;:::o;43166:360::-;43252:3;43280:38;43312:5;43280:38;:::i;:::-;43334:70;43397:6;43392:3;43334:70;:::i;:::-;43327:77;;43413:52;43458:6;43453:3;43446:4;43439:5;43435:16;43413:52;:::i;:::-;43490:29;43512:6;43490:29;:::i;:::-;43485:3;43481:39;43474:46;;43256:270;43166:360;;;;:::o;43532:640::-;43727:4;43765:3;43754:9;43750:19;43742:27;;43779:71;43847:1;43836:9;43832:17;43823:6;43779:71;:::i;:::-;43860:72;43928:2;43917:9;43913:18;43904:6;43860:72;:::i;:::-;43942;44010:2;43999:9;43995:18;43986:6;43942:72;:::i;:::-;44061:9;44055:4;44051:20;44046:2;44035:9;44031:18;44024:48;44089:76;44160:4;44151:6;44089:76;:::i;:::-;44081:84;;43532:640;;;;;;;:::o;44178:141::-;44234:5;44265:6;44259:13;44250:22;;44281:32;44307:5;44281:32;:::i;:::-;44178:141;;;;:::o;44325:349::-;44394:6;44443:2;44431:9;44422:7;44418:23;44414:32;44411:119;;;44449:79;;:::i;:::-;44411:119;44569:1;44594:63;44649:7;44640:6;44629:9;44625:22;44594:63;:::i;:::-;44584:73;;44540:127;44325:349;;;;:::o;44680:176::-;44712:1;44729:20;44747:1;44729:20;:::i;:::-;44724:25;;44763:20;44781:1;44763:20;:::i;:::-;44758:25;;44802:1;44792:35;;44807:18;;:::i;:::-;44792:35;44848:1;44845;44841:9;44836:14;;44680:176;;;;:::o;44862:180::-;44910:77;44907:1;44900:88;45007:4;45004:1;44997:15;45031:4;45028:1;45021:15;45048:214;45188:66;45184:1;45176:6;45172:14;45165:90;45048:214;:::o;45268:402::-;45428:3;45449:85;45531:2;45526:3;45449:85;:::i;:::-;45442:92;;45543:93;45632:3;45543:93;:::i;:::-;45661:2;45656:3;45652:12;45645:19;;45268:402;;;:::o;45676:79::-;45715:7;45744:5;45733:16;;45676:79;;;:::o;45761:157::-;45866:45;45886:24;45904:5;45886:24;:::i;:::-;45866:45;:::i;:::-;45861:3;45854:58;45761:157;;:::o;45924:522::-;46137:3;46159:148;46303:3;46159:148;:::i;:::-;46152:155;;46317:75;46388:3;46379:6;46317:75;:::i;:::-;46417:2;46412:3;46408:12;46401:19;;46437:3;46430:10;;45924:522;;;;:::o;46452:174::-;46592:26;46588:1;46580:6;46576:14;46569:50;46452:174;:::o;46632:366::-;46774:3;46795:67;46859:2;46854:3;46795:67;:::i;:::-;46788:74;;46871:93;46960:3;46871:93;:::i;:::-;46989:2;46984:3;46980:12;46973:19;;46632:366;;;:::o;47004:419::-;47170:4;47208:2;47197:9;47193:18;47185:26;;47257:9;47251:4;47247:20;47243:1;47232:9;47228:17;47221:47;47285:131;47411:4;47285:131;:::i;:::-;47277:139;;47004:419;;;:::o;47429:181::-;47569:33;47565:1;47557:6;47553:14;47546:57;47429:181;:::o;47616:366::-;47758:3;47779:67;47843:2;47838:3;47779:67;:::i;:::-;47772:74;;47855:93;47944:3;47855:93;:::i;:::-;47973:2;47968:3;47964:12;47957:19;;47616:366;;;:::o;47988:419::-;48154:4;48192:2;48181:9;48177:18;48169:26;;48241:9;48235:4;48231:20;48227:1;48216:9;48212:17;48205:47;48269:131;48395:4;48269:131;:::i;:::-;48261:139;;47988:419;;;:::o;48413:221::-;48553:34;48549:1;48541:6;48537:14;48530:58;48622:4;48617:2;48609:6;48605:15;48598:29;48413:221;:::o;48640:366::-;48782:3;48803:67;48867:2;48862:3;48803:67;:::i;:::-;48796:74;;48879:93;48968:3;48879:93;:::i;:::-;48997:2;48992:3;48988:12;48981:19;;48640:366;;;:::o;49012:419::-;49178:4;49216:2;49205:9;49201:18;49193:26;;49265:9;49259:4;49255:20;49251:1;49240:9;49236:17;49229:47;49293:131;49419:4;49293:131;:::i;:::-;49285:139;;49012:419;;;:::o;49437:221::-;49577:34;49573:1;49565:6;49561:14;49554:58;49646:4;49641:2;49633:6;49629:15;49622:29;49437:221;:::o;49664:366::-;49806:3;49827:67;49891:2;49886:3;49827:67;:::i;:::-;49820:74;;49903:93;49992:3;49903:93;:::i;:::-;50021:2;50016:3;50012:12;50005:19;;49664:366;;;:::o;50036:419::-;50202:4;50240:2;50229:9;50225:18;50217:26;;50289:9;50283:4;50279:20;50275:1;50264:9;50260:17;50253:47;50317:131;50443:4;50317:131;:::i;:::-;50309:139;;50036:419;;;:::o;50461:86::-;50496:7;50536:4;50529:5;50525:16;50514:27;;50461:86;;;:::o;50553:112::-;50636:22;50652:5;50636:22;:::i;:::-;50631:3;50624:35;50553:112;;:::o;50671:545::-;50844:4;50882:3;50871:9;50867:19;50859:27;;50896:71;50964:1;50953:9;50949:17;50940:6;50896:71;:::i;:::-;50977:68;51041:2;51030:9;51026:18;51017:6;50977:68;:::i;:::-;51055:72;51123:2;51112:9;51108:18;51099:6;51055:72;:::i;:::-;51137;51205:2;51194:9;51190:18;51181:6;51137:72;:::i;:::-;50671:545;;;;;;;:::o

Swarm Source

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