ETH Price: $3,118.02 (+1.54%)
Gas: 4 Gwei

Token

DEPETS Genesis (DEPETS Genesis)
 

Overview

Max Total Supply

500 DEPETS Genesis

Holders

371

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
*我的皎月闻越香.eth
Balance
2 DEPETS Genesis
0xe2d05e337C65e4Bd176e0bdb596EB925984981E4
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:
GameNFTEth

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-29
*/

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

// SPDX-License-Identifier: MIT
// 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\token\ERC721\IERC721.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin\contracts\utils\math\Math.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // 鈫?`sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // 鈫?`2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (Log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function Log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function Log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = Log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function Log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function Log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = Log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.Log256(value) + 1);
        }
    }

    /**
     * @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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

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

// File: @openzeppelin\contracts\utils\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\ERC721.sol


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

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

    /**
     * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

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

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

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

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

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

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

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

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

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

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

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

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

        _beforeTokenTransfer(from, to, tokenId, 1);

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

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

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

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

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256, /* firstTokenId */
        uint256 batchSize
    ) internal virtual {
        if (batchSize > 1) {
            if (from != address(0)) {
                _balances[from] -= batchSize;
            }
            if (to != address(0)) {
                _balances[to] += batchSize;
            }
        }
    }

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}
}

// 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\access\Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

// File: @openzeppelin\contracts\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\ERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, firstTokenId, batchSize);

        if (batchSize > 1) {
            // Will only trigger during construction. Batch transferring (minting) is not available afterwards.
            revert("ERC721Enumerable: consecutive transfers not supported");
        }

        uint256 tokenId = firstTokenId;

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin\contracts\access\IAccessControl.sol


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

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

// File: @openzeppelin\contracts\access\AccessControl.sol

// OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol)

pragma solidity ^0.8.0;




/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `_msgSender()` is missing `role`.
     * Overriding this function changes the behavior of the {onlyRole} modifier.
     *
     * Format of the revert message is described in {_checkRole}.
     *
     * _Available since v4.6._
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(account),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleGranted} event.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleRevoked} event.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * May emit a {RoleGranted} event.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

// File: contracts\GameNFTEth.sol



pragma solidity ^0.8.0;
contract GameNFTEth is ERC721, ERC721Enumerable, Ownable, AccessControl {
    string public PROVENANCE="Ethereum";
    address public MASTER;
    bytes32 public constant MASTER_ROLE = keccak256('MASTER_ROLE');
    bytes32 public constant ADMIN_ROLE = keccak256('ADMIN_ROLE');
  
    bool public saleIsActive = true;
    string private _baseURIextended;
     // Mapping from token ID to auth id
    mapping(uint256 => uint256) public _tokenAuths;
    // Mapping from sign to use
    mapping(uint256 => bool) authIdUsed;



    constructor(string memory _name, string memory _symbol, string memory baseuri, address masterAddress, address[] memory admins) ERC721(_name, _symbol) {
        MASTER = masterAddress;
        _baseURIextended = baseuri;
        _setupRole(MASTER_ROLE, MASTER);
        _setupRole(MASTER_ROLE, admins[0]);
        _setupRole(ADMIN_ROLE, MASTER);
        _setRoleAdmin(ADMIN_ROLE, MASTER_ROLE);
        for(uint i = 0; i < admins.length; i ++){
            grantRole(ADMIN_ROLE, admins[i]);
        }
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenId, uint256 batchSize) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId, batchSize);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC721Enumerable,AccessControl) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    function setBaseURI(string memory baseURI_) external onlyRole(ADMIN_ROLE) {
        _baseURIextended = baseURI_;
    }

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

    function setProvenance(string memory provenance) public onlyRole(MASTER_ROLE) {
        PROVENANCE = provenance;
    }

    function setSaleState(bool newState) public onlyRole(ADMIN_ROLE) {
        saleIsActive = newState;
    }

    function mintSerials(uint256 startauthid, uint256 num) public onlyRole(ADMIN_ROLE) {
        for(uint i = 0; i < num; ++i ){
            mint(MASTER, startauthid + i);
        }
    }
    function mint(address to, uint256 authId) internal {
         uint256 tokenId = totalSupply() + 1;
        _safeMint(to, tokenId);
        _tokenAuths[tokenId] = authId;
        authIdUsed[authId] = true;
    }
    function ethBuy(address to, uint256[] memory authIds, uint256 totalprice, uint256 deadline, bytes memory _signature) public payable {
        require(saleIsActive, "Sale must be active to mint tokens");
        require(msg.value >= totalprice, "Insufficient price");
        require(verify(to, authIds, totalprice, deadline, abi.encodePacked(address(this)), _signature), "invalid signature ");
        require(deadline <= 0 || deadline >= block.timestamp, "Signature has expired");
        require(totalSupply() + authIds.length <= 500 , "Superior limit");
        for(uint i = 0; i < authIds.length; i ++){
            require(!authIdUsed[authIds[i]], "Authid used");
        }
        for(uint i = 0; i < authIds.length; i ++){
            mint(to, authIds[i]);  
        } 
    }
    function withdraw() public onlyRole(ADMIN_ROLE) {
        uint balance = address(this).balance;
        payable(MASTER).transfer(balance);
    }
     function withdrawToken(uint256 _amount, IERC20 token) public onlyRole(ADMIN_ROLE) {
        token.transfer(MASTER, _amount);
    }
    function isAdmin(address user) public view returns(bool) {
        return hasRole(ADMIN_ROLE, user);
    }
    function getAuthId(uint256 tokenId) public view returns(uint256) {
        return _tokenAuths[tokenId];
    }
    function getAuthIds(uint256[] memory tokenIds) public view returns(uint256[] memory) {
        uint256[] memory authids = new uint256[](tokenIds.length);
        for(uint i = 0; i < tokenIds.length; i ++){
            authids[i] = getAuthId(tokenIds[i]);
        }
        return authids;
    }
    function authHasUsed(uint256 authid) public view returns(bool){
        return authIdUsed[authid];
    }
    function getAllNfts(address user) public view returns(uint256[] memory) {
        uint256 length = ERC721.balanceOf(user);
        uint256[] memory tokenIds = new uint256[](length);
        for(uint256 i = 0; i < length; i++) {
            tokenIds[i] = (tokenOfOwnerByIndex(user,i));
        }
        return tokenIds;
    } 
    function getMessageHash(address _to, uint256[] memory authIds, uint256 price,uint256 deadline, bytes memory token) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(authIds, _to, price, deadline, token));
    }
    function verify(address _to, uint256[] memory authIds, uint256 price, uint256 deadline, bytes memory token, bytes memory signature) internal view returns (bool) {
        bytes32 messageHash = getMessageHash(_to, authIds, price, deadline, token);
        return hasRole(ADMIN_ROLE, recoverSigner(getEthSignedMessageHash(messageHash), signature));
    }
    function recoverSigner(bytes32 _ethSignedMessageHash, bytes memory _signature)
        internal
        pure
        returns (address)
    {
        (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature);

        return ecrecover(_ethSignedMessageHash, v, r, s);
    }

    function splitSignature(bytes memory sig)
        internal
        pure
        returns (
            bytes32 r,
            bytes32 s,
            uint8 v
        )
    {
        require(sig.length == 65, "invalid signature length");

        assembly {
            /*
            First 32 bytes stores the length of the signature
            add(sig, 32) = pointer of sig + 32
            effectively, skips first 32 bytes of signature
            mload(p) loads next 32 bytes starting at the memory address p into memory
            */
            // first 32 bytes, after the length prefix
            r := mload(add(sig, 32))
            // second 32 bytes
            s := mload(add(sig, 64))
            // final byte (first byte of the next 32 bytes)
            v := byte(0, mload(add(sig, 96)))
        }
        // implicitly return (r, s, v)
    }
    

    function getEthSignedMessageHash(bytes32 _messageHash)
        internal view
        returns (bytes32)
    {
        /*
        Signature is produced by signing a keccak256 hash with the following format:
        "\x19Ethereum Signed Message\n" + len(msg) + msg
        */
        return
            keccak256(
                abi.encodePacked("\x19", PROVENANCE, " Signed Message:\n32", _messageHash)
            );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"baseuri","type":"string"},{"internalType":"address","name":"masterAddress","type":"address"},{"internalType":"address[]","name":"admins","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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MASTER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MASTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_tokenAuths","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":"uint256","name":"authid","type":"uint256"}],"name":"authHasUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"authIds","type":"uint256[]"},{"internalType":"uint256","name":"totalprice","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"ethBuy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getAllNfts","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAuthId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"getAuthIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startauthid","type":"uint256"},{"internalType":"uint256","name":"num","type":"uint256"}],"name":"mintSerials","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenance","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"setSaleState","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":"uint256","name":"_amount","type":"uint256"},{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600881526020017f457468657265756d000000000000000000000000000000000000000000000000815250600c90816200004a919062000bd4565b506001600d60146101000a81548160ff0219169083151502179055503480156200007357600080fd5b5060405162006fbc38038062006fbc833981810160405281019062000099919062000f5f565b84848160009081620000ac919062000bd4565b508060019081620000be919062000bd4565b505050620000e1620000d5620002fc60201b60201c565b6200030460201b60201c565b81600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600e908162000133919062000bd4565b50620001887f8b8c0776df2c2176edf6f82391c35ea4891146d7a976ee36fd07f1a6fb4ead4c600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620003ca60201b60201c565b620001d87f8b8c0776df2c2176edf6f82391c35ea4891146d7a976ee36fd07f1a6fb4ead4c82600081518110620001c457620001c362001063565b5b6020026020010151620003ca60201b60201c565b6200022c7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620003ca60201b60201c565b6200027e7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217757f8b8c0776df2c2176edf6f82391c35ea4891146d7a976ee36fd07f1a6fb4ead4c620003e060201b60201c565b60005b8151811015620002f057620002da7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775838381518110620002c657620002c562001063565b5b60200260200101516200044460201b60201c565b8080620002e790620010c1565b91505062000281565b505050505050620013ce565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003dc82826200047d60201b60201c565b5050565b6000620003f3836200056f60201b60201c565b905081600b6000858152602001908152602001600020600101819055508181847fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a4505050565b62000455826200056f60201b60201c565b62000466816200058f60201b60201c565b6200047883836200047d60201b60201c565b505050565b6200048f8282620005b360201b60201c565b6200056b576001600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000510620002fc60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000600b6000838152602001908152602001600020600101549050919050565b620005b081620005a4620002fc60201b60201c565b6200061e60201b60201c565b50565b6000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b620006308282620005b360201b60201c565b620006c6576200064b81620006ca60201b62001bae1760201c565b620006668360001c6020620006ff60201b62001bdb1760201c565b60405160200162000679929190620011f0565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006bd919062001284565b60405180910390fd5b5050565b6060620006f88273ffffffffffffffffffffffffffffffffffffffff16601460ff16620006ff60201b60201c565b9050919050565b606060006002836002620007149190620012a8565b620007209190620012f3565b67ffffffffffffffff8111156200073c576200073b62000965565b5b6040519080825280601f01601f1916602001820160405280156200076f5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110620007aa57620007a962001063565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811062000811576200081062001063565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002620008539190620012a8565b6200085f9190620012f3565b90505b600181111562000909577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110620008a557620008a462001063565b5b1a60f81b828281518110620008bf57620008be62001063565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508062000901906200132e565b905062000862565b506000841462000950576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200094790620013ac565b60405180910390fd5b8091505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009dc57607f821691505b602082108103620009f257620009f162000994565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000a5c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a1d565b62000a68868362000a1d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000ab562000aaf62000aa98462000a80565b62000a8a565b62000a80565b9050919050565b6000819050919050565b62000ad18362000a94565b62000ae962000ae08262000abc565b84845462000a2a565b825550505050565b600090565b62000b0062000af1565b62000b0d81848462000ac6565b505050565b5b8181101562000b355762000b2960008262000af6565b60018101905062000b13565b5050565b601f82111562000b845762000b4e81620009f8565b62000b598462000a0d565b8101602085101562000b69578190505b62000b8162000b788562000a0d565b83018262000b12565b50505b505050565b600082821c905092915050565b600062000ba96000198460080262000b89565b1980831691505092915050565b600062000bc4838362000b96565b9150826002028217905092915050565b62000bdf826200095a565b67ffffffffffffffff81111562000bfb5762000bfa62000965565b5b62000c078254620009c3565b62000c1482828562000b39565b600060209050601f83116001811462000c4c576000841562000c37578287015190505b62000c43858262000bb6565b86555062000cb3565b601f19841662000c5c86620009f8565b60005b8281101562000c865784890151825560018201915060208501945060208101905062000c5f565b8683101562000ca6578489015162000ca2601f89168262000b96565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b62000cf58262000cd9565b810181811067ffffffffffffffff8211171562000d175762000d1662000965565b5b80604052505050565b600062000d2c62000cbb565b905062000d3a828262000cea565b919050565b600067ffffffffffffffff82111562000d5d5762000d5c62000965565b5b62000d688262000cd9565b9050602081019050919050565b60005b8381101562000d9557808201518184015260208101905062000d78565b60008484015250505050565b600062000db862000db28462000d3f565b62000d20565b90508281526020810184848401111562000dd75762000dd662000cd4565b5b62000de484828562000d75565b509392505050565b600082601f83011262000e045762000e0362000ccf565b5b815162000e1684826020860162000da1565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000e4c8262000e1f565b9050919050565b62000e5e8162000e3f565b811462000e6a57600080fd5b50565b60008151905062000e7e8162000e53565b92915050565b600067ffffffffffffffff82111562000ea25762000ea162000965565b5b602082029050602081019050919050565b600080fd5b600062000ecf62000ec98462000e84565b62000d20565b9050808382526020820190506020840283018581111562000ef55762000ef462000eb3565b5b835b8181101562000f22578062000f0d888262000e6d565b84526020840193505060208101905062000ef7565b5050509392505050565b600082601f83011262000f445762000f4362000ccf565b5b815162000f5684826020860162000eb8565b91505092915050565b600080600080600060a0868803121562000f7e5762000f7d62000cc5565b5b600086015167ffffffffffffffff81111562000f9f5762000f9e62000cca565b5b62000fad8882890162000dec565b955050602086015167ffffffffffffffff81111562000fd15762000fd062000cca565b5b62000fdf8882890162000dec565b945050604086015167ffffffffffffffff81111562001003576200100262000cca565b5b620010118882890162000dec565b9350506060620010248882890162000e6d565b925050608086015167ffffffffffffffff81111562001048576200104762000cca565b5b620010568882890162000f2c565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620010ce8262000a80565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362001103576200110262001092565b5b600182019050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000620011516017836200110e565b91506200115e8262001119565b601782019050919050565b600062001176826200095a565b6200118281856200110e565b93506200119481856020860162000d75565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000620011d86011836200110e565b9150620011e582620011a0565b601182019050919050565b6000620011fd8262001142565b91506200120b828562001169565b91506200121882620011c9565b915062001226828462001169565b91508190509392505050565b600082825260208201905092915050565b600062001250826200095a565b6200125c818562001232565b93506200126e81856020860162000d75565b620012798162000cd9565b840191505092915050565b60006020820190508181036000830152620012a0818462001243565b905092915050565b6000620012b58262000a80565b9150620012c28362000a80565b9250828202620012d28162000a80565b91508282048414831517620012ec57620012eb62001092565b5b5092915050565b6000620013008262000a80565b91506200130d8362000a80565b925082820190508082111562001328576200132762001092565b5b92915050565b60006200133b8262000a80565b91506000820362001351576200135062001092565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006200139460208362001232565b9150620013a1826200135c565b602082019050919050565b60006020820190508181036000830152620013c78162001385565b9050919050565b615bde80620013de6000396000f3fe60806040526004361061025c5760003560e01c806370a0823111610144578063b88d4fde116100b6578063dc2248631161007a578063dc22486314610945578063e94d062b14610970578063e985e9c5146109ad578063eb8d2444146109ea578063f2fde38b14610a15578063ffe630b514610a3e5761025c565b8063b88d4fde14610864578063be4b17721461088d578063c4e37095146108b6578063c87b56dd146108df578063d547741f1461091c5761025c565b80638ca38e69116101085780638ca38e69146107405780638da5cb5b1461077d57806391d14854146107a857806395d89b41146107e5578063a217fddf14610810578063a22cb4651461083b5761025c565b806370a082311461065b578063715018a61461069857806375b238fc146106af57806377091292146106da5780638ab0499f146107175761025c565b80632f745c59116101dd5780634f6ccce7116101a15780634f6ccce71461051357806355f804b3146105505780636352211e146105795780636373a6b1146105b657806363ae541c146105e157806366f4456d1461061e5761025c565b80632f745c591461044257806336568abe1461047f5780633ccfd60b146104a857806342842e0e146104bf578063471aedc2146104e85761025c565b806318160ddd1161022457806318160ddd1461034b57806323b872dd14610376578063248a9ca31461039f57806324d7806c146103dc5780632f2ff15d146104195761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b314610306578063159963ec1461032f575b600080fd5b34801561026d57600080fd5b50610288600480360381019061028391906139e3565b610a67565b6040516102959190613a2b565b60405180910390f35b3480156102aa57600080fd5b506102b3610a79565b6040516102c09190613ad6565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613b2e565b610b0b565b6040516102fd9190613b9c565b60405180910390f35b34801561031257600080fd5b5061032d60048036038101906103289190613be3565b610b51565b005b61034960048036038101906103449190613e20565b610c68565b005b34801561035757600080fd5b50610360610ef3565b60405161036d9190613ee2565b60405180910390f35b34801561038257600080fd5b5061039d60048036038101906103989190613efd565b610f00565b005b3480156103ab57600080fd5b506103c660048036038101906103c19190613f86565b610f60565b6040516103d39190613fc2565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe9190613fdd565b610f80565b6040516104109190613a2b565b60405180910390f35b34801561042557600080fd5b50610440600480360381019061043b919061400a565b610fb3565b005b34801561044e57600080fd5b5061046960048036038101906104649190613be3565b610fd4565b6040516104769190613ee2565b60405180910390f35b34801561048b57600080fd5b506104a660048036038101906104a1919061400a565b611079565b005b3480156104b457600080fd5b506104bd6110fc565b005b3480156104cb57600080fd5b506104e660048036038101906104e19190613efd565b611198565b005b3480156104f457600080fd5b506104fd6111b8565b60405161050a9190613b9c565b60405180910390f35b34801561051f57600080fd5b5061053a60048036038101906105359190613b2e565b6111de565b6040516105479190613ee2565b60405180910390f35b34801561055c57600080fd5b50610577600480360381019061057291906140eb565b61124f565b005b34801561058557600080fd5b506105a0600480360381019061059b9190613b2e565b61128d565b6040516105ad9190613b9c565b60405180910390f35b3480156105c257600080fd5b506105cb611313565b6040516105d89190613ad6565b60405180910390f35b3480156105ed57600080fd5b5061060860048036038101906106039190613b2e565b6113a1565b6040516106159190613ee2565b60405180910390f35b34801561062a57600080fd5b5061064560048036038101906106409190613b2e565b6113b9565b6040516106529190613a2b565b60405180910390f35b34801561066757600080fd5b50610682600480360381019061067d9190613fdd565b6113e3565b60405161068f9190613ee2565b60405180910390f35b3480156106a457600080fd5b506106ad61149a565b005b3480156106bb57600080fd5b506106c46114ae565b6040516106d19190613fc2565b60405180910390f35b3480156106e657600080fd5b5061070160048036038101906106fc9190613b2e565b6114d2565b60405161070e9190613ee2565b60405180910390f35b34801561072357600080fd5b5061073e60048036038101906107399190614134565b6114ef565b005b34801561074c57600080fd5b5061076760048036038101906107629190614174565b611572565b604051610774919061427b565b60405180910390f35b34801561078957600080fd5b5061079261162d565b60405161079f9190613b9c565b60405180910390f35b3480156107b457600080fd5b506107cf60048036038101906107ca919061400a565b611657565b6040516107dc9190613a2b565b60405180910390f35b3480156107f157600080fd5b506107fa6116c2565b6040516108079190613ad6565b60405180910390f35b34801561081c57600080fd5b50610825611754565b6040516108329190613fc2565b60405180910390f35b34801561084757600080fd5b50610862600480360381019061085d91906142c9565b61175b565b005b34801561087057600080fd5b5061088b60048036038101906108869190614309565b611771565b005b34801561089957600080fd5b506108b460048036038101906108af91906143ca565b6117d3565b005b3480156108c257600080fd5b506108dd60048036038101906108d8919061440a565b6118a3565b005b3480156108eb57600080fd5b5061090660048036038101906109019190613b2e565b6118eb565b6040516109139190613ad6565b60405180910390f35b34801561092857600080fd5b50610943600480360381019061093e919061400a565b611953565b005b34801561095157600080fd5b5061095a611974565b6040516109679190613fc2565b60405180910390f35b34801561097c57600080fd5b5061099760048036038101906109929190613fdd565b611998565b6040516109a4919061427b565b60405180910390f35b3480156109b957600080fd5b506109d460048036038101906109cf9190614437565b611a46565b6040516109e19190613a2b565b60405180910390f35b3480156109f657600080fd5b506109ff611ada565b604051610a0c9190613a2b565b60405180910390f35b348015610a2157600080fd5b50610a3c6004803603810190610a379190613fdd565b611aed565b005b348015610a4a57600080fd5b50610a656004803603810190610a6091906140eb565b611b70565b005b6000610a7282611e17565b9050919050565b606060008054610a88906144a6565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab4906144a6565b8015610b015780601f10610ad657610100808354040283529160200191610b01565b820191906000526020600020905b815481529060010190602001808311610ae457829003601f168201915b5050505050905090565b6000610b1682611e91565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b5c8261128d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc390614549565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610beb611edc565b73ffffffffffffffffffffffffffffffffffffffff161480610c1a5750610c1981610c14611edc565b611a46565b5b610c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c50906145db565b60405180910390fd5b610c638383611ee4565b505050565b600d60149054906101000a900460ff16610cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cae9061466d565b60405180910390fd5b82341015610cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf1906146d9565b60405180910390fd5b610d278585858530604051602001610d129190614741565b60405160208183030381529060405286611f9d565b610d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5d906147a8565b60405180910390fd5b600082111580610d765750428210155b610db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dac90614814565b60405180910390fd5b6101f48451610dc2610ef3565b610dcc9190614863565b1115610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e04906148e3565b60405180910390fd5b60005b8451811015610ea75760106000868381518110610e3057610e2f614903565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff1615610e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8b9061497e565b60405180910390fd5b8080610e9f9061499e565b915050610e10565b5060005b8451811015610eeb57610ed886868381518110610ecb57610eca614903565b5b6020026020010151611ff7565b8080610ee39061499e565b915050610eab565b505050505050565b6000600880549050905090565b610f11610f0b611edc565b82612062565b610f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4790614a58565b60405180910390fd5b610f5b8383836120f7565b505050565b6000600b6000838152602001908152602001600020600101549050919050565b6000610fac7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177583611657565b9050919050565b610fbc82610f60565b610fc5816123f0565b610fcf8383612404565b505050565b6000610fdf836113e3565b8210611020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101790614aea565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b611081611edc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e590614b7c565b60405180910390fd5b6110f882826124e5565b5050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775611126816123f0565b6000479050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611193573d6000803e3d6000fd5b505050565b6111b383838360405180602001604052806000815250611771565b505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006111e8610ef3565b8210611229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122090614c0e565b60405180910390fd5b6008828154811061123d5761123c614903565b5b90600052602060002001549050919050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775611279816123f0565b81600e90816112889190614dda565b505050565b600080611299836125c7565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361130a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130190614ef8565b60405180910390fd5b80915050919050565b600c8054611320906144a6565b80601f016020809104026020016040519081016040528092919081815260200182805461134c906144a6565b80156113995780601f1061136e57610100808354040283529160200191611399565b820191906000526020600020905b81548152906001019060200180831161137c57829003601f168201915b505050505081565b600f6020528060005260406000206000915090505481565b60006010600083815260200190815260200160002060009054906101000a900460ff169050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144a90614f8a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114a2612604565b6114ac6000612682565b565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b6000600f6000838152602001908152602001600020549050919050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775611519816123f0565b60005b8281101561156c5761155b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682866115569190614863565b611ff7565b806115659061499e565b905061151c565b50505050565b60606000825167ffffffffffffffff81111561159157611590613c28565b5b6040519080825280602002602001820160405280156115bf5781602001602082028036833780820191505090505b50905060005b8351811015611623576115f18482815181106115e4576115e3614903565b5b60200260200101516114d2565b82828151811061160457611603614903565b5b602002602001018181525050808061161b9061499e565b9150506115c5565b5080915050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600180546116d1906144a6565b80601f01602080910402602001604051908101604052809291908181526020018280546116fd906144a6565b801561174a5780601f1061171f5761010080835404028352916020019161174a565b820191906000526020600020905b81548152906001019060200180831161172d57829003601f168201915b5050505050905090565b6000801b81565b61176d611766611edc565b8383612748565b5050565b61178261177c611edc565b83612062565b6117c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b890614a58565b60405180910390fd5b6117cd848484846128b4565b50505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756117fd816123f0565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b815260040161185a929190614faa565b6020604051808303816000875af1158015611879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189d9190614fe8565b50505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756118cd816123f0565b81600d60146101000a81548160ff0219169083151502179055505050565b60606118f682611e91565b6000611900612910565b90506000815111611920576040518060200160405280600081525061194b565b8061192a846129a2565b60405160200161193b929190615051565b6040516020818303038152906040525b915050919050565b61195c82610f60565b611965816123f0565b61196f83836124e5565b505050565b7f8b8c0776df2c2176edf6f82391c35ea4891146d7a976ee36fd07f1a6fb4ead4c81565b606060006119a5836113e3565b905060008167ffffffffffffffff8111156119c3576119c2613c28565b5b6040519080825280602002602001820160405280156119f15781602001602082028036833780820191505090505b50905060005b82811015611a3b57611a098582610fd4565b828281518110611a1c57611a1b614903565b5b6020026020010181815250508080611a339061499e565b9150506119f7565b508092505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60149054906101000a900460ff1681565b611af5612604565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5b906150e7565b60405180910390fd5b611b6d81612682565b50565b7f8b8c0776df2c2176edf6f82391c35ea4891146d7a976ee36fd07f1a6fb4ead4c611b9a816123f0565b81600c9081611ba99190614dda565b505050565b6060611bd48273ffffffffffffffffffffffffffffffffffffffff16601460ff16611bdb565b9050919050565b606060006002836002611bee9190615107565b611bf89190614863565b67ffffffffffffffff811115611c1157611c10613c28565b5b6040519080825280601f01601f191660200182016040528015611c435781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611c7b57611c7a614903565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611cdf57611cde614903565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611d1f9190615107565b611d299190614863565b90505b6001811115611dc9577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611d6b57611d6a614903565b5b1a60f81b828281518110611d8257611d81614903565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611dc290615149565b9050611d2c565b5060008414611e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e04906151be565b60405180910390fd5b8091505092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e8a5750611e8982612a70565b5b9050919050565b611e9a81612aea565b611ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed090614ef8565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f578361128d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611fad8888888888612b2b565b9050611fea7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775611fe5611fdf84612b67565b86612b9a565b611657565b9150509695505050505050565b60006001612003610ef3565b61200d9190614863565b90506120198382612c09565b81600f60008381526020019081526020016000208190555060016010600084815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b60008061206e8361128d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806120b057506120af8185611a46565b5b806120ee57508373ffffffffffffffffffffffffffffffffffffffff166120d684610b0b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166121178261128d565b73ffffffffffffffffffffffffffffffffffffffff161461216d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216490615250565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d3906152e2565b60405180910390fd5b6121e98383836001612c27565b8273ffffffffffffffffffffffffffffffffffffffff166122098261128d565b73ffffffffffffffffffffffffffffffffffffffff161461225f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225690615250565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123eb8383836001612c39565b505050565b612401816123fc611edc565b612c3f565b50565b61240e8282611657565b6124e1576001600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612486611edc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6124ef8282611657565b156125c3576000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612568611edc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61260c611edc565b73ffffffffffffffffffffffffffffffffffffffff1661262a61162d565b73ffffffffffffffffffffffffffffffffffffffff1614612680576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126779061534e565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036127b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ad906153ba565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128a79190613a2b565b60405180910390a3505050565b6128bf8484846120f7565b6128cb84848484612cc4565b61290a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129019061544c565b60405180910390fd5b50505050565b6060600e805461291f906144a6565b80601f016020809104026020016040519081016040528092919081815260200182805461294b906144a6565b80156129985780601f1061296d57610100808354040283529160200191612998565b820191906000526020600020905b81548152906001019060200180831161297b57829003601f168201915b5050505050905090565b6060600060016129b184612e4b565b01905060008167ffffffffffffffff8111156129d0576129cf613c28565b5b6040519080825280601f01601f191660200182016040528015612a025781602001600182028036833780820191505090505b509050600082602001820190505b600115612a65578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612a5957612a5861546c565b5b04945060008503612a10575b819350505050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612ae35750612ae282612f9e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16612b0c836125c7565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60008486858585604051602001612b46959493929190615593565b60405160208183030381529060405280519060200120905095945050505050565b6000600c82604051602001612b7d929190615726565b604051602081830303815290604052805190602001209050919050565b600080600080612ba985613080565b92509250925060018682858560405160008152602001604052604051612bd29493929190615780565b6020604051602081039080840390855afa158015612bf4573d6000803e3d6000fd5b50505060206040510351935050505092915050565b612c238282604051806020016040528060008152506130e8565b5050565b612c3384848484613143565b50505050565b50505050565b612c498282611657565b612cc057612c5681611bae565b612c648360001c6020611bdb565b604051602001612c7592919061585d565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb79190613ad6565b60405180910390fd5b5050565b6000612ce58473ffffffffffffffffffffffffffffffffffffffff166132a1565b15612e3e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d0e611edc565b8786866040518563ffffffff1660e01b8152600401612d3094939291906158e1565b6020604051808303816000875af1925050508015612d6c57506040513d601f19601f82011682018060405250810190612d699190615942565b60015b612dee573d8060008114612d9c576040519150601f19603f3d011682016040523d82523d6000602084013e612da1565b606091505b506000815103612de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ddd9061544c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e43565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612ea9577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612e9f57612e9e61546c565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612ee6576d04ee2d6d415b85acef81000000008381612edc57612edb61546c565b5b0492506020810190505b662386f26fc100008310612f1557662386f26fc100008381612f0b57612f0a61546c565b5b0492506010810190505b6305f5e1008310612f3e576305f5e1008381612f3457612f3361546c565b5b0492506008810190505b6127108310612f63576127108381612f5957612f5861546c565b5b0492506004810190505b60648310612f865760648381612f7c57612f7b61546c565b5b0492506002810190505b600a8310612f95576001810190505b80915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061306957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806130795750613078826132c4565b5b9050919050565b600080600060418451146130c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c0906159bb565b60405180910390fd5b6020840151925060408401519150606084015160001a90509193909250565b6130f2838361332e565b6130ff6000848484612cc4565b61313e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131359061544c565b60405180910390fd5b505050565b61314f8484848461354b565b6001811115613193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318a90615a4d565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036131da576131d581613671565b613219565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146132185761321785826136ba565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361325b5761325681613827565b61329a565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146132995761329884826138f8565b5b5b5050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361339d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339490615ab9565b60405180910390fd5b6133a681612aea565b156133e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133dd90615b25565b60405180910390fd5b6133f4600083836001612c27565b6133fd81612aea565b1561343d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343490615b25565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613547600083836001612c39565b5050565b600181111561366b57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146135df5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135d79190615b45565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461366a5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136629190614863565b925050819055505b5b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016136c7846113e3565b6136d19190615b45565b90506000600760008481526020019081526020016000205490508181146137b6576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061383b9190615b45565b905060006009600084815260200190815260200160002054905060006008838154811061386b5761386a614903565b5b90600052602060002001549050806008838154811061388d5761388c614903565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806138dc576138db615b79565b5b6001900381819060005260206000200160009055905550505050565b6000613903836113e3565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6139c08161398b565b81146139cb57600080fd5b50565b6000813590506139dd816139b7565b92915050565b6000602082840312156139f9576139f8613981565b5b6000613a07848285016139ce565b91505092915050565b60008115159050919050565b613a2581613a10565b82525050565b6000602082019050613a406000830184613a1c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613a80578082015181840152602081019050613a65565b60008484015250505050565b6000601f19601f8301169050919050565b6000613aa882613a46565b613ab28185613a51565b9350613ac2818560208601613a62565b613acb81613a8c565b840191505092915050565b60006020820190508181036000830152613af08184613a9d565b905092915050565b6000819050919050565b613b0b81613af8565b8114613b1657600080fd5b50565b600081359050613b2881613b02565b92915050565b600060208284031215613b4457613b43613981565b5b6000613b5284828501613b19565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613b8682613b5b565b9050919050565b613b9681613b7b565b82525050565b6000602082019050613bb16000830184613b8d565b92915050565b613bc081613b7b565b8114613bcb57600080fd5b50565b600081359050613bdd81613bb7565b92915050565b60008060408385031215613bfa57613bf9613981565b5b6000613c0885828601613bce565b9250506020613c1985828601613b19565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613c6082613a8c565b810181811067ffffffffffffffff82111715613c7f57613c7e613c28565b5b80604052505050565b6000613c92613977565b9050613c9e8282613c57565b919050565b600067ffffffffffffffff821115613cbe57613cbd613c28565b5b602082029050602081019050919050565b600080fd5b6000613ce7613ce284613ca3565b613c88565b90508083825260208201905060208402830185811115613d0a57613d09613ccf565b5b835b81811015613d335780613d1f8882613b19565b845260208401935050602081019050613d0c565b5050509392505050565b600082601f830112613d5257613d51613c23565b5b8135613d62848260208601613cd4565b91505092915050565b600080fd5b600067ffffffffffffffff821115613d8b57613d8a613c28565b5b613d9482613a8c565b9050602081019050919050565b82818337600083830152505050565b6000613dc3613dbe84613d70565b613c88565b905082815260208101848484011115613ddf57613dde613d6b565b5b613dea848285613da1565b509392505050565b600082601f830112613e0757613e06613c23565b5b8135613e17848260208601613db0565b91505092915050565b600080600080600060a08688031215613e3c57613e3b613981565b5b6000613e4a88828901613bce565b955050602086013567ffffffffffffffff811115613e6b57613e6a613986565b5b613e7788828901613d3d565b9450506040613e8888828901613b19565b9350506060613e9988828901613b19565b925050608086013567ffffffffffffffff811115613eba57613eb9613986565b5b613ec688828901613df2565b9150509295509295909350565b613edc81613af8565b82525050565b6000602082019050613ef76000830184613ed3565b92915050565b600080600060608486031215613f1657613f15613981565b5b6000613f2486828701613bce565b9350506020613f3586828701613bce565b9250506040613f4686828701613b19565b9150509250925092565b6000819050919050565b613f6381613f50565b8114613f6e57600080fd5b50565b600081359050613f8081613f5a565b92915050565b600060208284031215613f9c57613f9b613981565b5b6000613faa84828501613f71565b91505092915050565b613fbc81613f50565b82525050565b6000602082019050613fd76000830184613fb3565b92915050565b600060208284031215613ff357613ff2613981565b5b600061400184828501613bce565b91505092915050565b6000806040838503121561402157614020613981565b5b600061402f85828601613f71565b925050602061404085828601613bce565b9150509250929050565b600067ffffffffffffffff82111561406557614064613c28565b5b61406e82613a8c565b9050602081019050919050565b600061408e6140898461404a565b613c88565b9050828152602081018484840111156140aa576140a9613d6b565b5b6140b5848285613da1565b509392505050565b600082601f8301126140d2576140d1613c23565b5b81356140e284826020860161407b565b91505092915050565b60006020828403121561410157614100613981565b5b600082013567ffffffffffffffff81111561411f5761411e613986565b5b61412b848285016140bd565b91505092915050565b6000806040838503121561414b5761414a613981565b5b600061415985828601613b19565b925050602061416a85828601613b19565b9150509250929050565b60006020828403121561418a57614189613981565b5b600082013567ffffffffffffffff8111156141a8576141a7613986565b5b6141b484828501613d3d565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6141f281613af8565b82525050565b600061420483836141e9565b60208301905092915050565b6000602082019050919050565b6000614228826141bd565b61423281856141c8565b935061423d836141d9565b8060005b8381101561426e57815161425588826141f8565b975061426083614210565b925050600181019050614241565b5085935050505092915050565b60006020820190508181036000830152614295818461421d565b905092915050565b6142a681613a10565b81146142b157600080fd5b50565b6000813590506142c38161429d565b92915050565b600080604083850312156142e0576142df613981565b5b60006142ee85828601613bce565b92505060206142ff858286016142b4565b9150509250929050565b6000806000806080858703121561432357614322613981565b5b600061433187828801613bce565b945050602061434287828801613bce565b935050604061435387828801613b19565b925050606085013567ffffffffffffffff81111561437457614373613986565b5b61438087828801613df2565b91505092959194509250565b600061439782613b7b565b9050919050565b6143a78161438c565b81146143b257600080fd5b50565b6000813590506143c48161439e565b92915050565b600080604083850312156143e1576143e0613981565b5b60006143ef85828601613b19565b9250506020614400858286016143b5565b9150509250929050565b6000602082840312156144205761441f613981565b5b600061442e848285016142b4565b91505092915050565b6000806040838503121561444e5761444d613981565b5b600061445c85828601613bce565b925050602061446d85828601613bce565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806144be57607f821691505b6020821081036144d1576144d0614477565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614533602183613a51565b915061453e826144d7565b604082019050919050565b6000602082019050818103600083015261456281614526565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006145c5603d83613a51565b91506145d082614569565b604082019050919050565b600060208201905081810360008301526145f4816145b8565b9050919050565b7f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b6000614657602283613a51565b9150614662826145fb565b604082019050919050565b600060208201905081810360008301526146868161464a565b9050919050565b7f496e73756666696369656e742070726963650000000000000000000000000000600082015250565b60006146c3601283613a51565b91506146ce8261468d565b602082019050919050565b600060208201905081810360008301526146f2816146b6565b9050919050565b60008160601b9050919050565b6000614711826146f9565b9050919050565b600061472382614706565b9050919050565b61473b61473682613b7b565b614718565b82525050565b600061474d828461472a565b60148201915081905092915050565b7f696e76616c6964207369676e6174757265200000000000000000000000000000600082015250565b6000614792601283613a51565b915061479d8261475c565b602082019050919050565b600060208201905081810360008301526147c181614785565b9050919050565b7f5369676e61747572652068617320657870697265640000000000000000000000600082015250565b60006147fe601583613a51565b9150614809826147c8565b602082019050919050565b6000602082019050818103600083015261482d816147f1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061486e82613af8565b915061487983613af8565b925082820190508082111561489157614890614834565b5b92915050565b7f5375706572696f72206c696d6974000000000000000000000000000000000000600082015250565b60006148cd600e83613a51565b91506148d882614897565b602082019050919050565b600060208201905081810360008301526148fc816148c0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4175746869642075736564000000000000000000000000000000000000000000600082015250565b6000614968600b83613a51565b915061497382614932565b602082019050919050565b600060208201905081810360008301526149978161495b565b9050919050565b60006149a982613af8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149db576149da614834565b5b600182019050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000614a42602d83613a51565b9150614a4d826149e6565b604082019050919050565b60006020820190508181036000830152614a7181614a35565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614ad4602b83613a51565b9150614adf82614a78565b604082019050919050565b60006020820190508181036000830152614b0381614ac7565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000614b66602f83613a51565b9150614b7182614b0a565b604082019050919050565b60006020820190508181036000830152614b9581614b59565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614bf8602c83613a51565b9150614c0382614b9c565b604082019050919050565b60006020820190508181036000830152614c2781614beb565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614c907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614c53565b614c9a8683614c53565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614cd7614cd2614ccd84613af8565b614cb2565b613af8565b9050919050565b6000819050919050565b614cf183614cbc565b614d05614cfd82614cde565b848454614c60565b825550505050565b600090565b614d1a614d0d565b614d25818484614ce8565b505050565b5b81811015614d4957614d3e600082614d12565b600181019050614d2b565b5050565b601f821115614d8e57614d5f81614c2e565b614d6884614c43565b81016020851015614d77578190505b614d8b614d8385614c43565b830182614d2a565b50505b505050565b600082821c905092915050565b6000614db160001984600802614d93565b1980831691505092915050565b6000614dca8383614da0565b9150826002028217905092915050565b614de382613a46565b67ffffffffffffffff811115614dfc57614dfb613c28565b5b614e0682546144a6565b614e11828285614d4d565b600060209050601f831160018114614e445760008415614e32578287015190505b614e3c8582614dbe565b865550614ea4565b601f198416614e5286614c2e565b60005b82811015614e7a57848901518255600182019150602085019450602081019050614e55565b86831015614e975784890151614e93601f891682614da0565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614ee2601883613a51565b9150614eed82614eac565b602082019050919050565b60006020820190508181036000830152614f1181614ed5565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614f74602983613a51565b9150614f7f82614f18565b604082019050919050565b60006020820190508181036000830152614fa381614f67565b9050919050565b6000604082019050614fbf6000830185613b8d565b614fcc6020830184613ed3565b9392505050565b600081519050614fe28161429d565b92915050565b600060208284031215614ffe57614ffd613981565b5b600061500c84828501614fd3565b91505092915050565b600081905092915050565b600061502b82613a46565b6150358185615015565b9350615045818560208601613a62565b80840191505092915050565b600061505d8285615020565b91506150698284615020565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006150d1602683613a51565b91506150dc82615075565b604082019050919050565b60006020820190508181036000830152615100816150c4565b9050919050565b600061511282613af8565b915061511d83613af8565b925082820261512b81613af8565b9150828204841483151761514257615141614834565b5b5092915050565b600061515482613af8565b91506000820361516757615166614834565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006151a8602083613a51565b91506151b382615172565b602082019050919050565b600060208201905081810360008301526151d78161519b565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061523a602583613a51565b9150615245826151de565b604082019050919050565b600060208201905081810360008301526152698161522d565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006152cc602483613a51565b91506152d782615270565b604082019050919050565b600060208201905081810360008301526152fb816152bf565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615338602083613a51565b915061534382615302565b602082019050919050565b600060208201905081810360008301526153678161532b565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006153a4601983613a51565b91506153af8261536e565b602082019050919050565b600060208201905081810360008301526153d381615397565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615436603283613a51565b9150615441826153da565b604082019050919050565b6000602082019050818103600083015261546581615429565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081905092915050565b6154af81613af8565b82525050565b60006154c183836154a6565b60208301905092915050565b60006154d8826141bd565b6154e2818561549b565b93506154ed836141d9565b8060005b8381101561551e57815161550588826154b5565b975061551083614210565b9250506001810190506154f1565b5085935050505092915050565b6000819050919050565b61554661554182613af8565b61552b565b82525050565b600081519050919050565b600081905092915050565b600061556d8261554c565b6155778185615557565b9350615587818560208601613a62565b80840191505092915050565b600061559f82886154cd565b91506155ab828761472a565b6014820191506155bb8286615535565b6020820191506155cb8285615535565b6020820191506155db8284615562565b91508190509695505050505050565b7f1900000000000000000000000000000000000000000000000000000000000000600082015250565b6000615620600183615015565b915061562b826155ea565b600182019050919050565b60008154615643816144a6565b61564d8186615015565b94506001821660008114615668576001811461567d576156b0565b60ff19831686528115158202860193506156b0565b61568685614c2e565b60005b838110156156a857815481890152600182019150602081019050615689565b838801955050505b50505092915050565b7f205369676e6564204d6573736167653a0a333200000000000000000000000000600082015250565b60006156ef601383615015565b91506156fa826156b9565b601382019050919050565b6000819050919050565b61572061571b82613f50565b615705565b82525050565b600061573182615613565b915061573d8285615636565b9150615748826156e2565b9150615754828461570f565b6020820191508190509392505050565b600060ff82169050919050565b61577a81615764565b82525050565b60006080820190506157956000830187613fb3565b6157a26020830186615771565b6157af6040830185613fb3565b6157bc6060830184613fb3565b95945050505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b60006157fb601783615015565b9150615806826157c5565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000615847601183615015565b915061585282615811565b601182019050919050565b6000615868826157ee565b91506158748285615020565b915061587f8261583a565b915061588b8284615020565b91508190509392505050565b600082825260208201905092915050565b60006158b38261554c565b6158bd8185615897565b93506158cd818560208601613a62565b6158d681613a8c565b840191505092915050565b60006080820190506158f66000830187613b8d565b6159036020830186613b8d565b6159106040830185613ed3565b818103606083015261592281846158a8565b905095945050505050565b60008151905061593c816139b7565b92915050565b60006020828403121561595857615957613981565b5b60006159668482850161592d565b91505092915050565b7f696e76616c6964207369676e6174757265206c656e6774680000000000000000600082015250565b60006159a5601883613a51565b91506159b08261596f565b602082019050919050565b600060208201905081810360008301526159d481615998565b9050919050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000615a37603583613a51565b9150615a42826159db565b604082019050919050565b60006020820190508181036000830152615a6681615a2a565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615aa3602083613a51565b9150615aae82615a6d565b602082019050919050565b60006020820190508181036000830152615ad281615a96565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615b0f601c83613a51565b9150615b1a82615ad9565b602082019050919050565b60006020820190508181036000830152615b3e81615b02565b9050919050565b6000615b5082613af8565b9150615b5b83613af8565b9250828203905081811115615b7357615b72614834565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212202326a60f11e4a6a5675fc063f42c1ee163ae5580d426621c836de03ad78500f664736f6c6343000811003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000008f5cc78f3e4216a906aac793abe9ddfed5de8af300000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000000e4445504554532047656e65736973000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4445504554532047656e65736973000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005868747470733a2f2f7065747765622d7065747765627365727665722d61706676746370766f622e61702d736f757468656173742d312e66636170702e72756e2f6e66745f6d6574612f4445504554535f47656e657369732f000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000001bf3ff9b7ceec164de93e303cd50d404f26e7db9000000000000000000000000a0c943e67dccac5640bd129cd2a03b9bb00e26a7

Deployed Bytecode

0x60806040526004361061025c5760003560e01c806370a0823111610144578063b88d4fde116100b6578063dc2248631161007a578063dc22486314610945578063e94d062b14610970578063e985e9c5146109ad578063eb8d2444146109ea578063f2fde38b14610a15578063ffe630b514610a3e5761025c565b8063b88d4fde14610864578063be4b17721461088d578063c4e37095146108b6578063c87b56dd146108df578063d547741f1461091c5761025c565b80638ca38e69116101085780638ca38e69146107405780638da5cb5b1461077d57806391d14854146107a857806395d89b41146107e5578063a217fddf14610810578063a22cb4651461083b5761025c565b806370a082311461065b578063715018a61461069857806375b238fc146106af57806377091292146106da5780638ab0499f146107175761025c565b80632f745c59116101dd5780634f6ccce7116101a15780634f6ccce71461051357806355f804b3146105505780636352211e146105795780636373a6b1146105b657806363ae541c146105e157806366f4456d1461061e5761025c565b80632f745c591461044257806336568abe1461047f5780633ccfd60b146104a857806342842e0e146104bf578063471aedc2146104e85761025c565b806318160ddd1161022457806318160ddd1461034b57806323b872dd14610376578063248a9ca31461039f57806324d7806c146103dc5780632f2ff15d146104195761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b314610306578063159963ec1461032f575b600080fd5b34801561026d57600080fd5b50610288600480360381019061028391906139e3565b610a67565b6040516102959190613a2b565b60405180910390f35b3480156102aa57600080fd5b506102b3610a79565b6040516102c09190613ad6565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613b2e565b610b0b565b6040516102fd9190613b9c565b60405180910390f35b34801561031257600080fd5b5061032d60048036038101906103289190613be3565b610b51565b005b61034960048036038101906103449190613e20565b610c68565b005b34801561035757600080fd5b50610360610ef3565b60405161036d9190613ee2565b60405180910390f35b34801561038257600080fd5b5061039d60048036038101906103989190613efd565b610f00565b005b3480156103ab57600080fd5b506103c660048036038101906103c19190613f86565b610f60565b6040516103d39190613fc2565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe9190613fdd565b610f80565b6040516104109190613a2b565b60405180910390f35b34801561042557600080fd5b50610440600480360381019061043b919061400a565b610fb3565b005b34801561044e57600080fd5b5061046960048036038101906104649190613be3565b610fd4565b6040516104769190613ee2565b60405180910390f35b34801561048b57600080fd5b506104a660048036038101906104a1919061400a565b611079565b005b3480156104b457600080fd5b506104bd6110fc565b005b3480156104cb57600080fd5b506104e660048036038101906104e19190613efd565b611198565b005b3480156104f457600080fd5b506104fd6111b8565b60405161050a9190613b9c565b60405180910390f35b34801561051f57600080fd5b5061053a60048036038101906105359190613b2e565b6111de565b6040516105479190613ee2565b60405180910390f35b34801561055c57600080fd5b50610577600480360381019061057291906140eb565b61124f565b005b34801561058557600080fd5b506105a0600480360381019061059b9190613b2e565b61128d565b6040516105ad9190613b9c565b60405180910390f35b3480156105c257600080fd5b506105cb611313565b6040516105d89190613ad6565b60405180910390f35b3480156105ed57600080fd5b5061060860048036038101906106039190613b2e565b6113a1565b6040516106159190613ee2565b60405180910390f35b34801561062a57600080fd5b5061064560048036038101906106409190613b2e565b6113b9565b6040516106529190613a2b565b60405180910390f35b34801561066757600080fd5b50610682600480360381019061067d9190613fdd565b6113e3565b60405161068f9190613ee2565b60405180910390f35b3480156106a457600080fd5b506106ad61149a565b005b3480156106bb57600080fd5b506106c46114ae565b6040516106d19190613fc2565b60405180910390f35b3480156106e657600080fd5b5061070160048036038101906106fc9190613b2e565b6114d2565b60405161070e9190613ee2565b60405180910390f35b34801561072357600080fd5b5061073e60048036038101906107399190614134565b6114ef565b005b34801561074c57600080fd5b5061076760048036038101906107629190614174565b611572565b604051610774919061427b565b60405180910390f35b34801561078957600080fd5b5061079261162d565b60405161079f9190613b9c565b60405180910390f35b3480156107b457600080fd5b506107cf60048036038101906107ca919061400a565b611657565b6040516107dc9190613a2b565b60405180910390f35b3480156107f157600080fd5b506107fa6116c2565b6040516108079190613ad6565b60405180910390f35b34801561081c57600080fd5b50610825611754565b6040516108329190613fc2565b60405180910390f35b34801561084757600080fd5b50610862600480360381019061085d91906142c9565b61175b565b005b34801561087057600080fd5b5061088b60048036038101906108869190614309565b611771565b005b34801561089957600080fd5b506108b460048036038101906108af91906143ca565b6117d3565b005b3480156108c257600080fd5b506108dd60048036038101906108d8919061440a565b6118a3565b005b3480156108eb57600080fd5b5061090660048036038101906109019190613b2e565b6118eb565b6040516109139190613ad6565b60405180910390f35b34801561092857600080fd5b50610943600480360381019061093e919061400a565b611953565b005b34801561095157600080fd5b5061095a611974565b6040516109679190613fc2565b60405180910390f35b34801561097c57600080fd5b5061099760048036038101906109929190613fdd565b611998565b6040516109a4919061427b565b60405180910390f35b3480156109b957600080fd5b506109d460048036038101906109cf9190614437565b611a46565b6040516109e19190613a2b565b60405180910390f35b3480156109f657600080fd5b506109ff611ada565b604051610a0c9190613a2b565b60405180910390f35b348015610a2157600080fd5b50610a3c6004803603810190610a379190613fdd565b611aed565b005b348015610a4a57600080fd5b50610a656004803603810190610a6091906140eb565b611b70565b005b6000610a7282611e17565b9050919050565b606060008054610a88906144a6565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab4906144a6565b8015610b015780601f10610ad657610100808354040283529160200191610b01565b820191906000526020600020905b815481529060010190602001808311610ae457829003601f168201915b5050505050905090565b6000610b1682611e91565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b5c8261128d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc390614549565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610beb611edc565b73ffffffffffffffffffffffffffffffffffffffff161480610c1a5750610c1981610c14611edc565b611a46565b5b610c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c50906145db565b60405180910390fd5b610c638383611ee4565b505050565b600d60149054906101000a900460ff16610cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cae9061466d565b60405180910390fd5b82341015610cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf1906146d9565b60405180910390fd5b610d278585858530604051602001610d129190614741565b60405160208183030381529060405286611f9d565b610d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5d906147a8565b60405180910390fd5b600082111580610d765750428210155b610db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dac90614814565b60405180910390fd5b6101f48451610dc2610ef3565b610dcc9190614863565b1115610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e04906148e3565b60405180910390fd5b60005b8451811015610ea75760106000868381518110610e3057610e2f614903565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff1615610e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8b9061497e565b60405180910390fd5b8080610e9f9061499e565b915050610e10565b5060005b8451811015610eeb57610ed886868381518110610ecb57610eca614903565b5b6020026020010151611ff7565b8080610ee39061499e565b915050610eab565b505050505050565b6000600880549050905090565b610f11610f0b611edc565b82612062565b610f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4790614a58565b60405180910390fd5b610f5b8383836120f7565b505050565b6000600b6000838152602001908152602001600020600101549050919050565b6000610fac7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177583611657565b9050919050565b610fbc82610f60565b610fc5816123f0565b610fcf8383612404565b505050565b6000610fdf836113e3565b8210611020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101790614aea565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b611081611edc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e590614b7c565b60405180910390fd5b6110f882826124e5565b5050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775611126816123f0565b6000479050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611193573d6000803e3d6000fd5b505050565b6111b383838360405180602001604052806000815250611771565b505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006111e8610ef3565b8210611229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122090614c0e565b60405180910390fd5b6008828154811061123d5761123c614903565b5b90600052602060002001549050919050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775611279816123f0565b81600e90816112889190614dda565b505050565b600080611299836125c7565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361130a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130190614ef8565b60405180910390fd5b80915050919050565b600c8054611320906144a6565b80601f016020809104026020016040519081016040528092919081815260200182805461134c906144a6565b80156113995780601f1061136e57610100808354040283529160200191611399565b820191906000526020600020905b81548152906001019060200180831161137c57829003601f168201915b505050505081565b600f6020528060005260406000206000915090505481565b60006010600083815260200190815260200160002060009054906101000a900460ff169050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144a90614f8a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114a2612604565b6114ac6000612682565b565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b6000600f6000838152602001908152602001600020549050919050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775611519816123f0565b60005b8281101561156c5761155b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682866115569190614863565b611ff7565b806115659061499e565b905061151c565b50505050565b60606000825167ffffffffffffffff81111561159157611590613c28565b5b6040519080825280602002602001820160405280156115bf5781602001602082028036833780820191505090505b50905060005b8351811015611623576115f18482815181106115e4576115e3614903565b5b60200260200101516114d2565b82828151811061160457611603614903565b5b602002602001018181525050808061161b9061499e565b9150506115c5565b5080915050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600180546116d1906144a6565b80601f01602080910402602001604051908101604052809291908181526020018280546116fd906144a6565b801561174a5780601f1061171f5761010080835404028352916020019161174a565b820191906000526020600020905b81548152906001019060200180831161172d57829003601f168201915b5050505050905090565b6000801b81565b61176d611766611edc565b8383612748565b5050565b61178261177c611edc565b83612062565b6117c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b890614a58565b60405180910390fd5b6117cd848484846128b4565b50505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756117fd816123f0565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b815260040161185a929190614faa565b6020604051808303816000875af1158015611879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189d9190614fe8565b50505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756118cd816123f0565b81600d60146101000a81548160ff0219169083151502179055505050565b60606118f682611e91565b6000611900612910565b90506000815111611920576040518060200160405280600081525061194b565b8061192a846129a2565b60405160200161193b929190615051565b6040516020818303038152906040525b915050919050565b61195c82610f60565b611965816123f0565b61196f83836124e5565b505050565b7f8b8c0776df2c2176edf6f82391c35ea4891146d7a976ee36fd07f1a6fb4ead4c81565b606060006119a5836113e3565b905060008167ffffffffffffffff8111156119c3576119c2613c28565b5b6040519080825280602002602001820160405280156119f15781602001602082028036833780820191505090505b50905060005b82811015611a3b57611a098582610fd4565b828281518110611a1c57611a1b614903565b5b6020026020010181815250508080611a339061499e565b9150506119f7565b508092505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60149054906101000a900460ff1681565b611af5612604565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5b906150e7565b60405180910390fd5b611b6d81612682565b50565b7f8b8c0776df2c2176edf6f82391c35ea4891146d7a976ee36fd07f1a6fb4ead4c611b9a816123f0565b81600c9081611ba99190614dda565b505050565b6060611bd48273ffffffffffffffffffffffffffffffffffffffff16601460ff16611bdb565b9050919050565b606060006002836002611bee9190615107565b611bf89190614863565b67ffffffffffffffff811115611c1157611c10613c28565b5b6040519080825280601f01601f191660200182016040528015611c435781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611c7b57611c7a614903565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611cdf57611cde614903565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611d1f9190615107565b611d299190614863565b90505b6001811115611dc9577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611d6b57611d6a614903565b5b1a60f81b828281518110611d8257611d81614903565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611dc290615149565b9050611d2c565b5060008414611e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e04906151be565b60405180910390fd5b8091505092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e8a5750611e8982612a70565b5b9050919050565b611e9a81612aea565b611ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed090614ef8565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f578361128d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611fad8888888888612b2b565b9050611fea7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775611fe5611fdf84612b67565b86612b9a565b611657565b9150509695505050505050565b60006001612003610ef3565b61200d9190614863565b90506120198382612c09565b81600f60008381526020019081526020016000208190555060016010600084815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b60008061206e8361128d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806120b057506120af8185611a46565b5b806120ee57508373ffffffffffffffffffffffffffffffffffffffff166120d684610b0b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166121178261128d565b73ffffffffffffffffffffffffffffffffffffffff161461216d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216490615250565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d3906152e2565b60405180910390fd5b6121e98383836001612c27565b8273ffffffffffffffffffffffffffffffffffffffff166122098261128d565b73ffffffffffffffffffffffffffffffffffffffff161461225f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225690615250565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123eb8383836001612c39565b505050565b612401816123fc611edc565b612c3f565b50565b61240e8282611657565b6124e1576001600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612486611edc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6124ef8282611657565b156125c3576000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612568611edc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61260c611edc565b73ffffffffffffffffffffffffffffffffffffffff1661262a61162d565b73ffffffffffffffffffffffffffffffffffffffff1614612680576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126779061534e565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036127b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ad906153ba565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128a79190613a2b565b60405180910390a3505050565b6128bf8484846120f7565b6128cb84848484612cc4565b61290a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129019061544c565b60405180910390fd5b50505050565b6060600e805461291f906144a6565b80601f016020809104026020016040519081016040528092919081815260200182805461294b906144a6565b80156129985780601f1061296d57610100808354040283529160200191612998565b820191906000526020600020905b81548152906001019060200180831161297b57829003601f168201915b5050505050905090565b6060600060016129b184612e4b565b01905060008167ffffffffffffffff8111156129d0576129cf613c28565b5b6040519080825280601f01601f191660200182016040528015612a025781602001600182028036833780820191505090505b509050600082602001820190505b600115612a65578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612a5957612a5861546c565b5b04945060008503612a10575b819350505050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612ae35750612ae282612f9e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16612b0c836125c7565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60008486858585604051602001612b46959493929190615593565b60405160208183030381529060405280519060200120905095945050505050565b6000600c82604051602001612b7d929190615726565b604051602081830303815290604052805190602001209050919050565b600080600080612ba985613080565b92509250925060018682858560405160008152602001604052604051612bd29493929190615780565b6020604051602081039080840390855afa158015612bf4573d6000803e3d6000fd5b50505060206040510351935050505092915050565b612c238282604051806020016040528060008152506130e8565b5050565b612c3384848484613143565b50505050565b50505050565b612c498282611657565b612cc057612c5681611bae565b612c648360001c6020611bdb565b604051602001612c7592919061585d565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb79190613ad6565b60405180910390fd5b5050565b6000612ce58473ffffffffffffffffffffffffffffffffffffffff166132a1565b15612e3e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d0e611edc565b8786866040518563ffffffff1660e01b8152600401612d3094939291906158e1565b6020604051808303816000875af1925050508015612d6c57506040513d601f19601f82011682018060405250810190612d699190615942565b60015b612dee573d8060008114612d9c576040519150601f19603f3d011682016040523d82523d6000602084013e612da1565b606091505b506000815103612de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ddd9061544c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e43565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612ea9577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612e9f57612e9e61546c565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612ee6576d04ee2d6d415b85acef81000000008381612edc57612edb61546c565b5b0492506020810190505b662386f26fc100008310612f1557662386f26fc100008381612f0b57612f0a61546c565b5b0492506010810190505b6305f5e1008310612f3e576305f5e1008381612f3457612f3361546c565b5b0492506008810190505b6127108310612f63576127108381612f5957612f5861546c565b5b0492506004810190505b60648310612f865760648381612f7c57612f7b61546c565b5b0492506002810190505b600a8310612f95576001810190505b80915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061306957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806130795750613078826132c4565b5b9050919050565b600080600060418451146130c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c0906159bb565b60405180910390fd5b6020840151925060408401519150606084015160001a90509193909250565b6130f2838361332e565b6130ff6000848484612cc4565b61313e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131359061544c565b60405180910390fd5b505050565b61314f8484848461354b565b6001811115613193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318a90615a4d565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036131da576131d581613671565b613219565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146132185761321785826136ba565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361325b5761325681613827565b61329a565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146132995761329884826138f8565b5b5b5050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361339d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339490615ab9565b60405180910390fd5b6133a681612aea565b156133e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133dd90615b25565b60405180910390fd5b6133f4600083836001612c27565b6133fd81612aea565b1561343d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343490615b25565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613547600083836001612c39565b5050565b600181111561366b57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146135df5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135d79190615b45565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461366a5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136629190614863565b925050819055505b5b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016136c7846113e3565b6136d19190615b45565b90506000600760008481526020019081526020016000205490508181146137b6576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061383b9190615b45565b905060006009600084815260200190815260200160002054905060006008838154811061386b5761386a614903565b5b90600052602060002001549050806008838154811061388d5761388c614903565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806138dc576138db615b79565b5b6001900381819060005260206000200160009055905550505050565b6000613903836113e3565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6139c08161398b565b81146139cb57600080fd5b50565b6000813590506139dd816139b7565b92915050565b6000602082840312156139f9576139f8613981565b5b6000613a07848285016139ce565b91505092915050565b60008115159050919050565b613a2581613a10565b82525050565b6000602082019050613a406000830184613a1c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613a80578082015181840152602081019050613a65565b60008484015250505050565b6000601f19601f8301169050919050565b6000613aa882613a46565b613ab28185613a51565b9350613ac2818560208601613a62565b613acb81613a8c565b840191505092915050565b60006020820190508181036000830152613af08184613a9d565b905092915050565b6000819050919050565b613b0b81613af8565b8114613b1657600080fd5b50565b600081359050613b2881613b02565b92915050565b600060208284031215613b4457613b43613981565b5b6000613b5284828501613b19565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613b8682613b5b565b9050919050565b613b9681613b7b565b82525050565b6000602082019050613bb16000830184613b8d565b92915050565b613bc081613b7b565b8114613bcb57600080fd5b50565b600081359050613bdd81613bb7565b92915050565b60008060408385031215613bfa57613bf9613981565b5b6000613c0885828601613bce565b9250506020613c1985828601613b19565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613c6082613a8c565b810181811067ffffffffffffffff82111715613c7f57613c7e613c28565b5b80604052505050565b6000613c92613977565b9050613c9e8282613c57565b919050565b600067ffffffffffffffff821115613cbe57613cbd613c28565b5b602082029050602081019050919050565b600080fd5b6000613ce7613ce284613ca3565b613c88565b90508083825260208201905060208402830185811115613d0a57613d09613ccf565b5b835b81811015613d335780613d1f8882613b19565b845260208401935050602081019050613d0c565b5050509392505050565b600082601f830112613d5257613d51613c23565b5b8135613d62848260208601613cd4565b91505092915050565b600080fd5b600067ffffffffffffffff821115613d8b57613d8a613c28565b5b613d9482613a8c565b9050602081019050919050565b82818337600083830152505050565b6000613dc3613dbe84613d70565b613c88565b905082815260208101848484011115613ddf57613dde613d6b565b5b613dea848285613da1565b509392505050565b600082601f830112613e0757613e06613c23565b5b8135613e17848260208601613db0565b91505092915050565b600080600080600060a08688031215613e3c57613e3b613981565b5b6000613e4a88828901613bce565b955050602086013567ffffffffffffffff811115613e6b57613e6a613986565b5b613e7788828901613d3d565b9450506040613e8888828901613b19565b9350506060613e9988828901613b19565b925050608086013567ffffffffffffffff811115613eba57613eb9613986565b5b613ec688828901613df2565b9150509295509295909350565b613edc81613af8565b82525050565b6000602082019050613ef76000830184613ed3565b92915050565b600080600060608486031215613f1657613f15613981565b5b6000613f2486828701613bce565b9350506020613f3586828701613bce565b9250506040613f4686828701613b19565b9150509250925092565b6000819050919050565b613f6381613f50565b8114613f6e57600080fd5b50565b600081359050613f8081613f5a565b92915050565b600060208284031215613f9c57613f9b613981565b5b6000613faa84828501613f71565b91505092915050565b613fbc81613f50565b82525050565b6000602082019050613fd76000830184613fb3565b92915050565b600060208284031215613ff357613ff2613981565b5b600061400184828501613bce565b91505092915050565b6000806040838503121561402157614020613981565b5b600061402f85828601613f71565b925050602061404085828601613bce565b9150509250929050565b600067ffffffffffffffff82111561406557614064613c28565b5b61406e82613a8c565b9050602081019050919050565b600061408e6140898461404a565b613c88565b9050828152602081018484840111156140aa576140a9613d6b565b5b6140b5848285613da1565b509392505050565b600082601f8301126140d2576140d1613c23565b5b81356140e284826020860161407b565b91505092915050565b60006020828403121561410157614100613981565b5b600082013567ffffffffffffffff81111561411f5761411e613986565b5b61412b848285016140bd565b91505092915050565b6000806040838503121561414b5761414a613981565b5b600061415985828601613b19565b925050602061416a85828601613b19565b9150509250929050565b60006020828403121561418a57614189613981565b5b600082013567ffffffffffffffff8111156141a8576141a7613986565b5b6141b484828501613d3d565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6141f281613af8565b82525050565b600061420483836141e9565b60208301905092915050565b6000602082019050919050565b6000614228826141bd565b61423281856141c8565b935061423d836141d9565b8060005b8381101561426e57815161425588826141f8565b975061426083614210565b925050600181019050614241565b5085935050505092915050565b60006020820190508181036000830152614295818461421d565b905092915050565b6142a681613a10565b81146142b157600080fd5b50565b6000813590506142c38161429d565b92915050565b600080604083850312156142e0576142df613981565b5b60006142ee85828601613bce565b92505060206142ff858286016142b4565b9150509250929050565b6000806000806080858703121561432357614322613981565b5b600061433187828801613bce565b945050602061434287828801613bce565b935050604061435387828801613b19565b925050606085013567ffffffffffffffff81111561437457614373613986565b5b61438087828801613df2565b91505092959194509250565b600061439782613b7b565b9050919050565b6143a78161438c565b81146143b257600080fd5b50565b6000813590506143c48161439e565b92915050565b600080604083850312156143e1576143e0613981565b5b60006143ef85828601613b19565b9250506020614400858286016143b5565b9150509250929050565b6000602082840312156144205761441f613981565b5b600061442e848285016142b4565b91505092915050565b6000806040838503121561444e5761444d613981565b5b600061445c85828601613bce565b925050602061446d85828601613bce565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806144be57607f821691505b6020821081036144d1576144d0614477565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614533602183613a51565b915061453e826144d7565b604082019050919050565b6000602082019050818103600083015261456281614526565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006145c5603d83613a51565b91506145d082614569565b604082019050919050565b600060208201905081810360008301526145f4816145b8565b9050919050565b7f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b6000614657602283613a51565b9150614662826145fb565b604082019050919050565b600060208201905081810360008301526146868161464a565b9050919050565b7f496e73756666696369656e742070726963650000000000000000000000000000600082015250565b60006146c3601283613a51565b91506146ce8261468d565b602082019050919050565b600060208201905081810360008301526146f2816146b6565b9050919050565b60008160601b9050919050565b6000614711826146f9565b9050919050565b600061472382614706565b9050919050565b61473b61473682613b7b565b614718565b82525050565b600061474d828461472a565b60148201915081905092915050565b7f696e76616c6964207369676e6174757265200000000000000000000000000000600082015250565b6000614792601283613a51565b915061479d8261475c565b602082019050919050565b600060208201905081810360008301526147c181614785565b9050919050565b7f5369676e61747572652068617320657870697265640000000000000000000000600082015250565b60006147fe601583613a51565b9150614809826147c8565b602082019050919050565b6000602082019050818103600083015261482d816147f1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061486e82613af8565b915061487983613af8565b925082820190508082111561489157614890614834565b5b92915050565b7f5375706572696f72206c696d6974000000000000000000000000000000000000600082015250565b60006148cd600e83613a51565b91506148d882614897565b602082019050919050565b600060208201905081810360008301526148fc816148c0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4175746869642075736564000000000000000000000000000000000000000000600082015250565b6000614968600b83613a51565b915061497382614932565b602082019050919050565b600060208201905081810360008301526149978161495b565b9050919050565b60006149a982613af8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149db576149da614834565b5b600182019050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000614a42602d83613a51565b9150614a4d826149e6565b604082019050919050565b60006020820190508181036000830152614a7181614a35565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614ad4602b83613a51565b9150614adf82614a78565b604082019050919050565b60006020820190508181036000830152614b0381614ac7565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000614b66602f83613a51565b9150614b7182614b0a565b604082019050919050565b60006020820190508181036000830152614b9581614b59565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614bf8602c83613a51565b9150614c0382614b9c565b604082019050919050565b60006020820190508181036000830152614c2781614beb565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614c907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614c53565b614c9a8683614c53565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614cd7614cd2614ccd84613af8565b614cb2565b613af8565b9050919050565b6000819050919050565b614cf183614cbc565b614d05614cfd82614cde565b848454614c60565b825550505050565b600090565b614d1a614d0d565b614d25818484614ce8565b505050565b5b81811015614d4957614d3e600082614d12565b600181019050614d2b565b5050565b601f821115614d8e57614d5f81614c2e565b614d6884614c43565b81016020851015614d77578190505b614d8b614d8385614c43565b830182614d2a565b50505b505050565b600082821c905092915050565b6000614db160001984600802614d93565b1980831691505092915050565b6000614dca8383614da0565b9150826002028217905092915050565b614de382613a46565b67ffffffffffffffff811115614dfc57614dfb613c28565b5b614e0682546144a6565b614e11828285614d4d565b600060209050601f831160018114614e445760008415614e32578287015190505b614e3c8582614dbe565b865550614ea4565b601f198416614e5286614c2e565b60005b82811015614e7a57848901518255600182019150602085019450602081019050614e55565b86831015614e975784890151614e93601f891682614da0565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614ee2601883613a51565b9150614eed82614eac565b602082019050919050565b60006020820190508181036000830152614f1181614ed5565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614f74602983613a51565b9150614f7f82614f18565b604082019050919050565b60006020820190508181036000830152614fa381614f67565b9050919050565b6000604082019050614fbf6000830185613b8d565b614fcc6020830184613ed3565b9392505050565b600081519050614fe28161429d565b92915050565b600060208284031215614ffe57614ffd613981565b5b600061500c84828501614fd3565b91505092915050565b600081905092915050565b600061502b82613a46565b6150358185615015565b9350615045818560208601613a62565b80840191505092915050565b600061505d8285615020565b91506150698284615020565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006150d1602683613a51565b91506150dc82615075565b604082019050919050565b60006020820190508181036000830152615100816150c4565b9050919050565b600061511282613af8565b915061511d83613af8565b925082820261512b81613af8565b9150828204841483151761514257615141614834565b5b5092915050565b600061515482613af8565b91506000820361516757615166614834565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006151a8602083613a51565b91506151b382615172565b602082019050919050565b600060208201905081810360008301526151d78161519b565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061523a602583613a51565b9150615245826151de565b604082019050919050565b600060208201905081810360008301526152698161522d565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006152cc602483613a51565b91506152d782615270565b604082019050919050565b600060208201905081810360008301526152fb816152bf565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615338602083613a51565b915061534382615302565b602082019050919050565b600060208201905081810360008301526153678161532b565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006153a4601983613a51565b91506153af8261536e565b602082019050919050565b600060208201905081810360008301526153d381615397565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615436603283613a51565b9150615441826153da565b604082019050919050565b6000602082019050818103600083015261546581615429565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081905092915050565b6154af81613af8565b82525050565b60006154c183836154a6565b60208301905092915050565b60006154d8826141bd565b6154e2818561549b565b93506154ed836141d9565b8060005b8381101561551e57815161550588826154b5565b975061551083614210565b9250506001810190506154f1565b5085935050505092915050565b6000819050919050565b61554661554182613af8565b61552b565b82525050565b600081519050919050565b600081905092915050565b600061556d8261554c565b6155778185615557565b9350615587818560208601613a62565b80840191505092915050565b600061559f82886154cd565b91506155ab828761472a565b6014820191506155bb8286615535565b6020820191506155cb8285615535565b6020820191506155db8284615562565b91508190509695505050505050565b7f1900000000000000000000000000000000000000000000000000000000000000600082015250565b6000615620600183615015565b915061562b826155ea565b600182019050919050565b60008154615643816144a6565b61564d8186615015565b94506001821660008114615668576001811461567d576156b0565b60ff19831686528115158202860193506156b0565b61568685614c2e565b60005b838110156156a857815481890152600182019150602081019050615689565b838801955050505b50505092915050565b7f205369676e6564204d6573736167653a0a333200000000000000000000000000600082015250565b60006156ef601383615015565b91506156fa826156b9565b601382019050919050565b6000819050919050565b61572061571b82613f50565b615705565b82525050565b600061573182615613565b915061573d8285615636565b9150615748826156e2565b9150615754828461570f565b6020820191508190509392505050565b600060ff82169050919050565b61577a81615764565b82525050565b60006080820190506157956000830187613fb3565b6157a26020830186615771565b6157af6040830185613fb3565b6157bc6060830184613fb3565b95945050505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b60006157fb601783615015565b9150615806826157c5565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000615847601183615015565b915061585282615811565b601182019050919050565b6000615868826157ee565b91506158748285615020565b915061587f8261583a565b915061588b8284615020565b91508190509392505050565b600082825260208201905092915050565b60006158b38261554c565b6158bd8185615897565b93506158cd818560208601613a62565b6158d681613a8c565b840191505092915050565b60006080820190506158f66000830187613b8d565b6159036020830186613b8d565b6159106040830185613ed3565b818103606083015261592281846158a8565b905095945050505050565b60008151905061593c816139b7565b92915050565b60006020828403121561595857615957613981565b5b60006159668482850161592d565b91505092915050565b7f696e76616c6964207369676e6174757265206c656e6774680000000000000000600082015250565b60006159a5601883613a51565b91506159b08261596f565b602082019050919050565b600060208201905081810360008301526159d481615998565b9050919050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000615a37603583613a51565b9150615a42826159db565b604082019050919050565b60006020820190508181036000830152615a6681615a2a565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615aa3602083613a51565b9150615aae82615a6d565b602082019050919050565b60006020820190508181036000830152615ad281615a96565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615b0f601c83613a51565b9150615b1a82615ad9565b602082019050919050565b60006020820190508181036000830152615b3e81615b02565b9050919050565b6000615b5082613af8565b9150615b5b83613af8565b9250828203905081811115615b7357615b72614834565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212202326a60f11e4a6a5675fc063f42c1ee163ae5580d426621c836de03ad78500f664736f6c63430008110033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000008f5cc78f3e4216a906aac793abe9ddfed5de8af300000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000000e4445504554532047656e65736973000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4445504554532047656e65736973000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005868747470733a2f2f7065747765622d7065747765627365727665722d61706676746370766f622e61702d736f757468656173742d312e66636170702e72756e2f6e66745f6d6574612f4445504554535f47656e657369732f000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000001bf3ff9b7ceec164de93e303cd50d404f26e7db9000000000000000000000000a0c943e67dccac5640bd129cd2a03b9bb00e26a7

-----Decoded View---------------
Arg [0] : _name (string): DEPETS Genesis
Arg [1] : _symbol (string): DEPETS Genesis
Arg [2] : baseuri (string): https://petweb-petwebserver-apfvtcpvob.ap-southeast-1.fcapp.run/nft_meta/DEPETS_Genesis/
Arg [3] : masterAddress (address): 0x8F5Cc78F3E4216a906aaC793aBE9dDFeD5de8af3
Arg [4] : admins (address[]): 0x1bF3fF9B7cEEC164DE93E303cD50d404F26e7DB9,0xA0C943e67DCCac5640Bd129cD2A03b9bB00E26a7

-----Encoded View---------------
16 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 0000000000000000000000008f5cc78f3e4216a906aac793abe9ddfed5de8af3
Arg [4] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [6] : 4445504554532047656e65736973000000000000000000000000000000000000
Arg [7] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [8] : 4445504554532047656e65736973000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000058
Arg [10] : 68747470733a2f2f7065747765622d7065747765627365727665722d61706676
Arg [11] : 746370766f622e61702d736f757468656173742d312e66636170702e72756e2f
Arg [12] : 6e66745f6d6574612f4445504554535f47656e657369732f0000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [14] : 0000000000000000000000001bf3ff9b7ceec164de93e303cd50d404f26e7db9
Arg [15] : 000000000000000000000000a0c943e67dccac5640bd129cd2a03b9bb00e26a7


Deployed Bytecode Sourcemap

76668:6705:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77950:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36793:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38305:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37823:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79061:794;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60024:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39005:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72756:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80153:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73197:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59692:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74341:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79861:147;;;;;;;;;;;;;:::i;:::-;;39411:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76789:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60214:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78151:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36503:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76747:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77075:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80690:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36234:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56465:103;;;;;;;;;;;;;:::i;:::-;;76886:60;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80267:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78647:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80384:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55817:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71229:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36962:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70334:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38548:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39667:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80015:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78532:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37137:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73637:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76817:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80802:332;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38774:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76957:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56723:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78404:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77950:193;78075:4;78099:36;78123:11;78099:23;:36::i;:::-;78092:43;;77950:193;;;:::o;36793:100::-;36847:13;36880:5;36873:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36793:100;:::o;38305:171::-;38381:7;38401:23;38416:7;38401:14;:23::i;:::-;38444:15;:24;38460:7;38444:24;;;;;;;;;;;;;;;;;;;;;38437:31;;38305:171;;;:::o;37823:416::-;37904:13;37920:23;37935:7;37920:14;:23::i;:::-;37904:39;;37968:5;37962:11;;:2;:11;;;37954:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;38062:5;38046:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;38071:37;38088:5;38095:12;:10;:12::i;:::-;38071:16;:37::i;:::-;38046:62;38024:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;38210:21;38219:2;38223:7;38210:8;:21::i;:::-;37893:346;37823:416;;:::o;79061:794::-;79212:12;;;;;;;;;;;79204:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;79295:10;79282:9;:23;;79274:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;79347:86;79354:2;79358:7;79367:10;79379:8;79414:4;79389:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;79422:10;79347:6;:86::i;:::-;79339:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;79487:1;79475:8;:13;;:44;;;;79504:15;79492:8;:27;;79475:44;79467:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;79598:3;79580:7;:14;79564:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:37;;79556:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;79636:6;79632:115;79652:7;:14;79648:1;:18;79632:115;;;79697:10;:22;79708:7;79716:1;79708:10;;;;;;;;:::i;:::-;;;;;;;;79697:22;;;;;;;;;;;;;;;;;;;;;79696:23;79688:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;79668:4;;;;;:::i;:::-;;;;79632:115;;;;79761:6;79757:90;79777:7;:14;79773:1;:18;79757:90;;;79813:20;79818:2;79822:7;79830:1;79822:10;;;;;;;;:::i;:::-;;;;;;;;79813:4;:20::i;:::-;79793:4;;;;;:::i;:::-;;;;79757:90;;;;79061:794;;;;;:::o;60024:113::-;60085:7;60112:10;:17;;;;60105:24;;60024:113;:::o;39005:335::-;39200:41;39219:12;:10;:12::i;:::-;39233:7;39200:18;:41::i;:::-;39192:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;39304:28;39314:4;39320:2;39324:7;39304:9;:28::i;:::-;39005:335;;;:::o;72756:131::-;72830:7;72857:6;:12;72864:4;72857:12;;;;;;;;;;;:22;;;72850:29;;72756:131;;;:::o;80153:108::-;80204:4;80228:25;76923:23;80248:4;80228:7;:25::i;:::-;80221:32;;80153:108;;;:::o;73197:147::-;73280:18;73293:4;73280:12;:18::i;:::-;70825:16;70836:4;70825:10;:16::i;:::-;73311:25:::1;73322:4;73328:7;73311:10;:25::i;:::-;73197:147:::0;;;:::o;59692:256::-;59789:7;59825:23;59842:5;59825:16;:23::i;:::-;59817:5;:31;59809:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;59914:12;:19;59927:5;59914:19;;;;;;;;;;;;;;;:26;59934:5;59914:26;;;;;;;;;;;;59907:33;;59692:256;;;;:::o;74341:218::-;74448:12;:10;:12::i;:::-;74437:23;;:7;:23;;;74429:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;74525:26;74537:4;74543:7;74525:11;:26::i;:::-;74341:218;;:::o;79861:147::-;76923:23;70825:16;70836:4;70825:10;:16::i;:::-;79920:12:::1;79935:21;79920:36;;79975:6;;;;;;;;;;;79967:24;;:33;79992:7;79967:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;79909:99;79861:147:::0;:::o;39411:185::-;39549:39;39566:4;39572:2;39576:7;39549:39;;;;;;;;;;;;:16;:39::i;:::-;39411:185;;;:::o;76789:21::-;;;;;;;;;;;;;:::o;60214:233::-;60289:7;60325:30;:28;:30::i;:::-;60317:5;:38;60309:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;60422:10;60433:5;60422:17;;;;;;;;:::i;:::-;;;;;;;;;;60415:24;;60214:233;;;:::o;78151:120::-;76923:23;70825:16;70836:4;70825:10;:16::i;:::-;78255:8:::1;78236:16;:27;;;;;;:::i;:::-;;78151:120:::0;;:::o;36503:223::-;36575:7;36595:13;36611:17;36620:7;36611:8;:17::i;:::-;36595:33;;36664:1;36647:19;;:5;:19;;;36639:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;36713:5;36706:12;;;36503:223;;;:::o;76747:35::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;77075:46::-;;;;;;;;;;;;;;;;;:::o;80690:106::-;80747:4;80770:10;:18;80781:6;80770:18;;;;;;;;;;;;;;;;;;;;;80763:25;;80690:106;;;:::o;36234:207::-;36306:7;36351:1;36334:19;;:5;:19;;;36326:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36417:9;:16;36427:5;36417:16;;;;;;;;;;;;;;;;36410:23;;36234:207;;;:::o;56465:103::-;55703:13;:11;:13::i;:::-;56530:30:::1;56557:1;56530:18;:30::i;:::-;56465:103::o:0;76886:60::-;76923:23;76886:60;:::o;80267:111::-;80323:7;80350:11;:20;80362:7;80350:20;;;;;;;;;;;;80343:27;;80267:111;;;:::o;78647:187::-;76923:23;70825:16;70836:4;70825:10;:16::i;:::-;78745:6:::1;78741:86;78761:3;78757:1;:7;78741:86;;;78786:29;78791:6;;;;;;;;;;;78813:1;78799:11;:15;;;;:::i;:::-;78786:4;:29::i;:::-;78766:3;;;;:::i;:::-;;;78741:86;;;;78647:187:::0;;;:::o;80384:300::-;80451:16;80480:24;80521:8;:15;80507:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80480:57;;80552:6;80548:104;80568:8;:15;80564:1;:19;80548:104;;;80618:22;80628:8;80637:1;80628:11;;;;;;;;:::i;:::-;;;;;;;;80618:9;:22::i;:::-;80605:7;80613:1;80605:10;;;;;;;;:::i;:::-;;;;;;;:35;;;;;80585:4;;;;;:::i;:::-;;;;80548:104;;;;80669:7;80662:14;;;80384:300;;;:::o;55817:87::-;55863:7;55890:6;;;;;;;;;;;55883:13;;55817:87;:::o;71229:147::-;71315:4;71339:6;:12;71346:4;71339:12;;;;;;;;;;;:20;;:29;71360:7;71339:29;;;;;;;;;;;;;;;;;;;;;;;;;71332:36;;71229:147;;;;:::o;36962:104::-;37018:13;37051:7;37044:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36962:104;:::o;70334:49::-;70379:4;70334:49;;;:::o;38548:155::-;38643:52;38662:12;:10;:12::i;:::-;38676:8;38686;38643:18;:52::i;:::-;38548:155;;:::o;39667:322::-;39841:41;39860:12;:10;:12::i;:::-;39874:7;39841:18;:41::i;:::-;39833:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;39943:38;39957:4;39963:2;39967:7;39976:4;39943:13;:38::i;:::-;39667:322;;;;:::o;80015:132::-;76923:23;70825:16;70836:4;70825:10;:16::i;:::-;80108:5:::1;:14;;;80123:6;;;;;;;;;;;80131:7;80108:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;80015:132:::0;;;:::o;78532:107::-;76923:23;70825:16;70836:4;70825:10;:16::i;:::-;78623:8:::1;78608:12;;:23;;;;;;;;;;;;;;;;;;78532:107:::0;;:::o;37137:281::-;37210:13;37236:23;37251:7;37236:14;:23::i;:::-;37272:21;37296:10;:8;:10::i;:::-;37272:34;;37348:1;37330:7;37324:21;:25;:86;;;;;;;;;;;;;;;;;37376:7;37385:18;:7;:16;:18::i;:::-;37359:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37324:86;37317:93;;;37137:281;;;:::o;73637:149::-;73721:18;73734:4;73721:12;:18::i;:::-;70825:16;70836:4;70825:10;:16::i;:::-;73752:26:::1;73764:4;73770:7;73752:11;:26::i;:::-;73637:149:::0;;;:::o;76817:62::-;76855:24;76817:62;:::o;80802:332::-;80856:16;80885:14;80902:22;80919:4;80902:16;:22::i;:::-;80885:39;;80935:25;80977:6;80963:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80935:49;;80999:9;80995:106;81018:6;81014:1;:10;80995:106;;;81061:27;81081:4;81086:1;81061:19;:27::i;:::-;81046:8;81055:1;81046:11;;;;;;;;:::i;:::-;;;;;;;:43;;;;;81026:3;;;;;:::i;:::-;;;;80995:106;;;;81118:8;81111:15;;;;80802:332;;;:::o;38774:164::-;38871:4;38895:18;:25;38914:5;38895:25;;;;;;;;;;;;;;;:35;38921:8;38895:35;;;;;;;;;;;;;;;;;;;;;;;;;38888:42;;38774:164;;;;:::o;76957:31::-;;;;;;;;;;;;;:::o;56723:201::-;55703:13;:11;:13::i;:::-;56832:1:::1;56812:22;;:8;:22;;::::0;56804:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;56888:28;56907:8;56888:18;:28::i;:::-;56723:201:::0;:::o;78404:120::-;76855:24;70825:16;70836:4;70825:10;:16::i;:::-;78506:10:::1;78493;:23;;;;;;:::i;:::-;;78404:120:::0;;:::o;33275:151::-;33333:13;33366:52;33394:4;33378:22;;31430:2;33366:52;;:11;:52::i;:::-;33359:59;;33275:151;;;:::o;32671:447::-;32746:13;32772:19;32817:1;32808:6;32804:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;32794:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32772:47;;32830:15;:6;32837:1;32830:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;32856;:6;32863:1;32856:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;32887:9;32912:1;32903:6;32899:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;32887:26;;32882:131;32919:1;32915;:5;32882:131;;;32954:8;32971:3;32963:5;:11;32954:21;;;;;;;:::i;:::-;;;;;32942:6;32949:1;32942:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;33000:1;32990:11;;;;;32922:3;;;;:::i;:::-;;;32882:131;;;;33040:1;33031:5;:10;33023:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;33103:6;33089:21;;;32671:447;;;;:::o;70933:204::-;71018:4;71057:32;71042:47;;;:11;:47;;;;:87;;;;71093:36;71117:11;71093:23;:36::i;:::-;71042:87;71035:94;;70933:204;;;:::o;48124:135::-;48206:16;48214:7;48206;:16::i;:::-;48198:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;48124:135;:::o;18022:98::-;18075:7;18102:10;18095:17;;18022:98;:::o;47403:174::-;47505:2;47478:15;:24;47494:7;47478:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;47561:7;47557:2;47523:46;;47532:23;47547:7;47532:14;:23::i;:::-;47523:46;;;;;;;;;;;;47403:174;;:::o;81385:355::-;81540:4;81557:19;81579:52;81594:3;81599:7;81608:5;81615:8;81625:5;81579:14;:52::i;:::-;81557:74;;81649:83;76923:23;81669:62;81683:36;81707:11;81683:23;:36::i;:::-;81721:9;81669:13;:62::i;:::-;81649:7;:83::i;:::-;81642:90;;;81385:355;;;;;;;;:::o;78840:215::-;78903:15;78937:1;78921:13;:11;:13::i;:::-;:17;;;;:::i;:::-;78903:35;;78949:22;78959:2;78963:7;78949:9;:22::i;:::-;79005:6;78982:11;:20;78994:7;78982:20;;;;;;;;;;;:29;;;;79043:4;79022:10;:18;79033:6;79022:18;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;78891:164;78840:215;;:::o;42022:264::-;42115:4;42132:13;42148:23;42163:7;42148:14;:23::i;:::-;42132:39;;42201:5;42190:16;;:7;:16;;;:52;;;;42210:32;42227:5;42234:7;42210:16;:32::i;:::-;42190:52;:87;;;;42270:7;42246:31;;:20;42258:7;42246:11;:20::i;:::-;:31;;;42190:87;42182:96;;;42022:264;;;;:::o;46021:1263::-;46180:4;46153:31;;:23;46168:7;46153:14;:23::i;:::-;:31;;;46145:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;46259:1;46245:16;;:2;:16;;;46237:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;46315:42;46336:4;46342:2;46346:7;46355:1;46315:20;:42::i;:::-;46487:4;46460:31;;:23;46475:7;46460:14;:23::i;:::-;:31;;;46452:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;46605:15;:24;46621:7;46605:24;;;;;;;;;;;;46598:31;;;;;;;;;;;47100:1;47081:9;:15;47091:4;47081:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;47133:1;47116:9;:13;47126:2;47116:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;47175:2;47156:7;:16;47164:7;47156:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;47214:7;47210:2;47195:27;;47204:4;47195:27;;;;;;;;;;;;47235:41;47255:4;47261:2;47265:7;47274:1;47235:19;:41::i;:::-;46021:1263;;;:::o;71680:105::-;71747:30;71758:4;71764:12;:10;:12::i;:::-;71747:10;:30::i;:::-;71680:105;:::o;75938:238::-;76022:22;76030:4;76036:7;76022;:22::i;:::-;76017:152;;76093:4;76061:6;:12;76068:4;76061:12;;;;;;;;;;;:20;;:29;76082:7;76061:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;76144:12;:10;:12::i;:::-;76117:40;;76135:7;76117:40;;76129:4;76117:40;;;;;;;;;;76017:152;75938:238;;:::o;76356:239::-;76440:22;76448:4;76454:7;76440;:22::i;:::-;76436:152;;;76511:5;76479:6;:12;76486:4;76479:12;;;;;;;;;;;:20;;:29;76500:7;76479:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;76563:12;:10;:12::i;:::-;76536:40;;76554:7;76536:40;;76548:4;76536:40;;;;;;;;;;76436:152;76356:239;;:::o;41297:117::-;41363:7;41390;:16;41398:7;41390:16;;;;;;;;;;;;;;;;;;;;;41383:23;;41297:117;;;:::o;55982:132::-;56057:12;:10;:12::i;:::-;56046:23;;:7;:5;:7::i;:::-;:23;;;56038:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55982:132::o;57084:191::-;57158:16;57177:6;;;;;;;;;;;57158:25;;57203:8;57194:6;;:17;;;;;;;;;;;;;;;;;;57258:8;57227:40;;57248:8;57227:40;;;;;;;;;;;;57147:128;57084:191;:::o;47720:315::-;47875:8;47866:17;;:5;:17;;;47858:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;47962:8;47924:18;:25;47943:5;47924:25;;;;;;;;;;;;;;;:35;47950:8;47924:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;48008:8;47986:41;;48001:5;47986:41;;;48018:8;47986:41;;;;;;:::i;:::-;;;;;;;;47720:315;;;:::o;40870:313::-;41026:28;41036:4;41042:2;41046:7;41026:9;:28::i;:::-;41073:47;41096:4;41102:2;41106:7;41115:4;41073:22;:47::i;:::-;41065:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;40870:313;;;;:::o;78279:117::-;78339:13;78372:16;78365:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78279:117;:::o;31539:716::-;31595:13;31646:14;31683:1;31663:17;31674:5;31663:10;:17::i;:::-;:21;31646:38;;31699:20;31733:6;31722:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31699:41;;31755:11;31884:6;31880:2;31876:15;31868:6;31864:28;31857:35;;31921:288;31928:4;31921:288;;;31953:5;;;;;;;;32095:8;32090:2;32083:5;32079:14;32074:30;32069:3;32061:44;32151:2;32142:11;;;;;;:::i;:::-;;;;;32185:1;32176:5;:10;31921:288;32172:21;31921:288;32230:6;32223:13;;;;;31539:716;;;:::o;59384:224::-;59486:4;59525:35;59510:50;;;:11;:50;;;;:90;;;;59564:36;59588:11;59564:23;:36::i;:::-;59510:90;59503:97;;59384:224;;;:::o;41727:128::-;41792:4;41845:1;41816:31;;:17;41825:7;41816:8;:17::i;:::-;:31;;;;41809:38;;41727:128;;;:::o;81141:238::-;81279:7;81333;81342:3;81347:5;81354:8;81364:5;81316:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;81306:65;;;;;;81299:72;;81141:238;;;;;;;:::o;82936:434::-;83032:7;83298:10;83334:12;83273:74;;;;;;;;;:::i;:::-;;;;;;;;;;;;;83245:117;;;;;;83225:137;;82936:434;;;:::o;81746:283::-;81875:7;81901:9;81912;81923:7;81934:26;81949:10;81934:14;:26::i;:::-;81900:60;;;;;;81980:41;81990:21;82013:1;82016;82019;81980:41;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81973:48;;;;;81746:283;;;;:::o;42628:110::-;42704:26;42714:2;42718:7;42704:26;;;;;;;;;;;;:9;:26::i;:::-;42628:110;;:::o;77731:211::-;77878:56;77905:4;77911:2;77915:7;77924:9;77878:26;:56::i;:::-;77731:211;;;;:::o;51540:158::-;;;;;:::o;72075:492::-;72164:22;72172:4;72178:7;72164;:22::i;:::-;72159:401;;72352:28;72372:7;72352:19;:28::i;:::-;72453:38;72481:4;72473:13;;72488:2;72453:19;:38::i;:::-;72257:257;;;;;;;;;:::i;:::-;;;;;;;;;;;;;72203:345;;;;;;;;;;;:::i;:::-;;;;;;;;72159:401;72075:492;;:::o;48823:853::-;48977:4;48998:15;:2;:13;;;:15::i;:::-;48994:675;;;49050:2;49034:36;;;49071:12;:10;:12::i;:::-;49085:4;49091:7;49100:4;49034:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;49030:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49292:1;49275:6;:13;:18;49271:328;;49318:60;;;;;;;;;;:::i;:::-;;;;;;;;49271:328;49549:6;49543:13;49534:6;49530:2;49526:15;49519:38;49030:584;49166:41;;;49156:51;;;:6;:51;;;;49149:58;;;;;48994:675;49653:4;49646:11;;48823:853;;;;;;;:::o;28407:922::-;28460:7;28480:14;28497:1;28480:18;;28547:6;28538:5;:15;28534:102;;28583:6;28574:15;;;;;;:::i;:::-;;;;;28618:2;28608:12;;;;28534:102;28663:6;28654:5;:15;28650:102;;28699:6;28690:15;;;;;;:::i;:::-;;;;;28734:2;28724:12;;;;28650:102;28779:6;28770:5;:15;28766:102;;28815:6;28806:15;;;;;;:::i;:::-;;;;;28850:2;28840:12;;;;28766:102;28895:5;28886;:14;28882:99;;28930:5;28921:14;;;;;;:::i;:::-;;;;;28964:1;28954:11;;;;28882:99;29008:5;28999;:14;28995:99;;29043:5;29034:14;;;;;;:::i;:::-;;;;;29077:1;29067:11;;;;28995:99;29121:5;29112;:14;29108:99;;29156:5;29147:14;;;;;;:::i;:::-;;;;;29190:1;29180:11;;;;29108:99;29234:5;29225;:14;29221:66;;29270:1;29260:11;;;;29221:66;29315:6;29308:13;;;28407:922;;;:::o;35865:305::-;35967:4;36019:25;36004:40;;;:11;:40;;;;:105;;;;36076:33;36061:48;;;:11;:48;;;;36004:105;:158;;;;36126:36;36150:11;36126:23;:36::i;:::-;36004:158;35984:178;;35865:305;;;:::o;82037:885::-;82143:9;82167;82191:7;82248:2;82234:3;:10;:16;82226:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;82682:2;82677:3;82673:12;82667:19;82662:24;;82752:2;82747:3;82743:12;82737:19;82732:24;;82859:2;82854:3;82850:12;82844:19;82841:1;82836:28;82831:33;;82037:885;;;;;:::o;42965:319::-;43094:18;43100:2;43104:7;43094:5;:18::i;:::-;43145:53;43176:1;43180:2;43184:7;43193:4;43145:22;:53::i;:::-;43123:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;42965:319;;;:::o;60521:915::-;60698:61;60725:4;60731:2;60735:12;60749:9;60698:26;:61::i;:::-;60788:1;60776:9;:13;60772:222;;;60919:63;;;;;;;;;;:::i;:::-;;;;;;;;60772:222;61006:15;61024:12;61006:30;;61069:1;61053:18;;:4;:18;;;61049:187;;61088:40;61120:7;61088:31;:40::i;:::-;61049:187;;;61158:2;61150:10;;:4;:10;;;61146:90;;61177:47;61210:4;61216:7;61177:32;:47::i;:::-;61146:90;61049:187;61264:1;61250:16;;:2;:16;;;61246:183;;61283:45;61320:7;61283:36;:45::i;:::-;61246:183;;;61356:4;61350:10;;:2;:10;;;61346:83;;61377:40;61405:2;61409:7;61377:27;:40::i;:::-;61346:83;61246:183;60687:749;60521:915;;;;:::o;9148:326::-;9208:4;9465:1;9443:7;:19;;;:23;9436:30;;9148:326;;;:::o;34296:157::-;34381:4;34420:25;34405:40;;;:11;:40;;;;34398:47;;34296:157;;;:::o;43620:942::-;43714:1;43700:16;;:2;:16;;;43692:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;43773:16;43781:7;43773;:16::i;:::-;43772:17;43764:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;43835:48;43864:1;43868:2;43872:7;43881:1;43835:20;:48::i;:::-;43982:16;43990:7;43982;:16::i;:::-;43981:17;43973:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;44397:1;44380:9;:13;44390:2;44380:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;44441:2;44422:7;:16;44430:7;44422:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;44486:7;44482:2;44461:33;;44478:1;44461:33;;;;;;;;;;;;44507:47;44535:1;44539:2;44543:7;44552:1;44507:19;:47::i;:::-;43620:942;;:::o;50408:410::-;50598:1;50586:9;:13;50582:229;;;50636:1;50620:18;;:4;:18;;;50616:87;;50678:9;50659;:15;50669:4;50659:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;50616:87;50735:1;50721:16;;:2;:16;;;50717:83;;50775:9;50758;:13;50768:2;50758:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;50717:83;50582:229;50408:410;;;;:::o;62159:164::-;62263:10;:17;;;;62236:15;:24;62252:7;62236:24;;;;;;;;;;;:44;;;;62291:10;62307:7;62291:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62159:164;:::o;62950:988::-;63216:22;63266:1;63241:22;63258:4;63241:16;:22::i;:::-;:26;;;;:::i;:::-;63216:51;;63278:18;63299:17;:26;63317:7;63299:26;;;;;;;;;;;;63278:47;;63446:14;63432:10;:28;63428:328;;63477:19;63499:12;:18;63512:4;63499:18;;;;;;;;;;;;;;;:34;63518:14;63499:34;;;;;;;;;;;;63477:56;;63583:11;63550:12;:18;63563:4;63550:18;;;;;;;;;;;;;;;:30;63569:10;63550:30;;;;;;;;;;;:44;;;;63700:10;63667:17;:30;63685:11;63667:30;;;;;;;;;;;:43;;;;63462:294;63428:328;63852:17;:26;63870:7;63852:26;;;;;;;;;;;63845:33;;;63896:12;:18;63909:4;63896:18;;;;;;;;;;;;;;;:34;63915:14;63896:34;;;;;;;;;;;63889:41;;;63031:907;;62950:988;;:::o;64233:1079::-;64486:22;64531:1;64511:10;:17;;;;:21;;;;:::i;:::-;64486:46;;64543:18;64564:15;:24;64580:7;64564:24;;;;;;;;;;;;64543:45;;64915:19;64937:10;64948:14;64937:26;;;;;;;;:::i;:::-;;;;;;;;;;64915:48;;65001:11;64976:10;64987;64976:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;65112:10;65081:15;:28;65097:11;65081:28;;;;;;;;;;;:41;;;;65253:15;:24;65269:7;65253:24;;;;;;;;;;;65246:31;;;65288:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;64304:1008;;;64233:1079;:::o;61737:221::-;61822:14;61839:20;61856:2;61839:16;:20::i;:::-;61822:37;;61897:7;61870:12;:16;61883:2;61870:16;;;;;;;;;;;;;;;:24;61887:6;61870:24;;;;;;;;;;;:34;;;;61944:6;61915:17;:26;61933:7;61915:26;;;;;;;;;;;:35;;;;61811:147;61737:221;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:117::-;4999:1;4996;4989:12;5013:180;5061:77;5058:1;5051:88;5158:4;5155:1;5148:15;5182:4;5179:1;5172:15;5199:281;5282:27;5304:4;5282:27;:::i;:::-;5274:6;5270:40;5412:6;5400:10;5397:22;5376:18;5364:10;5361:34;5358:62;5355:88;;;5423:18;;:::i;:::-;5355:88;5463:10;5459:2;5452:22;5242:238;5199:281;;:::o;5486:129::-;5520:6;5547:20;;:::i;:::-;5537:30;;5576:33;5604:4;5596:6;5576:33;:::i;:::-;5486:129;;;:::o;5621:311::-;5698:4;5788:18;5780:6;5777:30;5774:56;;;5810:18;;:::i;:::-;5774:56;5860:4;5852:6;5848:17;5840:25;;5920:4;5914;5910:15;5902:23;;5621:311;;;:::o;5938:117::-;6047:1;6044;6037:12;6078:710;6174:5;6199:81;6215:64;6272:6;6215:64;:::i;:::-;6199:81;:::i;:::-;6190:90;;6300:5;6329:6;6322:5;6315:21;6363:4;6356:5;6352:16;6345:23;;6416:4;6408:6;6404:17;6396:6;6392:30;6445:3;6437:6;6434:15;6431:122;;;6464:79;;:::i;:::-;6431:122;6579:6;6562:220;6596:6;6591:3;6588:15;6562:220;;;6671:3;6700:37;6733:3;6721:10;6700:37;:::i;:::-;6695:3;6688:50;6767:4;6762:3;6758:14;6751:21;;6638:144;6622:4;6617:3;6613:14;6606:21;;6562:220;;;6566:21;6180:608;;6078:710;;;;;:::o;6811:370::-;6882:5;6931:3;6924:4;6916:6;6912:17;6908:27;6898:122;;6939:79;;:::i;:::-;6898:122;7056:6;7043:20;7081:94;7171:3;7163:6;7156:4;7148:6;7144:17;7081:94;:::i;:::-;7072:103;;6888:293;6811:370;;;;:::o;7187:117::-;7296:1;7293;7286:12;7310:307;7371:4;7461:18;7453:6;7450:30;7447:56;;;7483:18;;:::i;:::-;7447:56;7521:29;7543:6;7521:29;:::i;:::-;7513:37;;7605:4;7599;7595:15;7587:23;;7310:307;;;:::o;7623:146::-;7720:6;7715:3;7710;7697:30;7761:1;7752:6;7747:3;7743:16;7736:27;7623:146;;;:::o;7775:423::-;7852:5;7877:65;7893:48;7934:6;7893:48;:::i;:::-;7877:65;:::i;:::-;7868:74;;7965:6;7958:5;7951:21;8003:4;7996:5;7992:16;8041:3;8032:6;8027:3;8023:16;8020:25;8017:112;;;8048:79;;:::i;:::-;8017:112;8138:54;8185:6;8180:3;8175;8138:54;:::i;:::-;7858:340;7775:423;;;;;:::o;8217:338::-;8272:5;8321:3;8314:4;8306:6;8302:17;8298:27;8288:122;;8329:79;;:::i;:::-;8288:122;8446:6;8433:20;8471:78;8545:3;8537:6;8530:4;8522:6;8518:17;8471:78;:::i;:::-;8462:87;;8278:277;8217:338;;;;:::o;8561:1299::-;8690:6;8698;8706;8714;8722;8771:3;8759:9;8750:7;8746:23;8742:33;8739:120;;;8778:79;;:::i;:::-;8739:120;8898:1;8923:53;8968:7;8959:6;8948:9;8944:22;8923:53;:::i;:::-;8913:63;;8869:117;9053:2;9042:9;9038:18;9025:32;9084:18;9076:6;9073:30;9070:117;;;9106:79;;:::i;:::-;9070:117;9211:78;9281:7;9272:6;9261:9;9257:22;9211:78;:::i;:::-;9201:88;;8996:303;9338:2;9364:53;9409:7;9400:6;9389:9;9385:22;9364:53;:::i;:::-;9354:63;;9309:118;9466:2;9492:53;9537:7;9528:6;9517:9;9513:22;9492:53;:::i;:::-;9482:63;;9437:118;9622:3;9611:9;9607:19;9594:33;9654:18;9646:6;9643:30;9640:117;;;9676:79;;:::i;:::-;9640:117;9781:62;9835:7;9826:6;9815:9;9811:22;9781:62;:::i;:::-;9771:72;;9565:288;8561:1299;;;;;;;;:::o;9866:118::-;9953:24;9971:5;9953:24;:::i;:::-;9948:3;9941:37;9866:118;;:::o;9990:222::-;10083:4;10121:2;10110:9;10106:18;10098:26;;10134:71;10202:1;10191:9;10187:17;10178:6;10134:71;:::i;:::-;9990:222;;;;:::o;10218:619::-;10295:6;10303;10311;10360:2;10348:9;10339:7;10335:23;10331:32;10328:119;;;10366:79;;:::i;:::-;10328:119;10486:1;10511:53;10556:7;10547:6;10536:9;10532:22;10511:53;:::i;:::-;10501:63;;10457:117;10613:2;10639:53;10684:7;10675:6;10664:9;10660:22;10639:53;:::i;:::-;10629:63;;10584:118;10741:2;10767:53;10812:7;10803:6;10792:9;10788:22;10767:53;:::i;:::-;10757:63;;10712:118;10218:619;;;;;:::o;10843:77::-;10880:7;10909:5;10898:16;;10843:77;;;:::o;10926:122::-;10999:24;11017:5;10999:24;:::i;:::-;10992:5;10989:35;10979:63;;11038:1;11035;11028:12;10979:63;10926:122;:::o;11054:139::-;11100:5;11138:6;11125:20;11116:29;;11154:33;11181:5;11154:33;:::i;:::-;11054:139;;;;:::o;11199:329::-;11258:6;11307:2;11295:9;11286:7;11282:23;11278:32;11275:119;;;11313:79;;:::i;:::-;11275:119;11433:1;11458:53;11503:7;11494:6;11483:9;11479:22;11458:53;:::i;:::-;11448:63;;11404:117;11199:329;;;;:::o;11534:118::-;11621:24;11639:5;11621:24;:::i;:::-;11616:3;11609:37;11534:118;;:::o;11658:222::-;11751:4;11789:2;11778:9;11774:18;11766:26;;11802:71;11870:1;11859:9;11855:17;11846:6;11802:71;:::i;:::-;11658:222;;;;:::o;11886:329::-;11945:6;11994:2;11982:9;11973:7;11969:23;11965:32;11962:119;;;12000:79;;:::i;:::-;11962:119;12120:1;12145:53;12190:7;12181:6;12170:9;12166:22;12145:53;:::i;:::-;12135:63;;12091:117;11886:329;;;;:::o;12221:474::-;12289:6;12297;12346:2;12334:9;12325:7;12321:23;12317:32;12314:119;;;12352:79;;:::i;:::-;12314:119;12472:1;12497:53;12542:7;12533:6;12522:9;12518:22;12497:53;:::i;:::-;12487:63;;12443:117;12599:2;12625:53;12670:7;12661:6;12650:9;12646:22;12625:53;:::i;:::-;12615:63;;12570:118;12221:474;;;;;:::o;12701:308::-;12763:4;12853:18;12845:6;12842:30;12839:56;;;12875:18;;:::i;:::-;12839:56;12913:29;12935:6;12913:29;:::i;:::-;12905:37;;12997:4;12991;12987:15;12979:23;;12701:308;;;:::o;13015:425::-;13093:5;13118:66;13134:49;13176:6;13134:49;:::i;:::-;13118:66;:::i;:::-;13109:75;;13207:6;13200:5;13193:21;13245:4;13238:5;13234:16;13283:3;13274:6;13269:3;13265:16;13262:25;13259:112;;;13290:79;;:::i;:::-;13259:112;13380:54;13427:6;13422:3;13417;13380:54;:::i;:::-;13099:341;13015:425;;;;;:::o;13460:340::-;13516:5;13565:3;13558:4;13550:6;13546:17;13542:27;13532:122;;13573:79;;:::i;:::-;13532:122;13690:6;13677:20;13715:79;13790:3;13782:6;13775:4;13767:6;13763:17;13715:79;:::i;:::-;13706:88;;13522:278;13460:340;;;;:::o;13806:509::-;13875:6;13924:2;13912:9;13903:7;13899:23;13895:32;13892:119;;;13930:79;;:::i;:::-;13892:119;14078:1;14067:9;14063:17;14050:31;14108:18;14100:6;14097:30;14094:117;;;14130:79;;:::i;:::-;14094:117;14235:63;14290:7;14281:6;14270:9;14266:22;14235:63;:::i;:::-;14225:73;;14021:287;13806:509;;;;:::o;14321:474::-;14389:6;14397;14446:2;14434:9;14425:7;14421:23;14417:32;14414:119;;;14452:79;;:::i;:::-;14414:119;14572:1;14597:53;14642:7;14633:6;14622:9;14618:22;14597:53;:::i;:::-;14587:63;;14543:117;14699:2;14725:53;14770:7;14761:6;14750:9;14746:22;14725:53;:::i;:::-;14715:63;;14670:118;14321:474;;;;;:::o;14801:539::-;14885:6;14934:2;14922:9;14913:7;14909:23;14905:32;14902:119;;;14940:79;;:::i;:::-;14902:119;15088:1;15077:9;15073:17;15060:31;15118:18;15110:6;15107:30;15104:117;;;15140:79;;:::i;:::-;15104:117;15245:78;15315:7;15306:6;15295:9;15291:22;15245:78;:::i;:::-;15235:88;;15031:302;14801:539;;;;:::o;15346:114::-;15413:6;15447:5;15441:12;15431:22;;15346:114;;;:::o;15466:184::-;15565:11;15599:6;15594:3;15587:19;15639:4;15634:3;15630:14;15615:29;;15466:184;;;;:::o;15656:132::-;15723:4;15746:3;15738:11;;15776:4;15771:3;15767:14;15759:22;;15656:132;;;:::o;15794:108::-;15871:24;15889:5;15871:24;:::i;:::-;15866:3;15859:37;15794:108;;:::o;15908:179::-;15977:10;15998:46;16040:3;16032:6;15998:46;:::i;:::-;16076:4;16071:3;16067:14;16053:28;;15908:179;;;;:::o;16093:113::-;16163:4;16195;16190:3;16186:14;16178:22;;16093:113;;;:::o;16242:732::-;16361:3;16390:54;16438:5;16390:54;:::i;:::-;16460:86;16539:6;16534:3;16460:86;:::i;:::-;16453:93;;16570:56;16620:5;16570:56;:::i;:::-;16649:7;16680:1;16665:284;16690:6;16687:1;16684:13;16665:284;;;16766:6;16760:13;16793:63;16852:3;16837:13;16793:63;:::i;:::-;16786:70;;16879:60;16932:6;16879:60;:::i;:::-;16869:70;;16725:224;16712:1;16709;16705:9;16700:14;;16665:284;;;16669:14;16965:3;16958:10;;16366:608;;;16242:732;;;;:::o;16980:373::-;17123:4;17161:2;17150:9;17146:18;17138:26;;17210:9;17204:4;17200:20;17196:1;17185:9;17181:17;17174:47;17238:108;17341:4;17332:6;17238:108;:::i;:::-;17230:116;;16980:373;;;;:::o;17359:116::-;17429:21;17444:5;17429:21;:::i;:::-;17422:5;17419:32;17409:60;;17465:1;17462;17455:12;17409:60;17359:116;:::o;17481:133::-;17524:5;17562:6;17549:20;17540:29;;17578:30;17602:5;17578:30;:::i;:::-;17481:133;;;;:::o;17620:468::-;17685:6;17693;17742:2;17730:9;17721:7;17717:23;17713:32;17710:119;;;17748:79;;:::i;:::-;17710:119;17868:1;17893:53;17938:7;17929:6;17918:9;17914:22;17893:53;:::i;:::-;17883:63;;17839:117;17995:2;18021:50;18063:7;18054:6;18043:9;18039:22;18021:50;:::i;:::-;18011:60;;17966:115;17620:468;;;;;:::o;18094:943::-;18189:6;18197;18205;18213;18262:3;18250:9;18241:7;18237:23;18233:33;18230:120;;;18269:79;;:::i;:::-;18230:120;18389:1;18414:53;18459:7;18450:6;18439:9;18435:22;18414:53;:::i;:::-;18404:63;;18360:117;18516:2;18542:53;18587:7;18578:6;18567:9;18563:22;18542:53;:::i;:::-;18532:63;;18487:118;18644:2;18670:53;18715:7;18706:6;18695:9;18691:22;18670:53;:::i;:::-;18660:63;;18615:118;18800:2;18789:9;18785:18;18772:32;18831:18;18823:6;18820:30;18817:117;;;18853:79;;:::i;:::-;18817:117;18958:62;19012:7;19003:6;18992:9;18988:22;18958:62;:::i;:::-;18948:72;;18743:287;18094:943;;;;;;;:::o;19043:111::-;19095:7;19124:24;19142:5;19124:24;:::i;:::-;19113:35;;19043:111;;;:::o;19160:152::-;19248:39;19281:5;19248:39;:::i;:::-;19241:5;19238:50;19228:78;;19302:1;19299;19292:12;19228:78;19160:152;:::o;19318:169::-;19379:5;19417:6;19404:20;19395:29;;19433:48;19475:5;19433:48;:::i;:::-;19318:169;;;;:::o;19493:504::-;19576:6;19584;19633:2;19621:9;19612:7;19608:23;19604:32;19601:119;;;19639:79;;:::i;:::-;19601:119;19759:1;19784:53;19829:7;19820:6;19809:9;19805:22;19784:53;:::i;:::-;19774:63;;19730:117;19886:2;19912:68;19972:7;19963:6;19952:9;19948:22;19912:68;:::i;:::-;19902:78;;19857:133;19493:504;;;;;:::o;20003:323::-;20059:6;20108:2;20096:9;20087:7;20083:23;20079:32;20076:119;;;20114:79;;:::i;:::-;20076:119;20234:1;20259:50;20301:7;20292:6;20281:9;20277:22;20259:50;:::i;:::-;20249:60;;20205:114;20003:323;;;;:::o;20332:474::-;20400:6;20408;20457:2;20445:9;20436:7;20432:23;20428:32;20425:119;;;20463:79;;:::i;:::-;20425:119;20583:1;20608:53;20653:7;20644:6;20633:9;20629:22;20608:53;:::i;:::-;20598:63;;20554:117;20710:2;20736:53;20781:7;20772:6;20761:9;20757:22;20736:53;:::i;:::-;20726:63;;20681:118;20332:474;;;;;:::o;20812:180::-;20860:77;20857:1;20850:88;20957:4;20954:1;20947:15;20981:4;20978:1;20971:15;20998:320;21042:6;21079:1;21073:4;21069:12;21059:22;;21126:1;21120:4;21116:12;21147:18;21137:81;;21203:4;21195:6;21191:17;21181:27;;21137:81;21265:2;21257:6;21254:14;21234:18;21231:38;21228:84;;21284:18;;:::i;:::-;21228:84;21049:269;20998:320;;;:::o;21324:220::-;21464:34;21460:1;21452:6;21448:14;21441:58;21533:3;21528:2;21520:6;21516:15;21509:28;21324:220;:::o;21550:366::-;21692:3;21713:67;21777:2;21772:3;21713:67;:::i;:::-;21706:74;;21789:93;21878:3;21789:93;:::i;:::-;21907:2;21902:3;21898:12;21891:19;;21550:366;;;:::o;21922:419::-;22088:4;22126:2;22115:9;22111:18;22103:26;;22175:9;22169:4;22165:20;22161:1;22150:9;22146:17;22139:47;22203:131;22329:4;22203:131;:::i;:::-;22195:139;;21922:419;;;:::o;22347:248::-;22487:34;22483:1;22475:6;22471:14;22464:58;22556:31;22551:2;22543:6;22539:15;22532:56;22347:248;:::o;22601:366::-;22743:3;22764:67;22828:2;22823:3;22764:67;:::i;:::-;22757:74;;22840:93;22929:3;22840:93;:::i;:::-;22958:2;22953:3;22949:12;22942:19;;22601:366;;;:::o;22973:419::-;23139:4;23177:2;23166:9;23162:18;23154:26;;23226:9;23220:4;23216:20;23212:1;23201:9;23197:17;23190:47;23254:131;23380:4;23254:131;:::i;:::-;23246:139;;22973:419;;;:::o;23398:221::-;23538:34;23534:1;23526:6;23522:14;23515:58;23607:4;23602:2;23594:6;23590:15;23583:29;23398:221;:::o;23625:366::-;23767:3;23788:67;23852:2;23847:3;23788:67;:::i;:::-;23781:74;;23864:93;23953:3;23864:93;:::i;:::-;23982:2;23977:3;23973:12;23966:19;;23625:366;;;:::o;23997:419::-;24163:4;24201:2;24190:9;24186:18;24178:26;;24250:9;24244:4;24240:20;24236:1;24225:9;24221:17;24214:47;24278:131;24404:4;24278:131;:::i;:::-;24270:139;;23997:419;;;:::o;24422:168::-;24562:20;24558:1;24550:6;24546:14;24539:44;24422:168;:::o;24596:366::-;24738:3;24759:67;24823:2;24818:3;24759:67;:::i;:::-;24752:74;;24835:93;24924:3;24835:93;:::i;:::-;24953:2;24948:3;24944:12;24937:19;;24596:366;;;:::o;24968:419::-;25134:4;25172:2;25161:9;25157:18;25149:26;;25221:9;25215:4;25211:20;25207:1;25196:9;25192:17;25185:47;25249:131;25375:4;25249:131;:::i;:::-;25241:139;;24968:419;;;:::o;25393:94::-;25426:8;25474:5;25470:2;25466:14;25445:35;;25393:94;;;:::o;25493:::-;25532:7;25561:20;25575:5;25561:20;:::i;:::-;25550:31;;25493:94;;;:::o;25593:100::-;25632:7;25661:26;25681:5;25661:26;:::i;:::-;25650:37;;25593:100;;;:::o;25699:157::-;25804:45;25824:24;25842:5;25824:24;:::i;:::-;25804:45;:::i;:::-;25799:3;25792:58;25699:157;;:::o;25862:256::-;25974:3;25989:75;26060:3;26051:6;25989:75;:::i;:::-;26089:2;26084:3;26080:12;26073:19;;26109:3;26102:10;;25862:256;;;;:::o;26124:168::-;26264:20;26260:1;26252:6;26248:14;26241:44;26124:168;:::o;26298:366::-;26440:3;26461:67;26525:2;26520:3;26461:67;:::i;:::-;26454:74;;26537:93;26626:3;26537:93;:::i;:::-;26655:2;26650:3;26646:12;26639:19;;26298:366;;;:::o;26670:419::-;26836:4;26874:2;26863:9;26859:18;26851:26;;26923:9;26917:4;26913:20;26909:1;26898:9;26894:17;26887:47;26951:131;27077:4;26951:131;:::i;:::-;26943:139;;26670:419;;;:::o;27095:171::-;27235:23;27231:1;27223:6;27219:14;27212:47;27095:171;:::o;27272:366::-;27414:3;27435:67;27499:2;27494:3;27435:67;:::i;:::-;27428:74;;27511:93;27600:3;27511:93;:::i;:::-;27629:2;27624:3;27620:12;27613:19;;27272:366;;;:::o;27644:419::-;27810:4;27848:2;27837:9;27833:18;27825:26;;27897:9;27891:4;27887:20;27883:1;27872:9;27868:17;27861:47;27925:131;28051:4;27925:131;:::i;:::-;27917:139;;27644:419;;;:::o;28069:180::-;28117:77;28114:1;28107:88;28214:4;28211:1;28204:15;28238:4;28235:1;28228:15;28255:191;28295:3;28314:20;28332:1;28314:20;:::i;:::-;28309:25;;28348:20;28366:1;28348:20;:::i;:::-;28343:25;;28391:1;28388;28384:9;28377:16;;28412:3;28409:1;28406:10;28403:36;;;28419:18;;:::i;:::-;28403:36;28255:191;;;;:::o;28452:164::-;28592:16;28588:1;28580:6;28576:14;28569:40;28452:164;:::o;28622:366::-;28764:3;28785:67;28849:2;28844:3;28785:67;:::i;:::-;28778:74;;28861:93;28950:3;28861:93;:::i;:::-;28979:2;28974:3;28970:12;28963:19;;28622:366;;;:::o;28994:419::-;29160:4;29198:2;29187:9;29183:18;29175:26;;29247:9;29241:4;29237:20;29233:1;29222:9;29218:17;29211:47;29275:131;29401:4;29275:131;:::i;:::-;29267:139;;28994:419;;;:::o;29419:180::-;29467:77;29464:1;29457:88;29564:4;29561:1;29554:15;29588:4;29585:1;29578:15;29605:161;29745:13;29741:1;29733:6;29729:14;29722:37;29605:161;:::o;29772:366::-;29914:3;29935:67;29999:2;29994:3;29935:67;:::i;:::-;29928:74;;30011:93;30100:3;30011:93;:::i;:::-;30129:2;30124:3;30120:12;30113:19;;29772:366;;;:::o;30144:419::-;30310:4;30348:2;30337:9;30333:18;30325:26;;30397:9;30391:4;30387:20;30383:1;30372:9;30368:17;30361:47;30425:131;30551:4;30425:131;:::i;:::-;30417:139;;30144:419;;;:::o;30569:233::-;30608:3;30631:24;30649:5;30631:24;:::i;:::-;30622:33;;30677:66;30670:5;30667:77;30664:103;;30747:18;;:::i;:::-;30664:103;30794:1;30787:5;30783:13;30776:20;;30569:233;;;:::o;30808:232::-;30948:34;30944:1;30936:6;30932:14;30925:58;31017:15;31012:2;31004:6;31000:15;30993:40;30808:232;:::o;31046:366::-;31188:3;31209:67;31273:2;31268:3;31209:67;:::i;:::-;31202:74;;31285:93;31374:3;31285:93;:::i;:::-;31403:2;31398:3;31394:12;31387:19;;31046:366;;;:::o;31418:419::-;31584:4;31622:2;31611:9;31607:18;31599:26;;31671:9;31665:4;31661:20;31657:1;31646:9;31642:17;31635:47;31699:131;31825:4;31699:131;:::i;:::-;31691:139;;31418:419;;;:::o;31843:230::-;31983:34;31979:1;31971:6;31967:14;31960:58;32052:13;32047:2;32039:6;32035:15;32028:38;31843:230;:::o;32079:366::-;32221:3;32242:67;32306:2;32301:3;32242:67;:::i;:::-;32235:74;;32318:93;32407:3;32318:93;:::i;:::-;32436:2;32431:3;32427:12;32420:19;;32079:366;;;:::o;32451:419::-;32617:4;32655:2;32644:9;32640:18;32632:26;;32704:9;32698:4;32694:20;32690:1;32679:9;32675:17;32668:47;32732:131;32858:4;32732:131;:::i;:::-;32724:139;;32451:419;;;:::o;32876:234::-;33016:34;33012:1;33004:6;33000:14;32993:58;33085:17;33080:2;33072:6;33068:15;33061:42;32876:234;:::o;33116:366::-;33258:3;33279:67;33343:2;33338:3;33279:67;:::i;:::-;33272:74;;33355:93;33444:3;33355:93;:::i;:::-;33473:2;33468:3;33464:12;33457:19;;33116:366;;;:::o;33488:419::-;33654:4;33692:2;33681:9;33677:18;33669:26;;33741:9;33735:4;33731:20;33727:1;33716:9;33712:17;33705:47;33769:131;33895:4;33769:131;:::i;:::-;33761:139;;33488:419;;;:::o;33913:231::-;34053:34;34049:1;34041:6;34037:14;34030:58;34122:14;34117:2;34109:6;34105:15;34098:39;33913:231;:::o;34150:366::-;34292:3;34313:67;34377:2;34372:3;34313:67;:::i;:::-;34306:74;;34389:93;34478:3;34389:93;:::i;:::-;34507:2;34502:3;34498:12;34491:19;;34150:366;;;:::o;34522:419::-;34688:4;34726:2;34715:9;34711:18;34703:26;;34775:9;34769:4;34765:20;34761:1;34750:9;34746:17;34739:47;34803:131;34929:4;34803:131;:::i;:::-;34795:139;;34522:419;;;:::o;34947:141::-;34996:4;35019:3;35011:11;;35042:3;35039:1;35032:14;35076:4;35073:1;35063:18;35055:26;;34947:141;;;:::o;35094:93::-;35131:6;35178:2;35173;35166:5;35162:14;35158:23;35148:33;;35094:93;;;:::o;35193:107::-;35237:8;35287:5;35281:4;35277:16;35256:37;;35193:107;;;;:::o;35306:393::-;35375:6;35425:1;35413:10;35409:18;35448:97;35478:66;35467:9;35448:97;:::i;:::-;35566:39;35596:8;35585:9;35566:39;:::i;:::-;35554:51;;35638:4;35634:9;35627:5;35623:21;35614:30;;35687:4;35677:8;35673:19;35666:5;35663:30;35653:40;;35382:317;;35306:393;;;;;:::o;35705:60::-;35733:3;35754:5;35747:12;;35705:60;;;:::o;35771:142::-;35821:9;35854:53;35872:34;35881:24;35899:5;35881:24;:::i;:::-;35872:34;:::i;:::-;35854:53;:::i;:::-;35841:66;;35771:142;;;:::o;35919:75::-;35962:3;35983:5;35976:12;;35919:75;;;:::o;36000:269::-;36110:39;36141:7;36110:39;:::i;:::-;36171:91;36220:41;36244:16;36220:41;:::i;:::-;36212:6;36205:4;36199:11;36171:91;:::i;:::-;36165:4;36158:105;36076:193;36000:269;;;:::o;36275:73::-;36320:3;36275:73;:::o;36354:189::-;36431:32;;:::i;:::-;36472:65;36530:6;36522;36516:4;36472:65;:::i;:::-;36407:136;36354:189;;:::o;36549:186::-;36609:120;36626:3;36619:5;36616:14;36609:120;;;36680:39;36717:1;36710:5;36680:39;:::i;:::-;36653:1;36646:5;36642:13;36633:22;;36609:120;;;36549:186;;:::o;36741:543::-;36842:2;36837:3;36834:11;36831:446;;;36876:38;36908:5;36876:38;:::i;:::-;36960:29;36978:10;36960:29;:::i;:::-;36950:8;36946:44;37143:2;37131:10;37128:18;37125:49;;;37164:8;37149:23;;37125:49;37187:80;37243:22;37261:3;37243:22;:::i;:::-;37233:8;37229:37;37216:11;37187:80;:::i;:::-;36846:431;;36831:446;36741:543;;;:::o;37290:117::-;37344:8;37394:5;37388:4;37384:16;37363:37;;37290:117;;;;:::o;37413:169::-;37457:6;37490:51;37538:1;37534:6;37526:5;37523:1;37519:13;37490:51;:::i;:::-;37486:56;37571:4;37565;37561:15;37551:25;;37464:118;37413:169;;;;:::o;37587:295::-;37663:4;37809:29;37834:3;37828:4;37809:29;:::i;:::-;37801:37;;37871:3;37868:1;37864:11;37858:4;37855:21;37847:29;;37587:295;;;;:::o;37887:1395::-;38004:37;38037:3;38004:37;:::i;:::-;38106:18;38098:6;38095:30;38092:56;;;38128:18;;:::i;:::-;38092:56;38172:38;38204:4;38198:11;38172:38;:::i;:::-;38257:67;38317:6;38309;38303:4;38257:67;:::i;:::-;38351:1;38375:4;38362:17;;38407:2;38399:6;38396:14;38424:1;38419:618;;;;39081:1;39098:6;39095:77;;;39147:9;39142:3;39138:19;39132:26;39123:35;;39095:77;39198:67;39258:6;39251:5;39198:67;:::i;:::-;39192:4;39185:81;39054:222;38389:887;;38419:618;38471:4;38467:9;38459:6;38455:22;38505:37;38537:4;38505:37;:::i;:::-;38564:1;38578:208;38592:7;38589:1;38586:14;38578:208;;;38671:9;38666:3;38662:19;38656:26;38648:6;38641:42;38722:1;38714:6;38710:14;38700:24;;38769:2;38758:9;38754:18;38741:31;;38615:4;38612:1;38608:12;38603:17;;38578:208;;;38814:6;38805:7;38802:19;38799:179;;;38872:9;38867:3;38863:19;38857:26;38915:48;38957:4;38949:6;38945:17;38934:9;38915:48;:::i;:::-;38907:6;38900:64;38822:156;38799:179;39024:1;39020;39012:6;39008:14;39004:22;38998:4;38991:36;38426:611;;;38389:887;;37979:1303;;;37887:1395;;:::o;39288:174::-;39428:26;39424:1;39416:6;39412:14;39405:50;39288:174;:::o;39468:366::-;39610:3;39631:67;39695:2;39690:3;39631:67;:::i;:::-;39624:74;;39707:93;39796:3;39707:93;:::i;:::-;39825:2;39820:3;39816:12;39809:19;;39468:366;;;:::o;39840:419::-;40006:4;40044:2;40033:9;40029:18;40021:26;;40093:9;40087:4;40083:20;40079:1;40068:9;40064:17;40057:47;40121:131;40247:4;40121:131;:::i;:::-;40113:139;;39840:419;;;:::o;40265:228::-;40405:34;40401:1;40393:6;40389:14;40382:58;40474:11;40469:2;40461:6;40457:15;40450:36;40265:228;:::o;40499:366::-;40641:3;40662:67;40726:2;40721:3;40662:67;:::i;:::-;40655:74;;40738:93;40827:3;40738:93;:::i;:::-;40856:2;40851:3;40847:12;40840:19;;40499:366;;;:::o;40871:419::-;41037:4;41075:2;41064:9;41060:18;41052:26;;41124:9;41118:4;41114:20;41110:1;41099:9;41095:17;41088:47;41152:131;41278:4;41152:131;:::i;:::-;41144:139;;40871:419;;;:::o;41296:332::-;41417:4;41455:2;41444:9;41440:18;41432:26;;41468:71;41536:1;41525:9;41521:17;41512:6;41468:71;:::i;:::-;41549:72;41617:2;41606:9;41602:18;41593:6;41549:72;:::i;:::-;41296:332;;;;;:::o;41634:137::-;41688:5;41719:6;41713:13;41704:22;;41735:30;41759:5;41735:30;:::i;:::-;41634:137;;;;:::o;41777:345::-;41844:6;41893:2;41881:9;41872:7;41868:23;41864:32;41861:119;;;41899:79;;:::i;:::-;41861:119;42019:1;42044:61;42097:7;42088:6;42077:9;42073:22;42044:61;:::i;:::-;42034:71;;41990:125;41777:345;;;;:::o;42128:148::-;42230:11;42267:3;42252:18;;42128:148;;;;:::o;42282:390::-;42388:3;42416:39;42449:5;42416:39;:::i;:::-;42471:89;42553:6;42548:3;42471:89;:::i;:::-;42464:96;;42569:65;42627:6;42622:3;42615:4;42608:5;42604:16;42569:65;:::i;:::-;42659:6;42654:3;42650:16;42643:23;;42392:280;42282:390;;;;:::o;42678:435::-;42858:3;42880:95;42971:3;42962:6;42880:95;:::i;:::-;42873:102;;42992:95;43083:3;43074:6;42992:95;:::i;:::-;42985:102;;43104:3;43097:10;;42678:435;;;;;:::o;43119:225::-;43259:34;43255:1;43247:6;43243:14;43236:58;43328:8;43323:2;43315:6;43311:15;43304:33;43119:225;:::o;43350:366::-;43492:3;43513:67;43577:2;43572:3;43513:67;:::i;:::-;43506:74;;43589:93;43678:3;43589:93;:::i;:::-;43707:2;43702:3;43698:12;43691:19;;43350:366;;;:::o;43722:419::-;43888:4;43926:2;43915:9;43911:18;43903:26;;43975:9;43969:4;43965:20;43961:1;43950:9;43946:17;43939:47;44003:131;44129:4;44003:131;:::i;:::-;43995:139;;43722:419;;;:::o;44147:410::-;44187:7;44210:20;44228:1;44210:20;:::i;:::-;44205:25;;44244:20;44262:1;44244:20;:::i;:::-;44239:25;;44299:1;44296;44292:9;44321:30;44339:11;44321:30;:::i;:::-;44310:41;;44500:1;44491:7;44487:15;44484:1;44481:22;44461:1;44454:9;44434:83;44411:139;;44530:18;;:::i;:::-;44411:139;44195:362;44147:410;;;;:::o;44563:171::-;44602:3;44625:24;44643:5;44625:24;:::i;:::-;44616:33;;44671:4;44664:5;44661:15;44658:41;;44679:18;;:::i;:::-;44658:41;44726:1;44719:5;44715:13;44708:20;;44563:171;;;:::o;44740:182::-;44880:34;44876:1;44868:6;44864:14;44857:58;44740:182;:::o;44928:366::-;45070:3;45091:67;45155:2;45150:3;45091:67;:::i;:::-;45084:74;;45167:93;45256:3;45167:93;:::i;:::-;45285:2;45280:3;45276:12;45269:19;;44928:366;;;:::o;45300:419::-;45466:4;45504:2;45493:9;45489:18;45481:26;;45553:9;45547:4;45543:20;45539:1;45528:9;45524:17;45517:47;45581:131;45707:4;45581:131;:::i;:::-;45573:139;;45300:419;;;:::o;45725:224::-;45865:34;45861:1;45853:6;45849:14;45842:58;45934:7;45929:2;45921:6;45917:15;45910:32;45725:224;:::o;45955:366::-;46097:3;46118:67;46182:2;46177:3;46118:67;:::i;:::-;46111:74;;46194:93;46283:3;46194:93;:::i;:::-;46312:2;46307:3;46303:12;46296:19;;45955:366;;;:::o;46327:419::-;46493:4;46531:2;46520:9;46516:18;46508:26;;46580:9;46574:4;46570:20;46566:1;46555:9;46551:17;46544:47;46608:131;46734:4;46608:131;:::i;:::-;46600:139;;46327:419;;;:::o;46752:223::-;46892:34;46888:1;46880:6;46876:14;46869:58;46961:6;46956:2;46948:6;46944:15;46937:31;46752:223;:::o;46981:366::-;47123:3;47144:67;47208:2;47203:3;47144:67;:::i;:::-;47137:74;;47220:93;47309:3;47220:93;:::i;:::-;47338:2;47333:3;47329:12;47322:19;;46981:366;;;:::o;47353:419::-;47519:4;47557:2;47546:9;47542:18;47534:26;;47606:9;47600:4;47596:20;47592:1;47581:9;47577:17;47570:47;47634:131;47760:4;47634:131;:::i;:::-;47626:139;;47353:419;;;:::o;47778:182::-;47918:34;47914:1;47906:6;47902:14;47895:58;47778:182;:::o;47966:366::-;48108:3;48129:67;48193:2;48188:3;48129:67;:::i;:::-;48122:74;;48205:93;48294:3;48205:93;:::i;:::-;48323:2;48318:3;48314:12;48307:19;;47966:366;;;:::o;48338:419::-;48504:4;48542:2;48531:9;48527:18;48519:26;;48591:9;48585:4;48581:20;48577:1;48566:9;48562:17;48555:47;48619:131;48745:4;48619:131;:::i;:::-;48611:139;;48338:419;;;:::o;48763:175::-;48903:27;48899:1;48891:6;48887:14;48880:51;48763:175;:::o;48944:366::-;49086:3;49107:67;49171:2;49166:3;49107:67;:::i;:::-;49100:74;;49183:93;49272:3;49183:93;:::i;:::-;49301:2;49296:3;49292:12;49285:19;;48944:366;;;:::o;49316:419::-;49482:4;49520:2;49509:9;49505:18;49497:26;;49569:9;49563:4;49559:20;49555:1;49544:9;49540:17;49533:47;49597:131;49723:4;49597:131;:::i;:::-;49589:139;;49316:419;;;:::o;49741:237::-;49881:34;49877:1;49869:6;49865:14;49858:58;49950:20;49945:2;49937:6;49933:15;49926:45;49741:237;:::o;49984:366::-;50126:3;50147:67;50211:2;50206:3;50147:67;:::i;:::-;50140:74;;50223:93;50312:3;50223:93;:::i;:::-;50341:2;50336:3;50332:12;50325:19;;49984:366;;;:::o;50356:419::-;50522:4;50560:2;50549:9;50545:18;50537:26;;50609:9;50603:4;50599:20;50595:1;50584:9;50580:17;50573:47;50637:131;50763:4;50637:131;:::i;:::-;50629:139;;50356:419;;;:::o;50781:180::-;50829:77;50826:1;50819:88;50926:4;50923:1;50916:15;50950:4;50947:1;50940:15;50967:163;51084:11;51121:3;51106:18;;50967:163;;;;:::o;51136:116::-;51221:24;51239:5;51221:24;:::i;:::-;51216:3;51209:37;51136:116;;:::o;51258:195::-;51335:10;51356:54;51406:3;51398:6;51356:54;:::i;:::-;51442:4;51437:3;51433:14;51419:28;;51258:195;;;;:::o;51489:776::-;51626:3;51655:54;51703:5;51655:54;:::i;:::-;51725:104;51822:6;51817:3;51725:104;:::i;:::-;51718:111;;51853:56;51903:5;51853:56;:::i;:::-;51932:7;51963:1;51948:292;51973:6;51970:1;51967:13;51948:292;;;52049:6;52043:13;52076:71;52143:3;52128:13;52076:71;:::i;:::-;52069:78;;52170:60;52223:6;52170:60;:::i;:::-;52160:70;;52008:232;51995:1;51992;51988:9;51983:14;;51948:292;;;51952:14;52256:3;52249:10;;51631:634;;;51489:776;;;;:::o;52271:79::-;52310:7;52339:5;52328:16;;52271:79;;;:::o;52356:157::-;52461:45;52481:24;52499:5;52481:24;:::i;:::-;52461:45;:::i;:::-;52456:3;52449:58;52356:157;;:::o;52519:98::-;52570:6;52604:5;52598:12;52588:22;;52519:98;;;:::o;52623:147::-;52724:11;52761:3;52746:18;;52623:147;;;;:::o;52776:386::-;52880:3;52908:38;52940:5;52908:38;:::i;:::-;52962:88;53043:6;53038:3;52962:88;:::i;:::-;52955:95;;53059:65;53117:6;53112:3;53105:4;53098:5;53094:16;53059:65;:::i;:::-;53149:6;53144:3;53140:16;53133:23;;52884:278;52776:386;;;;:::o;53168:914::-;53460:3;53482:125;53603:3;53594:6;53482:125;:::i;:::-;53475:132;;53617:75;53688:3;53679:6;53617:75;:::i;:::-;53717:2;53712:3;53708:12;53701:19;;53730:75;53801:3;53792:6;53730:75;:::i;:::-;53830:2;53825:3;53821:12;53814:19;;53843:75;53914:3;53905:6;53843:75;:::i;:::-;53943:2;53938:3;53934:12;53927:19;;53963:93;54052:3;54043:6;53963:93;:::i;:::-;53956:100;;54073:3;54066:10;;53168:914;;;;;;;;:::o;54088:214::-;54228:66;54224:1;54216:6;54212:14;54205:90;54088:214;:::o;54308:400::-;54468:3;54489:84;54571:1;54566:3;54489:84;:::i;:::-;54482:91;;54582:93;54671:3;54582:93;:::i;:::-;54700:1;54695:3;54691:11;54684:18;;54308:400;;;:::o;54738:874::-;54841:3;54878:5;54872:12;54907:36;54933:9;54907:36;:::i;:::-;54959:89;55041:6;55036:3;54959:89;:::i;:::-;54952:96;;55079:1;55068:9;55064:17;55095:1;55090:166;;;;55270:1;55265:341;;;;55057:549;;55090:166;55174:4;55170:9;55159;55155:25;55150:3;55143:38;55236:6;55229:14;55222:22;55214:6;55210:35;55205:3;55201:45;55194:52;;55090:166;;55265:341;55332:38;55364:5;55332:38;:::i;:::-;55392:1;55406:154;55420:6;55417:1;55414:13;55406:154;;;55494:7;55488:14;55484:1;55479:3;55475:11;55468:35;55544:1;55535:7;55531:15;55520:26;;55442:4;55439:1;55435:12;55430:17;;55406:154;;;55589:6;55584:3;55580:16;55573:23;;55272:334;;55057:549;;54845:767;;54738:874;;;;:::o;55618:214::-;55758:66;55754:1;55746:6;55742:14;55735:90;55618:214;:::o;55838:402::-;55998:3;56019:85;56101:2;56096:3;56019:85;:::i;:::-;56012:92;;56113:93;56202:3;56113:93;:::i;:::-;56231:2;56226:3;56222:12;56215:19;;55838:402;;;:::o;56246:79::-;56285:7;56314:5;56303:16;;56246:79;;;:::o;56331:157::-;56436:45;56456:24;56474:5;56456:24;:::i;:::-;56436:45;:::i;:::-;56431:3;56424:58;56331:157;;:::o;56494:942::-;56853:3;56875:148;57019:3;56875:148;:::i;:::-;56868:155;;57040:92;57128:3;57119:6;57040:92;:::i;:::-;57033:99;;57149:148;57293:3;57149:148;:::i;:::-;57142:155;;57307:75;57378:3;57369:6;57307:75;:::i;:::-;57407:2;57402:3;57398:12;57391:19;;57427:3;57420:10;;56494:942;;;;;:::o;57442:86::-;57477:7;57517:4;57510:5;57506:16;57495:27;;57442:86;;;:::o;57534:112::-;57617:22;57633:5;57617:22;:::i;:::-;57612:3;57605:35;57534:112;;:::o;57652:545::-;57825:4;57863:3;57852:9;57848:19;57840:27;;57877:71;57945:1;57934:9;57930:17;57921:6;57877:71;:::i;:::-;57958:68;58022:2;58011:9;58007:18;57998:6;57958:68;:::i;:::-;58036:72;58104:2;58093:9;58089:18;58080:6;58036:72;:::i;:::-;58118;58186:2;58175:9;58171:18;58162:6;58118:72;:::i;:::-;57652:545;;;;;;;:::o;58203:173::-;58343:25;58339:1;58331:6;58327:14;58320:49;58203:173;:::o;58382:402::-;58542:3;58563:85;58645:2;58640:3;58563:85;:::i;:::-;58556:92;;58657:93;58746:3;58657:93;:::i;:::-;58775:2;58770:3;58766:12;58759:19;;58382:402;;;:::o;58790:167::-;58930:19;58926:1;58918:6;58914:14;58907:43;58790:167;:::o;58963:402::-;59123:3;59144:85;59226:2;59221:3;59144:85;:::i;:::-;59137:92;;59238:93;59327:3;59238:93;:::i;:::-;59356:2;59351:3;59347:12;59340:19;;58963:402;;;:::o;59371:967::-;59753:3;59775:148;59919:3;59775:148;:::i;:::-;59768:155;;59940:95;60031:3;60022:6;59940:95;:::i;:::-;59933:102;;60052:148;60196:3;60052:148;:::i;:::-;60045:155;;60217:95;60308:3;60299:6;60217:95;:::i;:::-;60210:102;;60329:3;60322:10;;59371:967;;;;;:::o;60344:168::-;60427:11;60461:6;60456:3;60449:19;60501:4;60496:3;60492:14;60477:29;;60344:168;;;;:::o;60518:373::-;60604:3;60632:38;60664:5;60632:38;:::i;:::-;60686:70;60749:6;60744:3;60686:70;:::i;:::-;60679:77;;60765:65;60823:6;60818:3;60811:4;60804:5;60800:16;60765:65;:::i;:::-;60855:29;60877:6;60855:29;:::i;:::-;60850:3;60846:39;60839:46;;60608:283;60518:373;;;;:::o;60897:640::-;61092:4;61130:3;61119:9;61115:19;61107:27;;61144:71;61212:1;61201:9;61197:17;61188:6;61144:71;:::i;:::-;61225:72;61293:2;61282:9;61278:18;61269:6;61225:72;:::i;:::-;61307;61375:2;61364:9;61360:18;61351:6;61307:72;:::i;:::-;61426:9;61420:4;61416:20;61411:2;61400:9;61396:18;61389:48;61454:76;61525:4;61516:6;61454:76;:::i;:::-;61446:84;;60897:640;;;;;;;:::o;61543:141::-;61599:5;61630:6;61624:13;61615:22;;61646:32;61672:5;61646:32;:::i;:::-;61543:141;;;;:::o;61690:349::-;61759:6;61808:2;61796:9;61787:7;61783:23;61779:32;61776:119;;;61814:79;;:::i;:::-;61776:119;61934:1;61959:63;62014:7;62005:6;61994:9;61990:22;61959:63;:::i;:::-;61949:73;;61905:127;61690:349;;;;:::o;62045:174::-;62185:26;62181:1;62173:6;62169:14;62162:50;62045:174;:::o;62225:366::-;62367:3;62388:67;62452:2;62447:3;62388:67;:::i;:::-;62381:74;;62464:93;62553:3;62464:93;:::i;:::-;62582:2;62577:3;62573:12;62566:19;;62225:366;;;:::o;62597:419::-;62763:4;62801:2;62790:9;62786:18;62778:26;;62850:9;62844:4;62840:20;62836:1;62825:9;62821:17;62814:47;62878:131;63004:4;62878:131;:::i;:::-;62870:139;;62597:419;;;:::o;63022:240::-;63162:34;63158:1;63150:6;63146:14;63139:58;63231:23;63226:2;63218:6;63214:15;63207:48;63022:240;:::o;63268:366::-;63410:3;63431:67;63495:2;63490:3;63431:67;:::i;:::-;63424:74;;63507:93;63596:3;63507:93;:::i;:::-;63625:2;63620:3;63616:12;63609:19;;63268:366;;;:::o;63640:419::-;63806:4;63844:2;63833:9;63829:18;63821:26;;63893:9;63887:4;63883:20;63879:1;63868:9;63864:17;63857:47;63921:131;64047:4;63921:131;:::i;:::-;63913:139;;63640:419;;;:::o;64065:182::-;64205:34;64201:1;64193:6;64189:14;64182:58;64065:182;:::o;64253:366::-;64395:3;64416:67;64480:2;64475:3;64416:67;:::i;:::-;64409:74;;64492:93;64581:3;64492:93;:::i;:::-;64610:2;64605:3;64601:12;64594:19;;64253:366;;;:::o;64625:419::-;64791:4;64829:2;64818:9;64814:18;64806:26;;64878:9;64872:4;64868:20;64864:1;64853:9;64849:17;64842:47;64906:131;65032:4;64906:131;:::i;:::-;64898:139;;64625:419;;;:::o;65050:178::-;65190:30;65186:1;65178:6;65174:14;65167:54;65050:178;:::o;65234:366::-;65376:3;65397:67;65461:2;65456:3;65397:67;:::i;:::-;65390:74;;65473:93;65562:3;65473:93;:::i;:::-;65591:2;65586:3;65582:12;65575:19;;65234:366;;;:::o;65606:419::-;65772:4;65810:2;65799:9;65795:18;65787:26;;65859:9;65853:4;65849:20;65845:1;65834:9;65830:17;65823:47;65887:131;66013:4;65887:131;:::i;:::-;65879:139;;65606:419;;;:::o;66031:194::-;66071:4;66091:20;66109:1;66091:20;:::i;:::-;66086:25;;66125:20;66143:1;66125:20;:::i;:::-;66120:25;;66169:1;66166;66162:9;66154:17;;66193:1;66187:4;66184:11;66181:37;;;66198:18;;:::i;:::-;66181:37;66031:194;;;;:::o;66231:180::-;66279:77;66276:1;66269:88;66376:4;66373:1;66366:15;66400:4;66397:1;66390:15

Swarm Source

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