Token

JointPacks (Packs)

Overview

Max Total Supply

1,082 Packs

Holders

388

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-
Balance
1 Packs
0x23c4a20c524e9210164aa418866e4717b18215e9
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
JointPacks

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at SonicScan.org on 2025-01-03
*/

// SPDX-License-Identifier: MIT

// File: @openzeppelin/[email protected]/security/ReentrancyGuard.sol


// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

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

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

// File: jevents.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/[email protected]/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.9.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/[email protected]/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/[email protected]/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/[email protected]/utils/Address.sol


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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     *
     * Furthermore, `isContract` will also return true if the target contract within
     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
     * which only has an effect at the end of a transaction.
     * ====
     *
     * [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://consensys.net/diligence/blog/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.8.0/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/[email protected]/utils/Context.sol


// OpenZeppelin Contracts (last updated v4.9.4) (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;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// File: @openzeppelin/[email protected]/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.9.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) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, "Math: mulDiv overflow");

            ///////////////////////////////////////////////
            // 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 256, 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 << 3) < value ? 1 : 0);
        }
    }
}

// File: @openzeppelin/[email protected]/utils/math/SignedMath.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Standard signed math utilities missing in the Solidity language.
 */
library SignedMath {
    /**
     * @dev Returns the largest of two signed numbers.
     */
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }

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

    /**
     * @dev Returns the average of two signed numbers without overflow.
     * The result is rounded towards zero.
     */
    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    /**
     * @dev Returns the absolute unsigned value of a signed value.
     */
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            // must be unchecked in order to support `n = type(int256).min`
            return uint256(n >= 0 ? n : -n);
        }
    }
}

// File: @openzeppelin/[email protected]/utils/Strings.sol


// OpenZeppelin Contracts (last updated v4.9.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 `int256` to its ASCII `string` decimal representation.
     */
    function toString(int256 value) internal pure returns (string memory) {
        return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value))));
    }

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

    /**
     * @dev Returns true if the two strings are equal.
     */
    function equal(string memory a, string memory b) internal pure returns (bool) {
        return keccak256(bytes(a)) == keccak256(bytes(b));
    }
}

// File: @openzeppelin/[email protected]/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/[email protected]/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.9.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 {}

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

    /**
     * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
     *
     * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant
     * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such
     * that `ownerOf(tokenId)` is `a`.
     */
    // solhint-disable-next-line func-name-mixedcase
    function __unsafe_increaseBalance(address account, uint256 amount) internal {
        _balances[account] += amount;
    }
}

// File: @openzeppelin/[email protected]/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.9.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/[email protected]/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.9.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. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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/[email protected]/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/[email protected]/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: contracts/JointPacks.sol

pragma solidity ^0.8.0;

contract JointPacks is ERC721Enumerable, Ownable, ReentrancyGuard {
    using Strings for uint256;

    // Contract variables
    string public baseURI;
    string public baseExtension = ".json";
    uint256 public cost = 0.01 ether;
    uint256 public maxSupply = 100000;
    uint8 public maxMintAmount = 100;
    uint16 public nftPerAddressLimit = 1000;
    bool public paused = false;

    mapping(address => uint256) private addressMintedBalance;

    IERC20 public rewardToken;

    uint256 private nextTokenId = 1;

    // Events
    event LootBoxOpened(address indexed user, uint256 indexed tokenId, uint256 randomValue);
    event RewardClaimed(address indexed user, uint256 amount, uint256 indexed tokenId);

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _initBaseURI,
        address _rewardToken
    ) ERC721(_name, _symbol) {
        setBaseURI(_initBaseURI);
        rewardToken = IERC20(_rewardToken);
    }

    // Internal function to return base URI
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    // Public mint function
    function mint(uint256 _mintAmount) public payable {
        require(!paused, "Paused");
        require(_mintAmount > 0 && _mintAmount <= maxMintAmount, "Invalid mint amount");
        require(nextTokenId + _mintAmount - 1 <= maxSupply, "Max supply reached");

        if (msg.sender != owner()) {
            uint256 ownerMintedCount = addressMintedBalance[msg.sender];
            require(ownerMintedCount + _mintAmount <= nftPerAddressLimit, "Limit exceeded");
            require(msg.value >= cost * _mintAmount, "Insufficient funds");
        }

        for (uint256 i = 0; i < _mintAmount; i++) {
            addressMintedBalance[msg.sender]++;
            _safeMint(msg.sender, nextTokenId++);
        }
    }

    // Function to open a loot box
    function openLootBox(uint256 tokenId) public nonReentrant {
        require(ownerOf(tokenId) == msg.sender, "Not owner");

        // Generate randomness using block data and user input
        uint256 randomValue = uint256(
            keccak256(
                abi.encodePacked(block.number, block.timestamp, blockhash(block.number - 1), msg.sender, tokenId)
            )
        ) % 100;

        uint256 rewardAmount = calculateReward(randomValue);

        uint256 contractBalance = rewardToken.balanceOf(address(this));
        if (rewardAmount > contractBalance) {
            rewardAmount = contractBalance;
        }

        rewardToken.transfer(msg.sender, rewardAmount);
        _burn(tokenId);

        emit LootBoxOpened(msg.sender, tokenId, randomValue);
        emit RewardClaimed(msg.sender, rewardAmount, tokenId);
    }

    // Function to calculate the reward based on randomness
    function calculateReward(uint256 rand) private pure returns (uint256) {
        if (rand < 25) {                   // rand 0-24 (25%)
            return 20000e18;              // 20,000 tokens
        } else if (rand < 55) {            // rand 25-54 (30%)
            return 42000e18;              // 42,000 tokens
        } else if (rand < 80) {            // rand 55-79 (25%)
            return 100000e18;             // 100,000 tokens
        } else if (rand < 95) {            // rand 80-94 (15%)
            return 150000e18;             // 150,000 tokens
        } else if (rand < 98) {            // rand 95-97 (3%)
            return 250000e18;             // 250,000 tokens
        } else if (rand == 98) {           // rand 98 (1%)
            return 420000e18;             // 420,000 tokens 
        } else {                           // rand 99 (1%)
            return 1000000e18;           // 1,000,000 tokens
        }
    }

    // Function to return the token URI
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

    // Only owner functions
    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
        baseExtension = _newBaseExtension;
    }

    function setCost(uint256 _newCost) external onlyOwner {
        cost = _newCost;
    }

    function setNftPerAddressLimit(uint16 _limit) external onlyOwner {
        nftPerAddressLimit = _limit;
    }

    function pause(bool _state) external onlyOwner {
        paused = _state;
    }

    // Function to withdraw reward tokens
    function withdrawTokens() external onlyOwner {
        uint256 balance = rewardToken.balanceOf(address(this));
        require(balance > 0, "No tokens to withdraw");
        rewardToken.transfer(owner(), balance);
    }

    // Function to withdraw Ether
    function withdraw() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"address","name":"_rewardToken","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":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"randomValue","type":"uint256"}],"name":"LootBoxOpened","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"RewardClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"openLootBox","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_limit","type":"uint16"}],"name":"setNftPerAddressLimit","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":[],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d90816200004a9190620005bf565b50662386f26fc10000600e55620186a0600f556064601060006101000a81548160ff021916908360ff1602179055506103e8601060016101000a81548161ffff021916908361ffff1602179055506000601060036101000a81548160ff0219169083151502179055506001601355348015620000c557600080fd5b5060405162005822380380620058228339818101604052810190620000eb91906200086f565b83838160009081620000fe9190620005bf565b508060019081620001109190620005bf565b50505062000133620001276200019760201b60201c565b6200019f60201b60201c565b6001600b819055506200014c826200026560201b60201c565b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050620009c1565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002756200028a60201b60201c565b80600c9081620002869190620005bf565b5050565b6200029a6200019760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002c06200031b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000319576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000310906200099f565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003c757607f821691505b602082108103620003dd57620003dc6200037f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004477fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000408565b62000453868362000408565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004a06200049a62000494846200046b565b62000475565b6200046b565b9050919050565b6000819050919050565b620004bc836200047f565b620004d4620004cb82620004a7565b84845462000415565b825550505050565b600090565b620004eb620004dc565b620004f8818484620004b1565b505050565b5b81811015620005205762000514600082620004e1565b600181019050620004fe565b5050565b601f8211156200056f576200053981620003e3565b6200054484620003f8565b8101602085101562000554578190505b6200056c6200056385620003f8565b830182620004fd565b50505b505050565b600082821c905092915050565b6000620005946000198460080262000574565b1980831691505092915050565b6000620005af838362000581565b9150826002028217905092915050565b620005ca8262000345565b67ffffffffffffffff811115620005e657620005e562000350565b5b620005f28254620003ae565b620005ff82828562000524565b600060209050601f83116001811462000637576000841562000622578287015190505b6200062e8582620005a1565b8655506200069e565b601f1984166200064786620003e3565b60005b8281101562000671578489015182556001820191506020850194506020810190506200064a565b868310156200069157848901516200068d601f89168262000581565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b620006e082620006c4565b810181811067ffffffffffffffff8211171562000702576200070162000350565b5b80604052505050565b600062000717620006a6565b9050620007258282620006d5565b919050565b600067ffffffffffffffff82111562000748576200074762000350565b5b6200075382620006c4565b9050602081019050919050565b60005b838110156200078057808201518184015260208101905062000763565b60008484015250505050565b6000620007a36200079d846200072a565b6200070b565b905082815260208101848484011115620007c257620007c1620006bf565b5b620007cf84828562000760565b509392505050565b600082601f830112620007ef57620007ee620006ba565b5b8151620008018482602086016200078c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000837826200080a565b9050919050565b62000849816200082a565b81146200085557600080fd5b50565b60008151905062000869816200083e565b92915050565b600080600080608085870312156200088c576200088b620006b0565b5b600085015167ffffffffffffffff811115620008ad57620008ac620006b5565b5b620008bb87828801620007d7565b945050602085015167ffffffffffffffff811115620008df57620008de620006b5565b5b620008ed87828801620007d7565b935050604085015167ffffffffffffffff811115620009115762000910620006b5565b5b6200091f87828801620007d7565b9250506060620009328782880162000858565b91505092959194509250565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620009876020836200093e565b915062000994826200094f565b602082019050919050565b60006020820190508181036000830152620009ba8162000978565b9050919050565b614e5180620009d16000396000f3fe60806040526004361061020f5760003560e01c80636c0360eb11610118578063b88d4fde116100a0578063d5abeb011161006f578063d5abeb0114610768578063da3ef23f14610793578063e985e9c5146107bc578063f2fde38b146107f9578063f7c618c1146108225761020f565b8063b88d4fde146106ac578063ba7d2c76146106d5578063c668286214610700578063c87b56dd1461072b5761020f565b80638da5cb5b116100e75780638da5cb5b146105e857806395d89b4114610613578063a0712d681461063e578063a22cb4651461065a578063b3fa6979146106835761020f565b80636c0360eb1461055257806370a082311461057d578063715018a6146105ba5780638d8f2adb146105d15761020f565b80632f745c591161019b5780634f6ccce71161016a5780634f6ccce71461045b57806355a02c2d1461049857806355f804b3146104c15780635c975abb146104ea5780636352211e146105155761020f565b80632f745c59146103b55780633ccfd60b146103f257806342842e0e1461040957806344a0d68a146104325761020f565b8063095ea7b3116101e2578063095ea7b3146102e257806313faede61461030b57806318160ddd14610336578063239c70ae1461036157806323b872dd1461038c5761020f565b806301ffc9a71461021457806302329a291461025157806306fdde031461027a578063081812fc146102a5575b600080fd5b34801561022057600080fd5b5061023b600480360381019061023691906131fa565b61084d565b6040516102489190613242565b60405180910390f35b34801561025d57600080fd5b5061027860048036038101906102739190613289565b6108c7565b005b34801561028657600080fd5b5061028f6108ec565b60405161029c9190613346565b60405180910390f35b3480156102b157600080fd5b506102cc60048036038101906102c7919061339e565b61097e565b6040516102d9919061340c565b60405180910390f35b3480156102ee57600080fd5b5061030960048036038101906103049190613453565b6109c4565b005b34801561031757600080fd5b50610320610adb565b60405161032d91906134a2565b60405180910390f35b34801561034257600080fd5b5061034b610ae1565b60405161035891906134a2565b60405180910390f35b34801561036d57600080fd5b50610376610aee565b60405161038391906134d9565b60405180910390f35b34801561039857600080fd5b506103b360048036038101906103ae91906134f4565b610b01565b005b3480156103c157600080fd5b506103dc60048036038101906103d79190613453565b610b61565b6040516103e991906134a2565b60405180910390f35b3480156103fe57600080fd5b50610407610c06565b005b34801561041557600080fd5b50610430600480360381019061042b91906134f4565b610c5e565b005b34801561043e57600080fd5b506104596004803603810190610454919061339e565b610c7e565b005b34801561046757600080fd5b50610482600480360381019061047d919061339e565b610c90565b60405161048f91906134a2565b60405180910390f35b3480156104a457600080fd5b506104bf60048036038101906104ba919061339e565b610d01565b005b3480156104cd57600080fd5b506104e860048036038101906104e3919061367c565b610fdd565b005b3480156104f657600080fd5b506104ff610ff8565b60405161050c9190613242565b60405180910390f35b34801561052157600080fd5b5061053c6004803603810190610537919061339e565b61100b565b604051610549919061340c565b60405180910390f35b34801561055e57600080fd5b50610567611091565b6040516105749190613346565b60405180910390f35b34801561058957600080fd5b506105a4600480360381019061059f91906136c5565b61111f565b6040516105b191906134a2565b60405180910390f35b3480156105c657600080fd5b506105cf6111d6565b005b3480156105dd57600080fd5b506105e66111ea565b005b3480156105f457600080fd5b506105fd611380565b60405161060a919061340c565b60405180910390f35b34801561061f57600080fd5b506106286113aa565b6040516106359190613346565b60405180910390f35b6106586004803603810190610653919061339e565b61143c565b005b34801561066657600080fd5b50610681600480360381019061067c91906136f2565b611714565b005b34801561068f57600080fd5b506106aa60048036038101906106a5919061376c565b61172a565b005b3480156106b857600080fd5b506106d360048036038101906106ce919061383a565b611752565b005b3480156106e157600080fd5b506106ea6117b4565b6040516106f791906138cc565b60405180910390f35b34801561070c57600080fd5b506107156117c8565b6040516107229190613346565b60405180910390f35b34801561073757600080fd5b50610752600480360381019061074d919061339e565b611856565b60405161075f9190613346565b60405180910390f35b34801561077457600080fd5b5061077d611900565b60405161078a91906134a2565b60405180910390f35b34801561079f57600080fd5b506107ba60048036038101906107b5919061367c565b611906565b005b3480156107c857600080fd5b506107e360048036038101906107de91906138e7565b611921565b6040516107f09190613242565b60405180910390f35b34801561080557600080fd5b50610820600480360381019061081b91906136c5565b6119b5565b005b34801561082e57600080fd5b50610837611a38565b6040516108449190613986565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108c057506108bf82611a5e565b5b9050919050565b6108cf611b40565b80601060036101000a81548160ff02191690831515021790555050565b6060600080546108fb906139d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610927906139d0565b80156109745780601f1061094957610100808354040283529160200191610974565b820191906000526020600020905b81548152906001019060200180831161095757829003601f168201915b5050505050905090565b600061098982611bbe565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109cf8261100b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3690613a73565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a5e611c09565b73ffffffffffffffffffffffffffffffffffffffff161480610a8d5750610a8c81610a87611c09565b611921565b5b610acc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac390613b05565b60405180910390fd5b610ad68383611c11565b505050565b600e5481565b6000600880549050905090565b601060009054906101000a900460ff1681565b610b12610b0c611c09565b82611cca565b610b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4890613b97565b60405180910390fd5b610b5c838383611d5f565b505050565b6000610b6c8361111f565b8210610bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba490613c29565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c0e611b40565b610c16611380565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610c5b573d6000803e3d6000fd5b50565b610c7983838360405180602001604052806000815250611752565b505050565b610c86611b40565b80600e8190555050565b6000610c9a610ae1565b8210610cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd290613cbb565b60405180910390fd5b60088281548110610cef57610cee613cdb565b5b90600052602060002001549050919050565b610d09612058565b3373ffffffffffffffffffffffffffffffffffffffff16610d298261100b565b73ffffffffffffffffffffffffffffffffffffffff1614610d7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7690613d56565b60405180910390fd5b600060644342600143610d929190613da5565b403386604051602001610da9959493929190613e6d565b6040516020818303038152906040528051906020012060001c610dcc9190613efb565b90506000610dd9826120a7565b90506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e38919061340c565b602060405180830381865afa158015610e55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e799190613f41565b905080821115610e87578091505b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401610ee4929190613f6e565b6020604051808303816000875af1158015610f03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f279190613fac565b50610f318461215d565b833373ffffffffffffffffffffffffffffffffffffffff167ffae87b2acfbc83e493c8f553212d10ea70b7b18404ea413993407942efcdc90785604051610f7891906134a2565b60405180910390a3833373ffffffffffffffffffffffffffffffffffffffff167ff01da32686223933d8a18a391060918c7f11a3648639edd87ae013e2e273174384604051610fc791906134a2565b60405180910390a3505050610fda6122ab565b50565b610fe5611b40565b80600c9081610ff4919061417b565b5050565b601060039054906101000a900460ff1681565b600080611017836122b5565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107f90614299565b60405180910390fd5b80915050919050565b600c805461109e906139d0565b80601f01602080910402602001604051908101604052809291908181526020018280546110ca906139d0565b80156111175780601f106110ec57610100808354040283529160200191611117565b820191906000526020600020905b8154815290600101906020018083116110fa57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361118f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111869061432b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111de611b40565b6111e860006122f2565b565b6111f2611b40565b6000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161124f919061340c565b602060405180830381865afa15801561126c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112909190613f41565b9050600081116112d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cc90614397565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61131b611380565b836040518363ffffffff1660e01b8152600401611339929190613f6e565b6020604051808303816000875af1158015611358573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137c9190613fac565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546113b9906139d0565b80601f01602080910402602001604051908101604052809291908181526020018280546113e5906139d0565b80156114325780601f1061140757610100808354040283529160200191611432565b820191906000526020600020905b81548152906001019060200180831161141557829003601f168201915b5050505050905090565b601060039054906101000a900460ff161561148c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148390614403565b60405180910390fd5b6000811180156114ae5750601060009054906101000a900460ff1660ff168111155b6114ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e49061446f565b60405180910390fd5b600f54600182601354611500919061448f565b61150a9190613da5565b111561154b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115429061450f565b60405180910390fd5b611553611380565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461167d576000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050601060019054906101000a900461ffff1661ffff1682826115ea919061448f565b111561162b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116229061457b565b60405180910390fd5b81600e54611639919061459b565b34101561167b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167290614629565b60405180910390fd5b505b60005b8181101561171057601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906116d890614649565b91905055506116fd33601360008154809291906116f490614649565b919050556123b8565b808061170890614649565b915050611680565b5050565b61172661171f611c09565b83836123d6565b5050565b611732611b40565b80601060016101000a81548161ffff021916908361ffff16021790555050565b61176361175d611c09565b83611cca565b6117a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179990613b97565b60405180910390fd5b6117ae84848484612542565b50505050565b601060019054906101000a900461ffff1681565b600d80546117d5906139d0565b80601f0160208091040260200160405190810160405280929190818152602001828054611801906139d0565b801561184e5780601f106118235761010080835404028352916020019161184e565b820191906000526020600020905b81548152906001019060200180831161183157829003601f168201915b505050505081565b60606118618261259e565b6118a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189790614703565b60405180910390fd5b60006118aa6125df565b905060008151116118ca57604051806020016040528060008152506118f8565b806118d484612671565b600d6040516020016118e8939291906147e2565b6040516020818303038152906040525b915050919050565b600f5481565b61190e611b40565b80600d908161191d919061417b565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6119bd611b40565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2390614885565b60405180910390fd5b611a35816122f2565b50565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b2957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611b395750611b388261273f565b5b9050919050565b611b48611c09565b73ffffffffffffffffffffffffffffffffffffffff16611b66611380565b73ffffffffffffffffffffffffffffffffffffffff1614611bbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb3906148f1565b60405180910390fd5b565b611bc78161259e565b611c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfd90614299565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611c848361100b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611cd68361100b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d185750611d178185611921565b5b80611d5657508373ffffffffffffffffffffffffffffffffffffffff16611d3e8461097e565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d7f8261100b565b73ffffffffffffffffffffffffffffffffffffffff1614611dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcc90614983565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3b90614a15565b60405180910390fd5b611e5183838360016127a9565b8273ffffffffffffffffffffffffffffffffffffffff16611e718261100b565b73ffffffffffffffffffffffffffffffffffffffff1614611ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebe90614983565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120538383836001612907565b505050565b6002600b540361209d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209490614a81565b60405180910390fd5b6002600b81905550565b600060198210156120c45769043c33c19375648000009050612158565b60378210156120df576908e4d3168276864000009050612158565b60508210156120fa5769152d02c7e14af68000009050612158565b605f82101561211557691fc3842bd1f071c000009050612158565b6062821015612130576934f086f3b33b684000009050612158565b6062820361214a576958f03ee118a13e8000009050612158565b69d3c21bcecceda100000090505b919050565b60006121688261100b565b90506121788160008460016127a9565b6121818261100b565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122a7816000846001612907565b5050565b6001600b81905550565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123d282826040518060200160405280600081525061290d565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243b90614aed565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125359190613242565b60405180910390a3505050565b61254d848484611d5f565b61255984848484612968565b612598576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258f90614b7f565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166125c0836122b5565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600c80546125ee906139d0565b80601f016020809104026020016040519081016040528092919081815260200182805461261a906139d0565b80156126675780601f1061263c57610100808354040283529160200191612667565b820191906000526020600020905b81548152906001019060200180831161264a57829003601f168201915b5050505050905090565b60606000600161268084612aef565b01905060008167ffffffffffffffff81111561269f5761269e613551565b5b6040519080825280601f01601f1916602001820160405280156126d15781602001600182028036833780820191505090505b509050600082602001820190505b600115612734578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161272857612727613ecc565b5b049450600085036126df575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6127b584848484612c42565b60018111156127f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f090614c11565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036128405761283b81612c48565b61287f565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461287e5761287d8582612c91565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036128c1576128bc81612dfe565b612900565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146128ff576128fe8482612ecf565b5b5b5050505050565b50505050565b6129178383612f4e565b6129246000848484612968565b612963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295a90614b7f565b60405180910390fd5b505050565b60006129898473ffffffffffffffffffffffffffffffffffffffff1661316b565b15612ae2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129b2611c09565b8786866040518563ffffffff1660e01b81526004016129d49493929190614c86565b6020604051808303816000875af1925050508015612a1057506040513d601f19601f82011682018060405250810190612a0d9190614ce7565b60015b612a92573d8060008114612a40576040519150601f19603f3d011682016040523d82523d6000602084013e612a45565b606091505b506000815103612a8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8190614b7f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ae7565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612b4d577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612b4357612b42613ecc565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612b8a576d04ee2d6d415b85acef81000000008381612b8057612b7f613ecc565b5b0492506020810190505b662386f26fc100008310612bb957662386f26fc100008381612baf57612bae613ecc565b5b0492506010810190505b6305f5e1008310612be2576305f5e1008381612bd857612bd7613ecc565b5b0492506008810190505b6127108310612c07576127108381612bfd57612bfc613ecc565b5b0492506004810190505b60648310612c2a5760648381612c2057612c1f613ecc565b5b0492506002810190505b600a8310612c39576001810190505b80915050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c9e8461111f565b612ca89190613da5565b9050600060076000848152602001908152602001600020549050818114612d8d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612e129190613da5565b9050600060096000848152602001908152602001600020549050600060088381548110612e4257612e41613cdb565b5b906000526020600020015490508060088381548110612e6457612e63613cdb565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612eb357612eb2614d14565b5b6001900381819060005260206000200160009055905550505050565b6000612eda8361111f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb490614d8f565b60405180910390fd5b612fc68161259e565b15613006576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ffd90614dfb565b60405180910390fd5b6130146000838360016127a9565b61301d8161259e565b1561305d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305490614dfb565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613167600083836001612907565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131d7816131a2565b81146131e257600080fd5b50565b6000813590506131f4816131ce565b92915050565b6000602082840312156132105761320f613198565b5b600061321e848285016131e5565b91505092915050565b60008115159050919050565b61323c81613227565b82525050565b60006020820190506132576000830184613233565b92915050565b61326681613227565b811461327157600080fd5b50565b6000813590506132838161325d565b92915050565b60006020828403121561329f5761329e613198565b5b60006132ad84828501613274565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156132f05780820151818401526020810190506132d5565b60008484015250505050565b6000601f19601f8301169050919050565b6000613318826132b6565b61332281856132c1565b93506133328185602086016132d2565b61333b816132fc565b840191505092915050565b60006020820190508181036000830152613360818461330d565b905092915050565b6000819050919050565b61337b81613368565b811461338657600080fd5b50565b60008135905061339881613372565b92915050565b6000602082840312156133b4576133b3613198565b5b60006133c284828501613389565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133f6826133cb565b9050919050565b613406816133eb565b82525050565b600060208201905061342160008301846133fd565b92915050565b613430816133eb565b811461343b57600080fd5b50565b60008135905061344d81613427565b92915050565b6000806040838503121561346a57613469613198565b5b60006134788582860161343e565b925050602061348985828601613389565b9150509250929050565b61349c81613368565b82525050565b60006020820190506134b76000830184613493565b92915050565b600060ff82169050919050565b6134d3816134bd565b82525050565b60006020820190506134ee60008301846134ca565b92915050565b60008060006060848603121561350d5761350c613198565b5b600061351b8682870161343e565b935050602061352c8682870161343e565b925050604061353d86828701613389565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613589826132fc565b810181811067ffffffffffffffff821117156135a8576135a7613551565b5b80604052505050565b60006135bb61318e565b90506135c78282613580565b919050565b600067ffffffffffffffff8211156135e7576135e6613551565b5b6135f0826132fc565b9050602081019050919050565b82818337600083830152505050565b600061361f61361a846135cc565b6135b1565b90508281526020810184848401111561363b5761363a61354c565b5b6136468482856135fd565b509392505050565b600082601f83011261366357613662613547565b5b813561367384826020860161360c565b91505092915050565b60006020828403121561369257613691613198565b5b600082013567ffffffffffffffff8111156136b0576136af61319d565b5b6136bc8482850161364e565b91505092915050565b6000602082840312156136db576136da613198565b5b60006136e98482850161343e565b91505092915050565b6000806040838503121561370957613708613198565b5b60006137178582860161343e565b925050602061372885828601613274565b9150509250929050565b600061ffff82169050919050565b61374981613732565b811461375457600080fd5b50565b60008135905061376681613740565b92915050565b60006020828403121561378257613781613198565b5b600061379084828501613757565b91505092915050565b600067ffffffffffffffff8211156137b4576137b3613551565b5b6137bd826132fc565b9050602081019050919050565b60006137dd6137d884613799565b6135b1565b9050828152602081018484840111156137f9576137f861354c565b5b6138048482856135fd565b509392505050565b600082601f83011261382157613820613547565b5b81356138318482602086016137ca565b91505092915050565b6000806000806080858703121561385457613853613198565b5b60006138628782880161343e565b94505060206138738782880161343e565b935050604061388487828801613389565b925050606085013567ffffffffffffffff8111156138a5576138a461319d565b5b6138b18782880161380c565b91505092959194509250565b6138c681613732565b82525050565b60006020820190506138e160008301846138bd565b92915050565b600080604083850312156138fe576138fd613198565b5b600061390c8582860161343e565b925050602061391d8582860161343e565b9150509250929050565b6000819050919050565b600061394c613947613942846133cb565b613927565b6133cb565b9050919050565b600061395e82613931565b9050919050565b600061397082613953565b9050919050565b61398081613965565b82525050565b600060208201905061399b6000830184613977565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806139e857607f821691505b6020821081036139fb576139fa6139a1565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a5d6021836132c1565b9150613a6882613a01565b604082019050919050565b60006020820190508181036000830152613a8c81613a50565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613aef603d836132c1565b9150613afa82613a93565b604082019050919050565b60006020820190508181036000830152613b1e81613ae2565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613b81602d836132c1565b9150613b8c82613b25565b604082019050919050565b60006020820190508181036000830152613bb081613b74565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613c13602b836132c1565b9150613c1e82613bb7565b604082019050919050565b60006020820190508181036000830152613c4281613c06565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613ca5602c836132c1565b9150613cb082613c49565b604082019050919050565b60006020820190508181036000830152613cd481613c98565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e6f74206f776e65720000000000000000000000000000000000000000000000600082015250565b6000613d406009836132c1565b9150613d4b82613d0a565b602082019050919050565b60006020820190508181036000830152613d6f81613d33565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613db082613368565b9150613dbb83613368565b9250828203905081811115613dd357613dd2613d76565b5b92915050565b6000819050919050565b613df4613def82613368565b613dd9565b82525050565b6000819050919050565b6000819050919050565b613e1f613e1a82613dfa565b613e04565b82525050565b60008160601b9050919050565b6000613e3d82613e25565b9050919050565b6000613e4f82613e32565b9050919050565b613e67613e62826133eb565b613e44565b82525050565b6000613e798288613de3565b602082019150613e898287613de3565b602082019150613e998286613e0e565b602082019150613ea98285613e56565b601482019150613eb98284613de3565b6020820191508190509695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613f0682613368565b9150613f1183613368565b925082613f2157613f20613ecc565b5b828206905092915050565b600081519050613f3b81613372565b92915050565b600060208284031215613f5757613f56613198565b5b6000613f6584828501613f2c565b91505092915050565b6000604082019050613f8360008301856133fd565b613f906020830184613493565b9392505050565b600081519050613fa68161325d565b92915050565b600060208284031215613fc257613fc1613198565b5b6000613fd084828501613f97565b91505092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261403b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613ffe565b6140458683613ffe565b95508019841693508086168417925050509392505050565b600061407861407361406e84613368565b613927565b613368565b9050919050565b6000819050919050565b6140928361405d565b6140a661409e8261407f565b84845461400b565b825550505050565b600090565b6140bb6140ae565b6140c6818484614089565b505050565b5b818110156140ea576140df6000826140b3565b6001810190506140cc565b5050565b601f82111561412f5761410081613fd9565b61410984613fee565b81016020851015614118578190505b61412c61412485613fee565b8301826140cb565b50505b505050565b600082821c905092915050565b600061415260001984600802614134565b1980831691505092915050565b600061416b8383614141565b9150826002028217905092915050565b614184826132b6565b67ffffffffffffffff81111561419d5761419c613551565b5b6141a782546139d0565b6141b28282856140ee565b600060209050601f8311600181146141e557600084156141d3578287015190505b6141dd858261415f565b865550614245565b601f1984166141f386613fd9565b60005b8281101561421b578489015182556001820191506020850194506020810190506141f6565b868310156142385784890151614234601f891682614141565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006142836018836132c1565b915061428e8261424d565b602082019050919050565b600060208201905081810360008301526142b281614276565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006143156029836132c1565b9150614320826142b9565b604082019050919050565b6000602082019050818103600083015261434481614308565b9050919050565b7f4e6f20746f6b656e7320746f2077697468647261770000000000000000000000600082015250565b60006143816015836132c1565b915061438c8261434b565b602082019050919050565b600060208201905081810360008301526143b081614374565b9050919050565b7f5061757365640000000000000000000000000000000000000000000000000000600082015250565b60006143ed6006836132c1565b91506143f8826143b7565b602082019050919050565b6000602082019050818103600083015261441c816143e0565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7400000000000000000000000000600082015250565b60006144596013836132c1565b915061446482614423565b602082019050919050565b600060208201905081810360008301526144888161444c565b9050919050565b600061449a82613368565b91506144a583613368565b92508282019050808211156144bd576144bc613d76565b5b92915050565b7f4d617820737570706c7920726561636865640000000000000000000000000000600082015250565b60006144f96012836132c1565b9150614504826144c3565b602082019050919050565b60006020820190508181036000830152614528816144ec565b9050919050565b7f4c696d6974206578636565646564000000000000000000000000000000000000600082015250565b6000614565600e836132c1565b91506145708261452f565b602082019050919050565b6000602082019050818103600083015261459481614558565b9050919050565b60006145a682613368565b91506145b183613368565b92508282026145bf81613368565b915082820484148315176145d6576145d5613d76565b5b5092915050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b60006146136012836132c1565b915061461e826145dd565b602082019050919050565b6000602082019050818103600083015261464281614606565b9050919050565b600061465482613368565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361468657614685613d76565b5b600182019050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006146ed602f836132c1565b91506146f882614691565b604082019050919050565b6000602082019050818103600083015261471c816146e0565b9050919050565b600081905092915050565b6000614739826132b6565b6147438185614723565b93506147538185602086016132d2565b80840191505092915050565b6000815461476c816139d0565b6147768186614723565b9450600182166000811461479157600181146147a6576147d9565b60ff19831686528115158202860193506147d9565b6147af85613fd9565b60005b838110156147d1578154818901526001820191506020810190506147b2565b838801955050505b50505092915050565b60006147ee828661472e565b91506147fa828561472e565b9150614806828461475f565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061486f6026836132c1565b915061487a82614813565b604082019050919050565b6000602082019050818103600083015261489e81614862565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006148db6020836132c1565b91506148e6826148a5565b602082019050919050565b6000602082019050818103600083015261490a816148ce565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061496d6025836132c1565b915061497882614911565b604082019050919050565b6000602082019050818103600083015261499c81614960565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006149ff6024836132c1565b9150614a0a826149a3565b604082019050919050565b60006020820190508181036000830152614a2e816149f2565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614a6b601f836132c1565b9150614a7682614a35565b602082019050919050565b60006020820190508181036000830152614a9a81614a5e565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614ad76019836132c1565b9150614ae282614aa1565b602082019050919050565b60006020820190508181036000830152614b0681614aca565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614b696032836132c1565b9150614b7482614b0d565b604082019050919050565b60006020820190508181036000830152614b9881614b5c565b9050919050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000614bfb6035836132c1565b9150614c0682614b9f565b604082019050919050565b60006020820190508181036000830152614c2a81614bee565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614c5882614c31565b614c628185614c3c565b9350614c728185602086016132d2565b614c7b816132fc565b840191505092915050565b6000608082019050614c9b60008301876133fd565b614ca860208301866133fd565b614cb56040830185613493565b8181036060830152614cc78184614c4d565b905095945050505050565b600081519050614ce1816131ce565b92915050565b600060208284031215614cfd57614cfc613198565b5b6000614d0b84828501614cd2565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614d796020836132c1565b9150614d8482614d43565b602082019050919050565b60006020820190508181036000830152614da881614d6c565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614de5601c836132c1565b9150614df082614daf565b602082019050919050565b60006020820190508181036000830152614e1481614dd8565b905091905056fea26469706673582212207aec964f344181b17d8332d642204870defca29c530e6b179212beb364f4355e64736f6c63430008130033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000c046dcb16592fbb3f9fa0c629b8d93090dd4cb76000000000000000000000000000000000000000000000000000000000000000a4a6f696e745061636b730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055061636b730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d544b356b48597a53774875336b5763477059727833524e73476a7879737a787a704c7a744e6d4334566b45432f00000000000000000000

Deployed Bytecode

0x60806040526004361061020f5760003560e01c80636c0360eb11610118578063b88d4fde116100a0578063d5abeb011161006f578063d5abeb0114610768578063da3ef23f14610793578063e985e9c5146107bc578063f2fde38b146107f9578063f7c618c1146108225761020f565b8063b88d4fde146106ac578063ba7d2c76146106d5578063c668286214610700578063c87b56dd1461072b5761020f565b80638da5cb5b116100e75780638da5cb5b146105e857806395d89b4114610613578063a0712d681461063e578063a22cb4651461065a578063b3fa6979146106835761020f565b80636c0360eb1461055257806370a082311461057d578063715018a6146105ba5780638d8f2adb146105d15761020f565b80632f745c591161019b5780634f6ccce71161016a5780634f6ccce71461045b57806355a02c2d1461049857806355f804b3146104c15780635c975abb146104ea5780636352211e146105155761020f565b80632f745c59146103b55780633ccfd60b146103f257806342842e0e1461040957806344a0d68a146104325761020f565b8063095ea7b3116101e2578063095ea7b3146102e257806313faede61461030b57806318160ddd14610336578063239c70ae1461036157806323b872dd1461038c5761020f565b806301ffc9a71461021457806302329a291461025157806306fdde031461027a578063081812fc146102a5575b600080fd5b34801561022057600080fd5b5061023b600480360381019061023691906131fa565b61084d565b6040516102489190613242565b60405180910390f35b34801561025d57600080fd5b5061027860048036038101906102739190613289565b6108c7565b005b34801561028657600080fd5b5061028f6108ec565b60405161029c9190613346565b60405180910390f35b3480156102b157600080fd5b506102cc60048036038101906102c7919061339e565b61097e565b6040516102d9919061340c565b60405180910390f35b3480156102ee57600080fd5b5061030960048036038101906103049190613453565b6109c4565b005b34801561031757600080fd5b50610320610adb565b60405161032d91906134a2565b60405180910390f35b34801561034257600080fd5b5061034b610ae1565b60405161035891906134a2565b60405180910390f35b34801561036d57600080fd5b50610376610aee565b60405161038391906134d9565b60405180910390f35b34801561039857600080fd5b506103b360048036038101906103ae91906134f4565b610b01565b005b3480156103c157600080fd5b506103dc60048036038101906103d79190613453565b610b61565b6040516103e991906134a2565b60405180910390f35b3480156103fe57600080fd5b50610407610c06565b005b34801561041557600080fd5b50610430600480360381019061042b91906134f4565b610c5e565b005b34801561043e57600080fd5b506104596004803603810190610454919061339e565b610c7e565b005b34801561046757600080fd5b50610482600480360381019061047d919061339e565b610c90565b60405161048f91906134a2565b60405180910390f35b3480156104a457600080fd5b506104bf60048036038101906104ba919061339e565b610d01565b005b3480156104cd57600080fd5b506104e860048036038101906104e3919061367c565b610fdd565b005b3480156104f657600080fd5b506104ff610ff8565b60405161050c9190613242565b60405180910390f35b34801561052157600080fd5b5061053c6004803603810190610537919061339e565b61100b565b604051610549919061340c565b60405180910390f35b34801561055e57600080fd5b50610567611091565b6040516105749190613346565b60405180910390f35b34801561058957600080fd5b506105a4600480360381019061059f91906136c5565b61111f565b6040516105b191906134a2565b60405180910390f35b3480156105c657600080fd5b506105cf6111d6565b005b3480156105dd57600080fd5b506105e66111ea565b005b3480156105f457600080fd5b506105fd611380565b60405161060a919061340c565b60405180910390f35b34801561061f57600080fd5b506106286113aa565b6040516106359190613346565b60405180910390f35b6106586004803603810190610653919061339e565b61143c565b005b34801561066657600080fd5b50610681600480360381019061067c91906136f2565b611714565b005b34801561068f57600080fd5b506106aa60048036038101906106a5919061376c565b61172a565b005b3480156106b857600080fd5b506106d360048036038101906106ce919061383a565b611752565b005b3480156106e157600080fd5b506106ea6117b4565b6040516106f791906138cc565b60405180910390f35b34801561070c57600080fd5b506107156117c8565b6040516107229190613346565b60405180910390f35b34801561073757600080fd5b50610752600480360381019061074d919061339e565b611856565b60405161075f9190613346565b60405180910390f35b34801561077457600080fd5b5061077d611900565b60405161078a91906134a2565b60405180910390f35b34801561079f57600080fd5b506107ba60048036038101906107b5919061367c565b611906565b005b3480156107c857600080fd5b506107e360048036038101906107de91906138e7565b611921565b6040516107f09190613242565b60405180910390f35b34801561080557600080fd5b50610820600480360381019061081b91906136c5565b6119b5565b005b34801561082e57600080fd5b50610837611a38565b6040516108449190613986565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108c057506108bf82611a5e565b5b9050919050565b6108cf611b40565b80601060036101000a81548160ff02191690831515021790555050565b6060600080546108fb906139d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610927906139d0565b80156109745780601f1061094957610100808354040283529160200191610974565b820191906000526020600020905b81548152906001019060200180831161095757829003601f168201915b5050505050905090565b600061098982611bbe565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109cf8261100b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3690613a73565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a5e611c09565b73ffffffffffffffffffffffffffffffffffffffff161480610a8d5750610a8c81610a87611c09565b611921565b5b610acc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac390613b05565b60405180910390fd5b610ad68383611c11565b505050565b600e5481565b6000600880549050905090565b601060009054906101000a900460ff1681565b610b12610b0c611c09565b82611cca565b610b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4890613b97565b60405180910390fd5b610b5c838383611d5f565b505050565b6000610b6c8361111f565b8210610bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba490613c29565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c0e611b40565b610c16611380565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610c5b573d6000803e3d6000fd5b50565b610c7983838360405180602001604052806000815250611752565b505050565b610c86611b40565b80600e8190555050565b6000610c9a610ae1565b8210610cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd290613cbb565b60405180910390fd5b60088281548110610cef57610cee613cdb565b5b90600052602060002001549050919050565b610d09612058565b3373ffffffffffffffffffffffffffffffffffffffff16610d298261100b565b73ffffffffffffffffffffffffffffffffffffffff1614610d7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7690613d56565b60405180910390fd5b600060644342600143610d929190613da5565b403386604051602001610da9959493929190613e6d565b6040516020818303038152906040528051906020012060001c610dcc9190613efb565b90506000610dd9826120a7565b90506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e38919061340c565b602060405180830381865afa158015610e55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e799190613f41565b905080821115610e87578091505b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401610ee4929190613f6e565b6020604051808303816000875af1158015610f03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f279190613fac565b50610f318461215d565b833373ffffffffffffffffffffffffffffffffffffffff167ffae87b2acfbc83e493c8f553212d10ea70b7b18404ea413993407942efcdc90785604051610f7891906134a2565b60405180910390a3833373ffffffffffffffffffffffffffffffffffffffff167ff01da32686223933d8a18a391060918c7f11a3648639edd87ae013e2e273174384604051610fc791906134a2565b60405180910390a3505050610fda6122ab565b50565b610fe5611b40565b80600c9081610ff4919061417b565b5050565b601060039054906101000a900460ff1681565b600080611017836122b5565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107f90614299565b60405180910390fd5b80915050919050565b600c805461109e906139d0565b80601f01602080910402602001604051908101604052809291908181526020018280546110ca906139d0565b80156111175780601f106110ec57610100808354040283529160200191611117565b820191906000526020600020905b8154815290600101906020018083116110fa57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361118f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111869061432b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111de611b40565b6111e860006122f2565b565b6111f2611b40565b6000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161124f919061340c565b602060405180830381865afa15801561126c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112909190613f41565b9050600081116112d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cc90614397565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61131b611380565b836040518363ffffffff1660e01b8152600401611339929190613f6e565b6020604051808303816000875af1158015611358573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137c9190613fac565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546113b9906139d0565b80601f01602080910402602001604051908101604052809291908181526020018280546113e5906139d0565b80156114325780601f1061140757610100808354040283529160200191611432565b820191906000526020600020905b81548152906001019060200180831161141557829003601f168201915b5050505050905090565b601060039054906101000a900460ff161561148c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148390614403565b60405180910390fd5b6000811180156114ae5750601060009054906101000a900460ff1660ff168111155b6114ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e49061446f565b60405180910390fd5b600f54600182601354611500919061448f565b61150a9190613da5565b111561154b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115429061450f565b60405180910390fd5b611553611380565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461167d576000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050601060019054906101000a900461ffff1661ffff1682826115ea919061448f565b111561162b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116229061457b565b60405180910390fd5b81600e54611639919061459b565b34101561167b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167290614629565b60405180910390fd5b505b60005b8181101561171057601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906116d890614649565b91905055506116fd33601360008154809291906116f490614649565b919050556123b8565b808061170890614649565b915050611680565b5050565b61172661171f611c09565b83836123d6565b5050565b611732611b40565b80601060016101000a81548161ffff021916908361ffff16021790555050565b61176361175d611c09565b83611cca565b6117a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179990613b97565b60405180910390fd5b6117ae84848484612542565b50505050565b601060019054906101000a900461ffff1681565b600d80546117d5906139d0565b80601f0160208091040260200160405190810160405280929190818152602001828054611801906139d0565b801561184e5780601f106118235761010080835404028352916020019161184e565b820191906000526020600020905b81548152906001019060200180831161183157829003601f168201915b505050505081565b60606118618261259e565b6118a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189790614703565b60405180910390fd5b60006118aa6125df565b905060008151116118ca57604051806020016040528060008152506118f8565b806118d484612671565b600d6040516020016118e8939291906147e2565b6040516020818303038152906040525b915050919050565b600f5481565b61190e611b40565b80600d908161191d919061417b565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6119bd611b40565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2390614885565b60405180910390fd5b611a35816122f2565b50565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b2957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611b395750611b388261273f565b5b9050919050565b611b48611c09565b73ffffffffffffffffffffffffffffffffffffffff16611b66611380565b73ffffffffffffffffffffffffffffffffffffffff1614611bbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb3906148f1565b60405180910390fd5b565b611bc78161259e565b611c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfd90614299565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611c848361100b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611cd68361100b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d185750611d178185611921565b5b80611d5657508373ffffffffffffffffffffffffffffffffffffffff16611d3e8461097e565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d7f8261100b565b73ffffffffffffffffffffffffffffffffffffffff1614611dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcc90614983565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3b90614a15565b60405180910390fd5b611e5183838360016127a9565b8273ffffffffffffffffffffffffffffffffffffffff16611e718261100b565b73ffffffffffffffffffffffffffffffffffffffff1614611ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebe90614983565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120538383836001612907565b505050565b6002600b540361209d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209490614a81565b60405180910390fd5b6002600b81905550565b600060198210156120c45769043c33c19375648000009050612158565b60378210156120df576908e4d3168276864000009050612158565b60508210156120fa5769152d02c7e14af68000009050612158565b605f82101561211557691fc3842bd1f071c000009050612158565b6062821015612130576934f086f3b33b684000009050612158565b6062820361214a576958f03ee118a13e8000009050612158565b69d3c21bcecceda100000090505b919050565b60006121688261100b565b90506121788160008460016127a9565b6121818261100b565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122a7816000846001612907565b5050565b6001600b81905550565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123d282826040518060200160405280600081525061290d565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243b90614aed565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125359190613242565b60405180910390a3505050565b61254d848484611d5f565b61255984848484612968565b612598576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258f90614b7f565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166125c0836122b5565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600c80546125ee906139d0565b80601f016020809104026020016040519081016040528092919081815260200182805461261a906139d0565b80156126675780601f1061263c57610100808354040283529160200191612667565b820191906000526020600020905b81548152906001019060200180831161264a57829003601f168201915b5050505050905090565b60606000600161268084612aef565b01905060008167ffffffffffffffff81111561269f5761269e613551565b5b6040519080825280601f01601f1916602001820160405280156126d15781602001600182028036833780820191505090505b509050600082602001820190505b600115612734578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161272857612727613ecc565b5b049450600085036126df575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6127b584848484612c42565b60018111156127f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f090614c11565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036128405761283b81612c48565b61287f565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461287e5761287d8582612c91565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036128c1576128bc81612dfe565b612900565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146128ff576128fe8482612ecf565b5b5b5050505050565b50505050565b6129178383612f4e565b6129246000848484612968565b612963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295a90614b7f565b60405180910390fd5b505050565b60006129898473ffffffffffffffffffffffffffffffffffffffff1661316b565b15612ae2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129b2611c09565b8786866040518563ffffffff1660e01b81526004016129d49493929190614c86565b6020604051808303816000875af1925050508015612a1057506040513d601f19601f82011682018060405250810190612a0d9190614ce7565b60015b612a92573d8060008114612a40576040519150601f19603f3d011682016040523d82523d6000602084013e612a45565b606091505b506000815103612a8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8190614b7f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ae7565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612b4d577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612b4357612b42613ecc565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612b8a576d04ee2d6d415b85acef81000000008381612b8057612b7f613ecc565b5b0492506020810190505b662386f26fc100008310612bb957662386f26fc100008381612baf57612bae613ecc565b5b0492506010810190505b6305f5e1008310612be2576305f5e1008381612bd857612bd7613ecc565b5b0492506008810190505b6127108310612c07576127108381612bfd57612bfc613ecc565b5b0492506004810190505b60648310612c2a5760648381612c2057612c1f613ecc565b5b0492506002810190505b600a8310612c39576001810190505b80915050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c9e8461111f565b612ca89190613da5565b9050600060076000848152602001908152602001600020549050818114612d8d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612e129190613da5565b9050600060096000848152602001908152602001600020549050600060088381548110612e4257612e41613cdb565b5b906000526020600020015490508060088381548110612e6457612e63613cdb565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612eb357612eb2614d14565b5b6001900381819060005260206000200160009055905550505050565b6000612eda8361111f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb490614d8f565b60405180910390fd5b612fc68161259e565b15613006576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ffd90614dfb565b60405180910390fd5b6130146000838360016127a9565b61301d8161259e565b1561305d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305490614dfb565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613167600083836001612907565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131d7816131a2565b81146131e257600080fd5b50565b6000813590506131f4816131ce565b92915050565b6000602082840312156132105761320f613198565b5b600061321e848285016131e5565b91505092915050565b60008115159050919050565b61323c81613227565b82525050565b60006020820190506132576000830184613233565b92915050565b61326681613227565b811461327157600080fd5b50565b6000813590506132838161325d565b92915050565b60006020828403121561329f5761329e613198565b5b60006132ad84828501613274565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156132f05780820151818401526020810190506132d5565b60008484015250505050565b6000601f19601f8301169050919050565b6000613318826132b6565b61332281856132c1565b93506133328185602086016132d2565b61333b816132fc565b840191505092915050565b60006020820190508181036000830152613360818461330d565b905092915050565b6000819050919050565b61337b81613368565b811461338657600080fd5b50565b60008135905061339881613372565b92915050565b6000602082840312156133b4576133b3613198565b5b60006133c284828501613389565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133f6826133cb565b9050919050565b613406816133eb565b82525050565b600060208201905061342160008301846133fd565b92915050565b613430816133eb565b811461343b57600080fd5b50565b60008135905061344d81613427565b92915050565b6000806040838503121561346a57613469613198565b5b60006134788582860161343e565b925050602061348985828601613389565b9150509250929050565b61349c81613368565b82525050565b60006020820190506134b76000830184613493565b92915050565b600060ff82169050919050565b6134d3816134bd565b82525050565b60006020820190506134ee60008301846134ca565b92915050565b60008060006060848603121561350d5761350c613198565b5b600061351b8682870161343e565b935050602061352c8682870161343e565b925050604061353d86828701613389565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613589826132fc565b810181811067ffffffffffffffff821117156135a8576135a7613551565b5b80604052505050565b60006135bb61318e565b90506135c78282613580565b919050565b600067ffffffffffffffff8211156135e7576135e6613551565b5b6135f0826132fc565b9050602081019050919050565b82818337600083830152505050565b600061361f61361a846135cc565b6135b1565b90508281526020810184848401111561363b5761363a61354c565b5b6136468482856135fd565b509392505050565b600082601f83011261366357613662613547565b5b813561367384826020860161360c565b91505092915050565b60006020828403121561369257613691613198565b5b600082013567ffffffffffffffff8111156136b0576136af61319d565b5b6136bc8482850161364e565b91505092915050565b6000602082840312156136db576136da613198565b5b60006136e98482850161343e565b91505092915050565b6000806040838503121561370957613708613198565b5b60006137178582860161343e565b925050602061372885828601613274565b9150509250929050565b600061ffff82169050919050565b61374981613732565b811461375457600080fd5b50565b60008135905061376681613740565b92915050565b60006020828403121561378257613781613198565b5b600061379084828501613757565b91505092915050565b600067ffffffffffffffff8211156137b4576137b3613551565b5b6137bd826132fc565b9050602081019050919050565b60006137dd6137d884613799565b6135b1565b9050828152602081018484840111156137f9576137f861354c565b5b6138048482856135fd565b509392505050565b600082601f83011261382157613820613547565b5b81356138318482602086016137ca565b91505092915050565b6000806000806080858703121561385457613853613198565b5b60006138628782880161343e565b94505060206138738782880161343e565b935050604061388487828801613389565b925050606085013567ffffffffffffffff8111156138a5576138a461319d565b5b6138b18782880161380c565b91505092959194509250565b6138c681613732565b82525050565b60006020820190506138e160008301846138bd565b92915050565b600080604083850312156138fe576138fd613198565b5b600061390c8582860161343e565b925050602061391d8582860161343e565b9150509250929050565b6000819050919050565b600061394c613947613942846133cb565b613927565b6133cb565b9050919050565b600061395e82613931565b9050919050565b600061397082613953565b9050919050565b61398081613965565b82525050565b600060208201905061399b6000830184613977565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806139e857607f821691505b6020821081036139fb576139fa6139a1565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a5d6021836132c1565b9150613a6882613a01565b604082019050919050565b60006020820190508181036000830152613a8c81613a50565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613aef603d836132c1565b9150613afa82613a93565b604082019050919050565b60006020820190508181036000830152613b1e81613ae2565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613b81602d836132c1565b9150613b8c82613b25565b604082019050919050565b60006020820190508181036000830152613bb081613b74565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613c13602b836132c1565b9150613c1e82613bb7565b604082019050919050565b60006020820190508181036000830152613c4281613c06565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613ca5602c836132c1565b9150613cb082613c49565b604082019050919050565b60006020820190508181036000830152613cd481613c98565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e6f74206f776e65720000000000000000000000000000000000000000000000600082015250565b6000613d406009836132c1565b9150613d4b82613d0a565b602082019050919050565b60006020820190508181036000830152613d6f81613d33565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613db082613368565b9150613dbb83613368565b9250828203905081811115613dd357613dd2613d76565b5b92915050565b6000819050919050565b613df4613def82613368565b613dd9565b82525050565b6000819050919050565b6000819050919050565b613e1f613e1a82613dfa565b613e04565b82525050565b60008160601b9050919050565b6000613e3d82613e25565b9050919050565b6000613e4f82613e32565b9050919050565b613e67613e62826133eb565b613e44565b82525050565b6000613e798288613de3565b602082019150613e898287613de3565b602082019150613e998286613e0e565b602082019150613ea98285613e56565b601482019150613eb98284613de3565b6020820191508190509695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613f0682613368565b9150613f1183613368565b925082613f2157613f20613ecc565b5b828206905092915050565b600081519050613f3b81613372565b92915050565b600060208284031215613f5757613f56613198565b5b6000613f6584828501613f2c565b91505092915050565b6000604082019050613f8360008301856133fd565b613f906020830184613493565b9392505050565b600081519050613fa68161325d565b92915050565b600060208284031215613fc257613fc1613198565b5b6000613fd084828501613f97565b91505092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261403b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613ffe565b6140458683613ffe565b95508019841693508086168417925050509392505050565b600061407861407361406e84613368565b613927565b613368565b9050919050565b6000819050919050565b6140928361405d565b6140a661409e8261407f565b84845461400b565b825550505050565b600090565b6140bb6140ae565b6140c6818484614089565b505050565b5b818110156140ea576140df6000826140b3565b6001810190506140cc565b5050565b601f82111561412f5761410081613fd9565b61410984613fee565b81016020851015614118578190505b61412c61412485613fee565b8301826140cb565b50505b505050565b600082821c905092915050565b600061415260001984600802614134565b1980831691505092915050565b600061416b8383614141565b9150826002028217905092915050565b614184826132b6565b67ffffffffffffffff81111561419d5761419c613551565b5b6141a782546139d0565b6141b28282856140ee565b600060209050601f8311600181146141e557600084156141d3578287015190505b6141dd858261415f565b865550614245565b601f1984166141f386613fd9565b60005b8281101561421b578489015182556001820191506020850194506020810190506141f6565b868310156142385784890151614234601f891682614141565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006142836018836132c1565b915061428e8261424d565b602082019050919050565b600060208201905081810360008301526142b281614276565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006143156029836132c1565b9150614320826142b9565b604082019050919050565b6000602082019050818103600083015261434481614308565b9050919050565b7f4e6f20746f6b656e7320746f2077697468647261770000000000000000000000600082015250565b60006143816015836132c1565b915061438c8261434b565b602082019050919050565b600060208201905081810360008301526143b081614374565b9050919050565b7f5061757365640000000000000000000000000000000000000000000000000000600082015250565b60006143ed6006836132c1565b91506143f8826143b7565b602082019050919050565b6000602082019050818103600083015261441c816143e0565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7400000000000000000000000000600082015250565b60006144596013836132c1565b915061446482614423565b602082019050919050565b600060208201905081810360008301526144888161444c565b9050919050565b600061449a82613368565b91506144a583613368565b92508282019050808211156144bd576144bc613d76565b5b92915050565b7f4d617820737570706c7920726561636865640000000000000000000000000000600082015250565b60006144f96012836132c1565b9150614504826144c3565b602082019050919050565b60006020820190508181036000830152614528816144ec565b9050919050565b7f4c696d6974206578636565646564000000000000000000000000000000000000600082015250565b6000614565600e836132c1565b91506145708261452f565b602082019050919050565b6000602082019050818103600083015261459481614558565b9050919050565b60006145a682613368565b91506145b183613368565b92508282026145bf81613368565b915082820484148315176145d6576145d5613d76565b5b5092915050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b60006146136012836132c1565b915061461e826145dd565b602082019050919050565b6000602082019050818103600083015261464281614606565b9050919050565b600061465482613368565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361468657614685613d76565b5b600182019050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006146ed602f836132c1565b91506146f882614691565b604082019050919050565b6000602082019050818103600083015261471c816146e0565b9050919050565b600081905092915050565b6000614739826132b6565b6147438185614723565b93506147538185602086016132d2565b80840191505092915050565b6000815461476c816139d0565b6147768186614723565b9450600182166000811461479157600181146147a6576147d9565b60ff19831686528115158202860193506147d9565b6147af85613fd9565b60005b838110156147d1578154818901526001820191506020810190506147b2565b838801955050505b50505092915050565b60006147ee828661472e565b91506147fa828561472e565b9150614806828461475f565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061486f6026836132c1565b915061487a82614813565b604082019050919050565b6000602082019050818103600083015261489e81614862565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006148db6020836132c1565b91506148e6826148a5565b602082019050919050565b6000602082019050818103600083015261490a816148ce565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061496d6025836132c1565b915061497882614911565b604082019050919050565b6000602082019050818103600083015261499c81614960565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006149ff6024836132c1565b9150614a0a826149a3565b604082019050919050565b60006020820190508181036000830152614a2e816149f2565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614a6b601f836132c1565b9150614a7682614a35565b602082019050919050565b60006020820190508181036000830152614a9a81614a5e565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614ad76019836132c1565b9150614ae282614aa1565b602082019050919050565b60006020820190508181036000830152614b0681614aca565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614b696032836132c1565b9150614b7482614b0d565b604082019050919050565b60006020820190508181036000830152614b9881614b5c565b9050919050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000614bfb6035836132c1565b9150614c0682614b9f565b604082019050919050565b60006020820190508181036000830152614c2a81614bee565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614c5882614c31565b614c628185614c3c565b9350614c728185602086016132d2565b614c7b816132fc565b840191505092915050565b6000608082019050614c9b60008301876133fd565b614ca860208301866133fd565b614cb56040830185613493565b8181036060830152614cc78184614c4d565b905095945050505050565b600081519050614ce1816131ce565b92915050565b600060208284031215614cfd57614cfc613198565b5b6000614d0b84828501614cd2565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614d796020836132c1565b9150614d8482614d43565b602082019050919050565b60006020820190508181036000830152614da881614d6c565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614de5601c836132c1565b9150614df082614daf565b602082019050919050565b60006020820190508181036000830152614e1481614dd8565b905091905056fea26469706673582212207aec964f344181b17d8332d642204870defca29c530e6b179212beb364f4355e64736f6c63430008130033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000c046dcb16592fbb3f9fa0c629b8d93090dd4cb76000000000000000000000000000000000000000000000000000000000000000a4a6f696e745061636b730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055061636b730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d544b356b48597a53774875336b5763477059727833524e73476a7879737a787a704c7a744e6d4334566b45432f00000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): JointPacks
Arg [1] : _symbol (string): Packs
Arg [2] : _initBaseURI (string): ipfs://QmTK5kHYzSwHu3kWcGpYrx3RNsGjxyszxzpLztNmC4VkEC/
Arg [3] : _rewardToken (address): 0xC046dCb16592FBb3F9fA0C629b8D93090dD4cB76

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 000000000000000000000000c046dcb16592fbb3f9fa0c629b8d93090dd4cb76
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [5] : 4a6f696e745061636b7300000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 5061636b73000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [9] : 697066733a2f2f516d544b356b48597a53774875336b5763477059727833524e
Arg [10] : 73476a7879737a787a704c7a744e6d4334566b45432f00000000000000000000


Deployed Bytecode Sourcemap

70929:5314:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64930:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75736:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42337:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43849:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43367:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71135:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65570:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71214:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44549:301;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65238:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76134:106;;;;;;;;;;;;;:::i;:::-;;44921:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75521:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65760:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72906:862;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75273:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71299:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42047:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71063:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41778:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61995:103;;;;;;;;;;;;;:::i;:::-;;75868:223;;;;;;;;;;;;;:::i;:::-;;61354:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42506:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72131:731;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44092:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75617:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45143:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71253:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71091:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74840:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71174:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75385:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44318:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62253:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71399:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64930:224;65032:4;65071:35;65056:50;;;:11;:50;;;;:90;;;;65110:36;65134:11;65110:23;:36::i;:::-;65056:90;65049:97;;64930:224;;;:::o;75736:81::-;61240:13;:11;:13::i;:::-;75803:6:::1;75794;;:15;;;;;;;;;;;;;;;;;;75736:81:::0;:::o;42337:100::-;42391:13;42424:5;42417:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42337:100;:::o;43849:171::-;43925:7;43945:23;43960:7;43945:14;:23::i;:::-;43988:15;:24;44004:7;43988:24;;;;;;;;;;;;;;;;;;;;;43981:31;;43849:171;;;:::o;43367:416::-;43448:13;43464:23;43479:7;43464:14;:23::i;:::-;43448:39;;43512:5;43506:11;;:2;:11;;;43498:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;43606:5;43590:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;43615:37;43632:5;43639:12;:10;:12::i;:::-;43615:16;:37::i;:::-;43590:62;43568:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;43754:21;43763:2;43767:7;43754:8;:21::i;:::-;43437:346;43367:416;;:::o;71135:32::-;;;;:::o;65570:113::-;65631:7;65658:10;:17;;;;65651:24;;65570:113;:::o;71214:32::-;;;;;;;;;;;;;:::o;44549:301::-;44710:41;44729:12;:10;:12::i;:::-;44743:7;44710:18;:41::i;:::-;44702:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;44814:28;44824:4;44830:2;44834:7;44814:9;:28::i;:::-;44549:301;;;:::o;65238:256::-;65335:7;65371:23;65388:5;65371:16;:23::i;:::-;65363:5;:31;65355:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;65460:12;:19;65473:5;65460:19;;;;;;;;;;;;;;;:26;65480:5;65460:26;;;;;;;;;;;;65453:33;;65238:256;;;;:::o;76134:106::-;61240:13;:11;:13::i;:::-;76192:7:::1;:5;:7::i;:::-;76184:25;;:48;76210:21;76184:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;76134:106::o:0;44921:151::-;45025:39;45042:4;45048:2;45052:7;45025:39;;;;;;;;;;;;:16;:39::i;:::-;44921:151;;;:::o;75521:88::-;61240:13;:11;:13::i;:::-;75593:8:::1;75586:4;:15;;;;75521:88:::0;:::o;65760:233::-;65835:7;65871:30;:28;:30::i;:::-;65863:5;:38;65855:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;65968:10;65979:5;65968:17;;;;;;;;:::i;:::-;;;;;;;;;;65961:24;;65760:233;;;:::o;72906:862::-;2386:21;:19;:21::i;:::-;73003:10:::1;72983:30;;:16;72991:7;72983;:16::i;:::-;:30;;;72975:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;73104:19;73302:3;73193:12;73207:15;73249:1;73234:12;:16;;;;:::i;:::-;73224:27;73253:10;73265:7;73176:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;73148:140;;;;;;73126:173;;:179;;;;:::i;:::-;73104:201;;73318:20;73341:28;73357:11;73341:15;:28::i;:::-;73318:51;;73382:23;73408:11;;;;;;;;;;;:21;;;73438:4;73408:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73382:62;;73474:15;73459:12;:30;73455:93;;;73521:15;73506:30;;73455:93;73560:11;;;;;;;;;;;:20;;;73581:10;73593:12;73560:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;73617:14;73623:7;73617:5;:14::i;:::-;73675:7;73663:10;73649:47;;;73684:11;73649:47;;;;;;:::i;:::-;;;;;;;;73752:7;73726:10;73712:48;;;73738:12;73712:48;;;;;;:::i;:::-;;;;;;;;72964:804;;;2430:20:::0;:18;:20::i;:::-;72906:862;:::o;75273:104::-;61240:13;:11;:13::i;:::-;75358:11:::1;75348:7;:21;;;;;;:::i;:::-;;75273:104:::0;:::o;71299:26::-;;;;;;;;;;;;;:::o;42047:223::-;42119:7;42139:13;42155:17;42164:7;42155:8;:17::i;:::-;42139:33;;42208:1;42191:19;;:5;:19;;;42183:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;42257:5;42250:12;;;42047:223;;;:::o;71063:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41778:207::-;41850:7;41895:1;41878:19;;:5;:19;;;41870:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41961:9;:16;41971:5;41961:16;;;;;;;;;;;;;;;;41954:23;;41778:207;;;:::o;61995:103::-;61240:13;:11;:13::i;:::-;62060:30:::1;62087:1;62060:18;:30::i;:::-;61995:103::o:0;75868:223::-;61240:13;:11;:13::i;:::-;75924:15:::1;75942:11;;;;;;;;;;;:21;;;75972:4;75942:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75924:54;;76007:1;75997:7;:11;75989:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;76045:11;;;;;;;;;;;:20;;;76066:7;:5;:7::i;:::-;76075;76045:38;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;75913:178;75868:223::o:0;61354:87::-;61400:7;61427:6;;;;;;;;;;;61420:13;;61354:87;:::o;42506:104::-;42562:13;42595:7;42588:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42506:104;:::o;72131:731::-;72201:6;;;;;;;;;;;72200:7;72192:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;72251:1;72237:11;:15;:47;;;;;72271:13;;;;;;;;;;;72256:28;;:11;:28;;72237:47;72229:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;72360:9;;72355:1;72341:11;72327;;:25;;;;:::i;:::-;:29;;;;:::i;:::-;:42;;72319:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;72423:7;:5;:7::i;:::-;72409:21;;:10;:21;;;72405:284;;72447:24;72474:20;:32;72495:10;72474:32;;;;;;;;;;;;;;;;72447:59;;72563:18;;;;;;;;;;;72529:52;;72548:11;72529:16;:30;;;;:::i;:::-;:52;;72521:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;72643:11;72636:4;;:18;;;;:::i;:::-;72623:9;:31;;72615:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;72432:257;72405:284;72706:9;72701:154;72725:11;72721:1;:15;72701:154;;;72758:20;:32;72779:10;72758:32;;;;;;;;;;;;;;;;:34;;;;;;;;;:::i;:::-;;;;;;72807:36;72817:10;72829:11;;:13;;;;;;;;;:::i;:::-;;;;;72807:9;:36::i;:::-;72738:3;;;;;:::i;:::-;;;;72701:154;;;;72131:731;:::o;44092:155::-;44187:52;44206:12;:10;:12::i;:::-;44220:8;44230;44187:18;:52::i;:::-;44092:155;;:::o;75617:111::-;61240:13;:11;:13::i;:::-;75714:6:::1;75693:18;;:27;;;;;;;;;;;;;;;;;;75617:111:::0;:::o;45143:279::-;45274:41;45293:12;:10;:12::i;:::-;45307:7;45274:18;:41::i;:::-;45266:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;45376:38;45390:4;45396:2;45400:7;45409:4;45376:13;:38::i;:::-;45143:279;;;;:::o;71253:39::-;;;;;;;;;;;;;:::o;71091:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;74840:396::-;74913:13;74947:16;74955:7;74947;:16::i;:::-;74939:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;75028:28;75059:10;:8;:10::i;:::-;75028:41;;75118:1;75093:14;75087:28;:32;:141;;;;;;;;;;;;;;;;;75159:14;75175:18;:7;:16;:18::i;:::-;75195:13;75142:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75087:141;75080:148;;;74840:396;;;:::o;71174:33::-;;;;:::o;75385:128::-;61240:13;:11;:13::i;:::-;75488:17:::1;75472:13;:33;;;;;;:::i;:::-;;75385:128:::0;:::o;44318:164::-;44415:4;44439:18;:25;44458:5;44439:25;;;;;;;;;;;;;;;:35;44465:8;44439:35;;;;;;;;;;;;;;;;;;;;;;;;;44432:42;;44318:164;;;;:::o;62253:201::-;61240:13;:11;:13::i;:::-;62362:1:::1;62342:22;;:8;:22;;::::0;62334:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;62418:28;62437:8;62418:18;:28::i;:::-;62253:201:::0;:::o;71399:25::-;;;;;;;;;;;;;:::o;41409:305::-;41511:4;41563:25;41548:40;;;:11;:40;;;;:105;;;;41620:33;41605:48;;;:11;:48;;;;41548:105;:158;;;;41670:36;41694:11;41670:23;:36::i;:::-;41548:158;41528:178;;41409:305;;;:::o;61519:132::-;61594:12;:10;:12::i;:::-;61583:23;;:7;:5;:7::i;:::-;:23;;;61575:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61519:132::o;53412:135::-;53494:16;53502:7;53494;:16::i;:::-;53486:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;53412:135;:::o;21300:98::-;21353:7;21380:10;21373:17;;21300:98;:::o;52725:174::-;52827:2;52800:15;:24;52816:7;52800:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;52883:7;52879:2;52845:46;;52854:23;52869:7;52854:14;:23::i;:::-;52845:46;;;;;;;;;;;;52725:174;;:::o;47412:264::-;47505:4;47522:13;47538:23;47553:7;47538:14;:23::i;:::-;47522:39;;47591:5;47580:16;;:7;:16;;;:52;;;;47600:32;47617:5;47624:7;47600:16;:32::i;:::-;47580:52;:87;;;;47660:7;47636:31;;:20;47648:7;47636:11;:20::i;:::-;:31;;;47580:87;47572:96;;;47412:264;;;;:::o;51377:1229::-;51502:4;51475:31;;:23;51490:7;51475:14;:23::i;:::-;:31;;;51467:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;51581:1;51567:16;;:2;:16;;;51559:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;51637:42;51658:4;51664:2;51668:7;51677:1;51637:20;:42::i;:::-;51809:4;51782:31;;:23;51797:7;51782:14;:23::i;:::-;:31;;;51774:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;51927:15;:24;51943:7;51927:24;;;;;;;;;;;;51920:31;;;;;;;;;;;52422:1;52403:9;:15;52413:4;52403:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;52455:1;52438:9;:13;52448:2;52438:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;52497:2;52478:7;:16;52486:7;52478:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;52536:7;52532:2;52517:27;;52526:4;52517:27;;;;;;;;;;;;52557:41;52577:4;52583:2;52587:7;52596:1;52557:19;:41::i;:::-;51377:1229;;;:::o;2466:293::-;1868:1;2600:7;;:19;2592:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1868:1;2733:7;:18;;;;2466:293::o;73837:954::-;73898:7;73929:2;73922:4;:9;73918:866;;;73992:8;73985:15;;;;73918:866;74059:2;74052:4;:9;74048:736;;;74116:8;74109:15;;;;74048:736;74183:2;74176:4;:9;74172:612;;;74240:9;74233:16;;;;74172:612;74308:2;74301:4;:9;74297:487;;;74365:9;74358:16;;;;74297:487;74433:2;74426:4;:9;74422:362;;;74489:9;74482:16;;;;74422:362;74558:2;74550:4;:10;74546:238;;74610:9;74603:16;;;;74546:238;74732:10;74725:17;;73837:954;;;;:::o;50257:783::-;50317:13;50333:23;50348:7;50333:14;:23::i;:::-;50317:39;;50369:51;50390:5;50405:1;50409:7;50418:1;50369:20;:51::i;:::-;50533:23;50548:7;50533:14;:23::i;:::-;50525:31;;50604:15;:24;50620:7;50604:24;;;;;;;;;;;;50597:31;;;;;;;;;;;50869:1;50849:9;:16;50859:5;50849:16;;;;;;;;;;;;;;;;:21;;;;;;;;;;;50899:7;:16;50907:7;50899:16;;;;;;;;;;;;50892:23;;;;;;;;;;;50961:7;50957:1;50933:36;;50942:5;50933:36;;;;;;;;;;;;50982:50;51002:5;51017:1;51021:7;51030:1;50982:19;:50::i;:::-;50306:734;50257:783;:::o;2767:213::-;1824:1;2950:7;:22;;;;2767:213::o;46687:117::-;46753:7;46780;:16;46788:7;46780:16;;;;;;;;;;;;;;;;;;;;;46773:23;;46687:117;;;:::o;62614:191::-;62688:16;62707:6;;;;;;;;;;;62688:25;;62733:8;62724:6;;:17;;;;;;;;;;;;;;;;;;62788:8;62757:40;;62778:8;62757:40;;;;;;;;;;;;62677:128;62614:191;:::o;48018:110::-;48094:26;48104:2;48108:7;48094:26;;;;;;;;;;;;:9;:26::i;:::-;48018:110;;:::o;53042:281::-;53163:8;53154:17;;:5;:17;;;53146:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;53250:8;53212:18;:25;53231:5;53212:25;;;;;;;;;;;;;;;:35;53238:8;53212:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;53296:8;53274:41;;53289:5;53274:41;;;53306:8;53274:41;;;;;;:::i;:::-;;;;;;;;53042:281;;;:::o;46303:270::-;46416:28;46426:4;46432:2;46436:7;46416:9;:28::i;:::-;46463:47;46486:4;46492:2;46496:7;46505:4;46463:22;:47::i;:::-;46455:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;46303:270;;;;:::o;47117:128::-;47182:4;47235:1;47206:31;;:17;47215:7;47206:8;:17::i;:::-;:31;;;;47199:38;;47117:128;;;:::o;71986:108::-;72046:13;72079:7;72072:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71986:108;:::o;36559:716::-;36615:13;36666:14;36703:1;36683:17;36694:5;36683:10;:17::i;:::-;:21;36666:38;;36719:20;36753:6;36742:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36719:41;;36775:11;36904:6;36900:2;36896:15;36888:6;36884:28;36877:35;;36941:288;36948:4;36941:288;;;36973:5;;;;;;;;37115:8;37110:2;37103:5;37099:14;37094:30;37089:3;37081:44;37171:2;37162:11;;;;;;:::i;:::-;;;;;37205:1;37196:5;:10;36941:288;37192:21;36941:288;37250:6;37243:13;;;;;36559:716;;;:::o;39832:157::-;39917:4;39956:25;39941:40;;;:11;:40;;;;39934:47;;39832:157;;;:::o;66067:915::-;66244:61;66271:4;66277:2;66281:12;66295:9;66244:26;:61::i;:::-;66334:1;66322:9;:13;66318:222;;;66465:63;;;;;;;;;;:::i;:::-;;;;;;;;66318:222;66552:15;66570:12;66552:30;;66615:1;66599:18;;:4;:18;;;66595:187;;66634:40;66666:7;66634:31;:40::i;:::-;66595:187;;;66704:2;66696:10;;:4;:10;;;66692:90;;66723:47;66756:4;66762:7;66723:32;:47::i;:::-;66692:90;66595:187;66810:1;66796:16;;:2;:16;;;66792:183;;66829:45;66866:7;66829:36;:45::i;:::-;66792:183;;;66902:4;66896:10;;:2;:10;;;66892:83;;66923:40;66951:2;66955:7;66923:27;:40::i;:::-;66892:83;66792:183;66233:749;66067:915;;;;:::o;56534:115::-;;;;;:::o;48355:285::-;48450:18;48456:2;48460:7;48450:5;:18::i;:::-;48501:53;48532:1;48536:2;48540:7;48549:4;48501:22;:53::i;:::-;48479:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;48355:285;;;:::o;54111:853::-;54265:4;54286:15;:2;:13;;;:15::i;:::-;54282:675;;;54338:2;54322:36;;;54359:12;:10;:12::i;:::-;54373:4;54379:7;54388:4;54322:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;54318:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54580:1;54563:6;:13;:18;54559:328;;54606:60;;;;;;;;;;:::i;:::-;;;;;;;;54559:328;54837:6;54831:13;54822:6;54818:2;54814:15;54807:38;54318:584;54454:41;;;54444:51;;;:6;:51;;;;54437:58;;;;;54282:675;54941:4;54934:11;;54111:853;;;;;;;:::o;32042:948::-;32095:7;32115:14;32132:1;32115:18;;32182:8;32173:5;:17;32169:106;;32220:8;32211:17;;;;;;:::i;:::-;;;;;32257:2;32247:12;;;;32169:106;32302:8;32293:5;:17;32289:106;;32340:8;32331:17;;;;;;:::i;:::-;;;;;32377:2;32367:12;;;;32289:106;32422:8;32413:5;:17;32409:106;;32460:8;32451:17;;;;;;:::i;:::-;;;;;32497:2;32487:12;;;;32409:106;32542:7;32533:5;:16;32529:103;;32579:7;32570:16;;;;;;:::i;:::-;;;;;32615:1;32605:11;;;;32529:103;32659:7;32650:5;:16;32646:103;;32696:7;32687:16;;;;;;:::i;:::-;;;;;32732:1;32722:11;;;;32646:103;32776:7;32767:5;:16;32763:103;;32813:7;32804:16;;;;;;:::i;:::-;;;;;32849:1;32839:11;;;;32763:103;32893:7;32884:5;:16;32880:68;;32931:1;32921:11;;;;32880:68;32976:6;32969:13;;;32042:948;;;:::o;55696:116::-;;;;;:::o;67705:164::-;67809:10;:17;;;;67782:15;:24;67798:7;67782:24;;;;;;;;;;;:44;;;;67837:10;67853:7;67837:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67705:164;:::o;68496:988::-;68762:22;68812:1;68787:22;68804:4;68787:16;:22::i;:::-;:26;;;;:::i;:::-;68762:51;;68824:18;68845:17;:26;68863:7;68845:26;;;;;;;;;;;;68824:47;;68992:14;68978:10;:28;68974:328;;69023:19;69045:12;:18;69058:4;69045:18;;;;;;;;;;;;;;;:34;69064:14;69045:34;;;;;;;;;;;;69023:56;;69129:11;69096:12;:18;69109:4;69096:18;;;;;;;;;;;;;;;:30;69115:10;69096:30;;;;;;;;;;;:44;;;;69246:10;69213:17;:30;69231:11;69213:30;;;;;;;;;;;:43;;;;69008:294;68974:328;69398:17;:26;69416:7;69398:26;;;;;;;;;;;69391:33;;;69442:12;:18;69455:4;69442:18;;;;;;;;;;;;;;;:34;69461:14;69442:34;;;;;;;;;;;69435:41;;;68577:907;;68496:988;;:::o;69779:1079::-;70032:22;70077:1;70057:10;:17;;;;:21;;;;:::i;:::-;70032:46;;70089:18;70110:15;:24;70126:7;70110:24;;;;;;;;;;;;70089:45;;70461:19;70483:10;70494:14;70483:26;;;;;;;;:::i;:::-;;;;;;;;;;70461:48;;70547:11;70522:10;70533;70522:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;70658:10;70627:15;:28;70643:11;70627:28;;;;;;;;;;;:41;;;;70799:15;:24;70815:7;70799:24;;;;;;;;;;;70792:31;;;70834:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;69850:1008;;;69779:1079;:::o;67283:221::-;67368:14;67385:20;67402:2;67385:16;:20::i;:::-;67368:37;;67443:7;67416:12;:16;67429:2;67416:16;;;;;;;;;;;;;;;:24;67433:6;67416:24;;;;;;;;;;;:34;;;;67490:6;67461:17;:26;67479:7;67461:26;;;;;;;;;;;:35;;;;67357:147;67283:221;;:::o;48976:942::-;49070:1;49056:16;;:2;:16;;;49048:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;49129:16;49137:7;49129;:16::i;:::-;49128:17;49120:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;49191:48;49220:1;49224:2;49228:7;49237:1;49191:20;:48::i;:::-;49338:16;49346:7;49338;:16::i;:::-;49337:17;49329:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;49753:1;49736:9;:13;49746:2;49736:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;49797:2;49778:7;:16;49786:7;49778:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;49842:7;49838:2;49817:33;;49834:1;49817:33;;;;;;;;;;;;49863:47;49891:1;49895:2;49899:7;49908:1;49863:19;:47::i;:::-;48976:942;;:::o;12441:326::-;12501:4;12758:1;12736:7;:19;;;:23;12729:30;;12441:326;;;:::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:116::-;1588:21;1603:5;1588:21;:::i;:::-;1581:5;1578:32;1568:60;;1624:1;1621;1614:12;1568:60;1518:116;:::o;1640:133::-;1683:5;1721:6;1708:20;1699:29;;1737:30;1761:5;1737:30;:::i;:::-;1640:133;;;;:::o;1779:323::-;1835:6;1884:2;1872:9;1863:7;1859:23;1855:32;1852:119;;;1890:79;;:::i;:::-;1852:119;2010:1;2035:50;2077:7;2068:6;2057:9;2053:22;2035:50;:::i;:::-;2025:60;;1981:114;1779:323;;;;:::o;2108:99::-;2160:6;2194:5;2188:12;2178:22;;2108:99;;;:::o;2213:169::-;2297:11;2331:6;2326:3;2319:19;2371:4;2366:3;2362:14;2347:29;;2213:169;;;;:::o;2388:246::-;2469:1;2479:113;2493:6;2490:1;2487:13;2479:113;;;2578:1;2573:3;2569:11;2563:18;2559:1;2554:3;2550:11;2543:39;2515:2;2512:1;2508:10;2503:15;;2479:113;;;2626:1;2617:6;2612:3;2608:16;2601:27;2450:184;2388:246;;;:::o;2640:102::-;2681:6;2732:2;2728:7;2723:2;2716:5;2712:14;2708:28;2698:38;;2640:102;;;:::o;2748:377::-;2836:3;2864:39;2897:5;2864:39;:::i;:::-;2919:71;2983:6;2978:3;2919:71;:::i;:::-;2912:78;;2999:65;3057:6;3052:3;3045:4;3038:5;3034:16;2999:65;:::i;:::-;3089:29;3111:6;3089:29;:::i;:::-;3084:3;3080:39;3073:46;;2840:285;2748:377;;;;:::o;3131:313::-;3244:4;3282:2;3271:9;3267:18;3259:26;;3331:9;3325:4;3321:20;3317:1;3306:9;3302:17;3295:47;3359:78;3432:4;3423:6;3359:78;:::i;:::-;3351:86;;3131:313;;;;:::o;3450:77::-;3487:7;3516:5;3505:16;;3450:77;;;:::o;3533:122::-;3606:24;3624:5;3606:24;:::i;:::-;3599:5;3596:35;3586:63;;3645:1;3642;3635:12;3586:63;3533:122;:::o;3661:139::-;3707:5;3745:6;3732:20;3723:29;;3761:33;3788:5;3761:33;:::i;:::-;3661:139;;;;:::o;3806:329::-;3865:6;3914:2;3902:9;3893:7;3889:23;3885:32;3882:119;;;3920:79;;:::i;:::-;3882:119;4040:1;4065:53;4110:7;4101:6;4090:9;4086:22;4065:53;:::i;:::-;4055:63;;4011:117;3806:329;;;;:::o;4141:126::-;4178:7;4218:42;4211:5;4207:54;4196:65;;4141:126;;;:::o;4273:96::-;4310:7;4339:24;4357:5;4339:24;:::i;:::-;4328:35;;4273:96;;;:::o;4375:118::-;4462:24;4480:5;4462:24;:::i;:::-;4457:3;4450:37;4375:118;;:::o;4499:222::-;4592:4;4630:2;4619:9;4615:18;4607:26;;4643:71;4711:1;4700:9;4696:17;4687:6;4643:71;:::i;:::-;4499:222;;;;:::o;4727:122::-;4800:24;4818:5;4800:24;:::i;:::-;4793:5;4790:35;4780:63;;4839:1;4836;4829:12;4780:63;4727:122;:::o;4855:139::-;4901:5;4939:6;4926:20;4917:29;;4955:33;4982:5;4955:33;:::i;:::-;4855:139;;;;:::o;5000:474::-;5068:6;5076;5125:2;5113:9;5104:7;5100:23;5096:32;5093:119;;;5131:79;;:::i;:::-;5093:119;5251:1;5276:53;5321:7;5312:6;5301:9;5297:22;5276:53;:::i;:::-;5266:63;;5222:117;5378:2;5404:53;5449:7;5440:6;5429:9;5425:22;5404:53;:::i;:::-;5394:63;;5349:118;5000:474;;;;;:::o;5480:118::-;5567:24;5585:5;5567:24;:::i;:::-;5562:3;5555:37;5480:118;;:::o;5604:222::-;5697:4;5735:2;5724:9;5720:18;5712:26;;5748:71;5816:1;5805:9;5801:17;5792:6;5748:71;:::i;:::-;5604:222;;;;:::o;5832:86::-;5867:7;5907:4;5900:5;5896:16;5885:27;;5832:86;;;:::o;5924:112::-;6007:22;6023:5;6007:22;:::i;:::-;6002:3;5995:35;5924:112;;:::o;6042:214::-;6131:4;6169:2;6158:9;6154:18;6146:26;;6182:67;6246:1;6235:9;6231:17;6222:6;6182:67;:::i;:::-;6042:214;;;;:::o;6262:619::-;6339:6;6347;6355;6404:2;6392:9;6383:7;6379:23;6375:32;6372:119;;;6410:79;;:::i;:::-;6372:119;6530:1;6555:53;6600:7;6591:6;6580:9;6576:22;6555:53;:::i;:::-;6545:63;;6501:117;6657:2;6683:53;6728:7;6719:6;6708:9;6704:22;6683:53;:::i;:::-;6673:63;;6628:118;6785:2;6811:53;6856:7;6847:6;6836:9;6832:22;6811:53;:::i;:::-;6801:63;;6756:118;6262:619;;;;;:::o;6887:117::-;6996:1;6993;6986:12;7010:117;7119:1;7116;7109:12;7133:180;7181:77;7178:1;7171:88;7278:4;7275:1;7268:15;7302:4;7299:1;7292:15;7319:281;7402:27;7424:4;7402:27;:::i;:::-;7394:6;7390:40;7532:6;7520:10;7517:22;7496:18;7484:10;7481:34;7478:62;7475:88;;;7543:18;;:::i;:::-;7475:88;7583:10;7579:2;7572:22;7362:238;7319:281;;:::o;7606:129::-;7640:6;7667:20;;:::i;:::-;7657:30;;7696:33;7724:4;7716:6;7696:33;:::i;:::-;7606:129;;;:::o;7741:308::-;7803:4;7893:18;7885:6;7882:30;7879:56;;;7915:18;;:::i;:::-;7879:56;7953:29;7975:6;7953:29;:::i;:::-;7945:37;;8037:4;8031;8027:15;8019:23;;7741:308;;;:::o;8055:146::-;8152:6;8147:3;8142;8129:30;8193:1;8184:6;8179:3;8175:16;8168:27;8055:146;;;:::o;8207:425::-;8285:5;8310:66;8326:49;8368:6;8326:49;:::i;:::-;8310:66;:::i;:::-;8301:75;;8399:6;8392:5;8385:21;8437:4;8430:5;8426:16;8475:3;8466:6;8461:3;8457:16;8454:25;8451:112;;;8482:79;;:::i;:::-;8451:112;8572:54;8619:6;8614:3;8609;8572:54;:::i;:::-;8291:341;8207:425;;;;;:::o;8652:340::-;8708:5;8757:3;8750:4;8742:6;8738:17;8734:27;8724:122;;8765:79;;:::i;:::-;8724:122;8882:6;8869:20;8907:79;8982:3;8974:6;8967:4;8959:6;8955:17;8907:79;:::i;:::-;8898:88;;8714:278;8652:340;;;;:::o;8998:509::-;9067:6;9116:2;9104:9;9095:7;9091:23;9087:32;9084:119;;;9122:79;;:::i;:::-;9084:119;9270:1;9259:9;9255:17;9242:31;9300:18;9292:6;9289:30;9286:117;;;9322:79;;:::i;:::-;9286:117;9427:63;9482:7;9473:6;9462:9;9458:22;9427:63;:::i;:::-;9417:73;;9213:287;8998:509;;;;:::o;9513:329::-;9572:6;9621:2;9609:9;9600:7;9596:23;9592:32;9589:119;;;9627:79;;:::i;:::-;9589:119;9747:1;9772:53;9817:7;9808:6;9797:9;9793:22;9772:53;:::i;:::-;9762:63;;9718:117;9513:329;;;;:::o;9848:468::-;9913:6;9921;9970:2;9958:9;9949:7;9945:23;9941:32;9938:119;;;9976:79;;:::i;:::-;9938:119;10096:1;10121:53;10166:7;10157:6;10146:9;10142:22;10121:53;:::i;:::-;10111:63;;10067:117;10223:2;10249:50;10291:7;10282:6;10271:9;10267:22;10249:50;:::i;:::-;10239:60;;10194:115;9848:468;;;;;:::o;10322:89::-;10358:7;10398:6;10391:5;10387:18;10376:29;;10322:89;;;:::o;10417:120::-;10489:23;10506:5;10489:23;:::i;:::-;10482:5;10479:34;10469:62;;10527:1;10524;10517:12;10469:62;10417:120;:::o;10543:137::-;10588:5;10626:6;10613:20;10604:29;;10642:32;10668:5;10642:32;:::i;:::-;10543:137;;;;:::o;10686:327::-;10744:6;10793:2;10781:9;10772:7;10768:23;10764:32;10761:119;;;10799:79;;:::i;:::-;10761:119;10919:1;10944:52;10988:7;10979:6;10968:9;10964:22;10944:52;:::i;:::-;10934:62;;10890:116;10686:327;;;;:::o;11019:307::-;11080:4;11170:18;11162:6;11159:30;11156:56;;;11192:18;;:::i;:::-;11156:56;11230:29;11252:6;11230:29;:::i;:::-;11222:37;;11314:4;11308;11304:15;11296:23;;11019:307;;;:::o;11332:423::-;11409:5;11434:65;11450:48;11491:6;11450:48;:::i;:::-;11434:65;:::i;:::-;11425:74;;11522:6;11515:5;11508:21;11560:4;11553:5;11549:16;11598:3;11589:6;11584:3;11580:16;11577:25;11574:112;;;11605:79;;:::i;:::-;11574:112;11695:54;11742:6;11737:3;11732;11695:54;:::i;:::-;11415:340;11332:423;;;;;:::o;11774:338::-;11829:5;11878:3;11871:4;11863:6;11859:17;11855:27;11845:122;;11886:79;;:::i;:::-;11845:122;12003:6;11990:20;12028:78;12102:3;12094:6;12087:4;12079:6;12075:17;12028:78;:::i;:::-;12019:87;;11835:277;11774:338;;;;:::o;12118:943::-;12213:6;12221;12229;12237;12286:3;12274:9;12265:7;12261:23;12257:33;12254:120;;;12293:79;;:::i;:::-;12254:120;12413:1;12438:53;12483:7;12474:6;12463:9;12459:22;12438:53;:::i;:::-;12428:63;;12384:117;12540:2;12566:53;12611:7;12602:6;12591:9;12587:22;12566:53;:::i;:::-;12556:63;;12511:118;12668:2;12694:53;12739:7;12730:6;12719:9;12715:22;12694:53;:::i;:::-;12684:63;;12639:118;12824:2;12813:9;12809:18;12796:32;12855:18;12847:6;12844:30;12841:117;;;12877:79;;:::i;:::-;12841:117;12982:62;13036:7;13027:6;13016:9;13012:22;12982:62;:::i;:::-;12972:72;;12767:287;12118:943;;;;;;;:::o;13067:115::-;13152:23;13169:5;13152:23;:::i;:::-;13147:3;13140:36;13067:115;;:::o;13188:218::-;13279:4;13317:2;13306:9;13302:18;13294:26;;13330:69;13396:1;13385:9;13381:17;13372:6;13330:69;:::i;:::-;13188:218;;;;:::o;13412:474::-;13480:6;13488;13537:2;13525:9;13516:7;13512:23;13508:32;13505:119;;;13543:79;;:::i;:::-;13505:119;13663:1;13688:53;13733:7;13724:6;13713:9;13709:22;13688:53;:::i;:::-;13678:63;;13634:117;13790:2;13816:53;13861:7;13852:6;13841:9;13837:22;13816:53;:::i;:::-;13806:63;;13761:118;13412:474;;;;;:::o;13892:60::-;13920:3;13941:5;13934:12;;13892:60;;;:::o;13958:142::-;14008:9;14041:53;14059:34;14068:24;14086:5;14068:24;:::i;:::-;14059:34;:::i;:::-;14041:53;:::i;:::-;14028:66;;13958:142;;;:::o;14106:126::-;14156:9;14189:37;14220:5;14189:37;:::i;:::-;14176:50;;14106:126;;;:::o;14238:141::-;14303:9;14336:37;14367:5;14336:37;:::i;:::-;14323:50;;14238:141;;;:::o;14385:161::-;14487:52;14533:5;14487:52;:::i;:::-;14482:3;14475:65;14385:161;;:::o;14552:252::-;14660:4;14698:2;14687:9;14683:18;14675:26;;14711:86;14794:1;14783:9;14779:17;14770:6;14711:86;:::i;:::-;14552:252;;;;:::o;14810:180::-;14858:77;14855:1;14848:88;14955:4;14952:1;14945:15;14979:4;14976:1;14969:15;14996:320;15040:6;15077:1;15071:4;15067:12;15057:22;;15124:1;15118:4;15114:12;15145:18;15135:81;;15201:4;15193:6;15189:17;15179:27;;15135:81;15263:2;15255:6;15252:14;15232:18;15229:38;15226:84;;15282:18;;:::i;:::-;15226:84;15047:269;14996:320;;;:::o;15322:220::-;15462:34;15458:1;15450:6;15446:14;15439:58;15531:3;15526:2;15518:6;15514:15;15507:28;15322:220;:::o;15548:366::-;15690:3;15711:67;15775:2;15770:3;15711:67;:::i;:::-;15704:74;;15787:93;15876:3;15787:93;:::i;:::-;15905:2;15900:3;15896:12;15889:19;;15548:366;;;:::o;15920:419::-;16086:4;16124:2;16113:9;16109:18;16101:26;;16173:9;16167:4;16163:20;16159:1;16148:9;16144:17;16137:47;16201:131;16327:4;16201:131;:::i;:::-;16193:139;;15920:419;;;:::o;16345:248::-;16485:34;16481:1;16473:6;16469:14;16462:58;16554:31;16549:2;16541:6;16537:15;16530:56;16345:248;:::o;16599:366::-;16741:3;16762:67;16826:2;16821:3;16762:67;:::i;:::-;16755:74;;16838:93;16927:3;16838:93;:::i;:::-;16956:2;16951:3;16947:12;16940:19;;16599:366;;;:::o;16971:419::-;17137:4;17175:2;17164:9;17160:18;17152:26;;17224:9;17218:4;17214:20;17210:1;17199:9;17195:17;17188:47;17252:131;17378:4;17252:131;:::i;:::-;17244:139;;16971:419;;;:::o;17396:232::-;17536:34;17532:1;17524:6;17520:14;17513:58;17605:15;17600:2;17592:6;17588:15;17581:40;17396:232;:::o;17634:366::-;17776:3;17797:67;17861:2;17856:3;17797:67;:::i;:::-;17790:74;;17873:93;17962:3;17873:93;:::i;:::-;17991:2;17986:3;17982:12;17975:19;;17634:366;;;:::o;18006:419::-;18172:4;18210:2;18199:9;18195:18;18187:26;;18259:9;18253:4;18249:20;18245:1;18234:9;18230:17;18223:47;18287:131;18413:4;18287:131;:::i;:::-;18279:139;;18006:419;;;:::o;18431:230::-;18571:34;18567:1;18559:6;18555:14;18548:58;18640:13;18635:2;18627:6;18623:15;18616:38;18431:230;:::o;18667:366::-;18809:3;18830:67;18894:2;18889:3;18830:67;:::i;:::-;18823:74;;18906:93;18995:3;18906:93;:::i;:::-;19024:2;19019:3;19015:12;19008:19;;18667:366;;;:::o;19039:419::-;19205:4;19243:2;19232:9;19228:18;19220:26;;19292:9;19286:4;19282:20;19278:1;19267:9;19263:17;19256:47;19320:131;19446:4;19320:131;:::i;:::-;19312:139;;19039:419;;;:::o;19464:231::-;19604:34;19600:1;19592:6;19588:14;19581:58;19673:14;19668:2;19660:6;19656:15;19649:39;19464:231;:::o;19701:366::-;19843:3;19864:67;19928:2;19923:3;19864:67;:::i;:::-;19857:74;;19940:93;20029:3;19940:93;:::i;:::-;20058:2;20053:3;20049:12;20042:19;;19701:366;;;:::o;20073:419::-;20239:4;20277:2;20266:9;20262:18;20254:26;;20326:9;20320:4;20316:20;20312:1;20301:9;20297:17;20290:47;20354:131;20480:4;20354:131;:::i;:::-;20346:139;;20073:419;;;:::o;20498:180::-;20546:77;20543:1;20536:88;20643:4;20640:1;20633:15;20667:4;20664:1;20657:15;20684:159;20824:11;20820:1;20812:6;20808:14;20801:35;20684:159;:::o;20849:365::-;20991:3;21012:66;21076:1;21071:3;21012:66;:::i;:::-;21005:73;;21087:93;21176:3;21087:93;:::i;:::-;21205:2;21200:3;21196:12;21189:19;;20849:365;;;:::o;21220:419::-;21386:4;21424:2;21413:9;21409:18;21401:26;;21473:9;21467:4;21463:20;21459:1;21448:9;21444:17;21437:47;21501:131;21627:4;21501:131;:::i;:::-;21493:139;;21220:419;;;:::o;21645:180::-;21693:77;21690:1;21683:88;21790:4;21787:1;21780:15;21814:4;21811:1;21804:15;21831:194;21871:4;21891:20;21909:1;21891:20;:::i;:::-;21886:25;;21925:20;21943:1;21925:20;:::i;:::-;21920:25;;21969:1;21966;21962:9;21954:17;;21993:1;21987:4;21984:11;21981:37;;;21998:18;;:::i;:::-;21981:37;21831:194;;;;:::o;22031:79::-;22070:7;22099:5;22088:16;;22031:79;;;:::o;22116:157::-;22221:45;22241:24;22259:5;22241:24;:::i;:::-;22221:45;:::i;:::-;22216:3;22209:58;22116:157;;:::o;22279:77::-;22316:7;22345:5;22334:16;;22279:77;;;:::o;22362:79::-;22401:7;22430:5;22419:16;;22362:79;;;:::o;22447:157::-;22552:45;22572:24;22590:5;22572:24;:::i;:::-;22552:45;:::i;:::-;22547:3;22540:58;22447:157;;:::o;22610:94::-;22643:8;22691:5;22687:2;22683:14;22662:35;;22610:94;;;:::o;22710:::-;22749:7;22778:20;22792:5;22778:20;:::i;:::-;22767:31;;22710:94;;;:::o;22810:100::-;22849:7;22878:26;22898:5;22878:26;:::i;:::-;22867:37;;22810:100;;;:::o;22916:157::-;23021:45;23041:24;23059:5;23041:24;:::i;:::-;23021:45;:::i;:::-;23016:3;23009:58;22916:157;;:::o;23079:820::-;23303:3;23318:75;23389:3;23380:6;23318:75;:::i;:::-;23418:2;23413:3;23409:12;23402:19;;23431:75;23502:3;23493:6;23431:75;:::i;:::-;23531:2;23526:3;23522:12;23515:19;;23544:75;23615:3;23606:6;23544:75;:::i;:::-;23644:2;23639:3;23635:12;23628:19;;23657:75;23728:3;23719:6;23657:75;:::i;:::-;23757:2;23752:3;23748:12;23741:19;;23770:75;23841:3;23832:6;23770:75;:::i;:::-;23870:2;23865:3;23861:12;23854:19;;23890:3;23883:10;;23079:820;;;;;;;;:::o;23905:180::-;23953:77;23950:1;23943:88;24050:4;24047:1;24040:15;24074:4;24071:1;24064:15;24091:176;24123:1;24140:20;24158:1;24140:20;:::i;:::-;24135:25;;24174:20;24192:1;24174:20;:::i;:::-;24169:25;;24213:1;24203:35;;24218:18;;:::i;:::-;24203:35;24259:1;24256;24252:9;24247:14;;24091:176;;;;:::o;24273:143::-;24330:5;24361:6;24355:13;24346:22;;24377:33;24404:5;24377:33;:::i;:::-;24273:143;;;;:::o;24422:351::-;24492:6;24541:2;24529:9;24520:7;24516:23;24512:32;24509:119;;;24547:79;;:::i;:::-;24509:119;24667:1;24692:64;24748:7;24739:6;24728:9;24724:22;24692:64;:::i;:::-;24682:74;;24638:128;24422:351;;;;:::o;24779:332::-;24900:4;24938:2;24927:9;24923:18;24915:26;;24951:71;25019:1;25008:9;25004:17;24995:6;24951:71;:::i;:::-;25032:72;25100:2;25089:9;25085:18;25076:6;25032:72;:::i;:::-;24779:332;;;;;:::o;25117:137::-;25171:5;25202:6;25196:13;25187:22;;25218:30;25242:5;25218:30;:::i;:::-;25117:137;;;;:::o;25260:345::-;25327:6;25376:2;25364:9;25355:7;25351:23;25347:32;25344:119;;;25382:79;;:::i;:::-;25344:119;25502:1;25527:61;25580:7;25571:6;25560:9;25556:22;25527:61;:::i;:::-;25517:71;;25473:125;25260:345;;;;:::o;25611:141::-;25660:4;25683:3;25675:11;;25706:3;25703:1;25696:14;25740:4;25737:1;25727:18;25719:26;;25611:141;;;:::o;25758:93::-;25795:6;25842:2;25837;25830:5;25826:14;25822:23;25812:33;;25758:93;;;:::o;25857:107::-;25901:8;25951:5;25945:4;25941:16;25920:37;;25857:107;;;;:::o;25970:393::-;26039:6;26089:1;26077:10;26073:18;26112:97;26142:66;26131:9;26112:97;:::i;:::-;26230:39;26260:8;26249:9;26230:39;:::i;:::-;26218:51;;26302:4;26298:9;26291:5;26287:21;26278:30;;26351:4;26341:8;26337:19;26330:5;26327:30;26317:40;;26046:317;;25970:393;;;;;:::o;26369:142::-;26419:9;26452:53;26470:34;26479:24;26497:5;26479:24;:::i;:::-;26470:34;:::i;:::-;26452:53;:::i;:::-;26439:66;;26369:142;;;:::o;26517:75::-;26560:3;26581:5;26574:12;;26517:75;;;:::o;26598:269::-;26708:39;26739:7;26708:39;:::i;:::-;26769:91;26818:41;26842:16;26818:41;:::i;:::-;26810:6;26803:4;26797:11;26769:91;:::i;:::-;26763:4;26756:105;26674:193;26598:269;;;:::o;26873:73::-;26918:3;26873:73;:::o;26952:189::-;27029:32;;:::i;:::-;27070:65;27128:6;27120;27114:4;27070:65;:::i;:::-;27005:136;26952:189;;:::o;27147:186::-;27207:120;27224:3;27217:5;27214:14;27207:120;;;27278:39;27315:1;27308:5;27278:39;:::i;:::-;27251:1;27244:5;27240:13;27231:22;;27207:120;;;27147:186;;:::o;27339:543::-;27440:2;27435:3;27432:11;27429:446;;;27474:38;27506:5;27474:38;:::i;:::-;27558:29;27576:10;27558:29;:::i;:::-;27548:8;27544:44;27741:2;27729:10;27726:18;27723:49;;;27762:8;27747:23;;27723:49;27785:80;27841:22;27859:3;27841:22;:::i;:::-;27831:8;27827:37;27814:11;27785:80;:::i;:::-;27444:431;;27429:446;27339:543;;;:::o;27888:117::-;27942:8;27992:5;27986:4;27982:16;27961:37;;27888:117;;;;:::o;28011:169::-;28055:6;28088:51;28136:1;28132:6;28124:5;28121:1;28117:13;28088:51;:::i;:::-;28084:56;28169:4;28163;28159:15;28149:25;;28062:118;28011:169;;;;:::o;28185:295::-;28261:4;28407:29;28432:3;28426:4;28407:29;:::i;:::-;28399:37;;28469:3;28466:1;28462:11;28456:4;28453:21;28445:29;;28185:295;;;;:::o;28485:1395::-;28602:37;28635:3;28602:37;:::i;:::-;28704:18;28696:6;28693:30;28690:56;;;28726:18;;:::i;:::-;28690:56;28770:38;28802:4;28796:11;28770:38;:::i;:::-;28855:67;28915:6;28907;28901:4;28855:67;:::i;:::-;28949:1;28973:4;28960:17;;29005:2;28997:6;28994:14;29022:1;29017:618;;;;29679:1;29696:6;29693:77;;;29745:9;29740:3;29736:19;29730:26;29721:35;;29693:77;29796:67;29856:6;29849:5;29796:67;:::i;:::-;29790:4;29783:81;29652:222;28987:887;;29017:618;29069:4;29065:9;29057:6;29053:22;29103:37;29135:4;29103:37;:::i;:::-;29162:1;29176:208;29190:7;29187:1;29184:14;29176:208;;;29269:9;29264:3;29260:19;29254:26;29246:6;29239:42;29320:1;29312:6;29308:14;29298:24;;29367:2;29356:9;29352:18;29339:31;;29213:4;29210:1;29206:12;29201:17;;29176:208;;;29412:6;29403:7;29400:19;29397:179;;;29470:9;29465:3;29461:19;29455:26;29513:48;29555:4;29547:6;29543:17;29532:9;29513:48;:::i;:::-;29505:6;29498:64;29420:156;29397:179;29622:1;29618;29610:6;29606:14;29602:22;29596:4;29589:36;29024:611;;;28987:887;;28577:1303;;;28485:1395;;:::o;29886:174::-;30026:26;30022:1;30014:6;30010:14;30003:50;29886:174;:::o;30066:366::-;30208:3;30229:67;30293:2;30288:3;30229:67;:::i;:::-;30222:74;;30305:93;30394:3;30305:93;:::i;:::-;30423:2;30418:3;30414:12;30407:19;;30066:366;;;:::o;30438:419::-;30604:4;30642:2;30631:9;30627:18;30619:26;;30691:9;30685:4;30681:20;30677:1;30666:9;30662:17;30655:47;30719:131;30845:4;30719:131;:::i;:::-;30711:139;;30438:419;;;:::o;30863:228::-;31003:34;30999:1;30991:6;30987:14;30980:58;31072:11;31067:2;31059:6;31055:15;31048:36;30863:228;:::o;31097:366::-;31239:3;31260:67;31324:2;31319:3;31260:67;:::i;:::-;31253:74;;31336:93;31425:3;31336:93;:::i;:::-;31454:2;31449:3;31445:12;31438:19;;31097:366;;;:::o;31469:419::-;31635:4;31673:2;31662:9;31658:18;31650:26;;31722:9;31716:4;31712:20;31708:1;31697:9;31693:17;31686:47;31750:131;31876:4;31750:131;:::i;:::-;31742:139;;31469:419;;;:::o;31894:171::-;32034:23;32030:1;32022:6;32018:14;32011:47;31894:171;:::o;32071:366::-;32213:3;32234:67;32298:2;32293:3;32234:67;:::i;:::-;32227:74;;32310:93;32399:3;32310:93;:::i;:::-;32428:2;32423:3;32419:12;32412:19;;32071:366;;;:::o;32443:419::-;32609:4;32647:2;32636:9;32632:18;32624:26;;32696:9;32690:4;32686:20;32682:1;32671:9;32667:17;32660:47;32724:131;32850:4;32724:131;:::i;:::-;32716:139;;32443:419;;;:::o;32868:156::-;33008:8;33004:1;32996:6;32992:14;32985:32;32868:156;:::o;33030:365::-;33172:3;33193:66;33257:1;33252:3;33193:66;:::i;:::-;33186:73;;33268:93;33357:3;33268:93;:::i;:::-;33386:2;33381:3;33377:12;33370:19;;33030:365;;;:::o;33401:419::-;33567:4;33605:2;33594:9;33590:18;33582:26;;33654:9;33648:4;33644:20;33640:1;33629:9;33625:17;33618:47;33682:131;33808:4;33682:131;:::i;:::-;33674:139;;33401:419;;;:::o;33826:169::-;33966:21;33962:1;33954:6;33950:14;33943:45;33826:169;:::o;34001:366::-;34143:3;34164:67;34228:2;34223:3;34164:67;:::i;:::-;34157:74;;34240:93;34329:3;34240:93;:::i;:::-;34358:2;34353:3;34349:12;34342:19;;34001:366;;;:::o;34373:419::-;34539:4;34577:2;34566:9;34562:18;34554:26;;34626:9;34620:4;34616:20;34612:1;34601:9;34597:17;34590:47;34654:131;34780:4;34654:131;:::i;:::-;34646:139;;34373:419;;;:::o;34798:191::-;34838:3;34857:20;34875:1;34857:20;:::i;:::-;34852:25;;34891:20;34909:1;34891:20;:::i;:::-;34886:25;;34934:1;34931;34927:9;34920:16;;34955:3;34952:1;34949:10;34946:36;;;34962:18;;:::i;:::-;34946:36;34798:191;;;;:::o;34995:168::-;35135:20;35131:1;35123:6;35119:14;35112:44;34995:168;:::o;35169:366::-;35311:3;35332:67;35396:2;35391:3;35332:67;:::i;:::-;35325:74;;35408:93;35497:3;35408:93;:::i;:::-;35526:2;35521:3;35517:12;35510:19;;35169:366;;;:::o;35541:419::-;35707:4;35745:2;35734:9;35730:18;35722:26;;35794:9;35788:4;35784:20;35780:1;35769:9;35765:17;35758:47;35822:131;35948:4;35822:131;:::i;:::-;35814:139;;35541:419;;;:::o;35966:164::-;36106:16;36102:1;36094:6;36090:14;36083:40;35966:164;:::o;36136:366::-;36278:3;36299:67;36363:2;36358:3;36299:67;:::i;:::-;36292:74;;36375:93;36464:3;36375:93;:::i;:::-;36493:2;36488:3;36484:12;36477:19;;36136:366;;;:::o;36508:419::-;36674:4;36712:2;36701:9;36697:18;36689:26;;36761:9;36755:4;36751:20;36747:1;36736:9;36732:17;36725:47;36789:131;36915:4;36789:131;:::i;:::-;36781:139;;36508:419;;;:::o;36933:410::-;36973:7;36996:20;37014:1;36996:20;:::i;:::-;36991:25;;37030:20;37048:1;37030:20;:::i;:::-;37025:25;;37085:1;37082;37078:9;37107:30;37125:11;37107:30;:::i;:::-;37096:41;;37286:1;37277:7;37273:15;37270:1;37267:22;37247:1;37240:9;37220:83;37197:139;;37316:18;;:::i;:::-;37197:139;36981:362;36933:410;;;;:::o;37349:168::-;37489:20;37485:1;37477:6;37473:14;37466:44;37349:168;:::o;37523:366::-;37665:3;37686:67;37750:2;37745:3;37686:67;:::i;:::-;37679:74;;37762:93;37851:3;37762:93;:::i;:::-;37880:2;37875:3;37871:12;37864:19;;37523:366;;;:::o;37895:419::-;38061:4;38099:2;38088:9;38084:18;38076:26;;38148:9;38142:4;38138:20;38134:1;38123:9;38119:17;38112:47;38176:131;38302:4;38176:131;:::i;:::-;38168:139;;37895:419;;;:::o;38320:233::-;38359:3;38382:24;38400:5;38382:24;:::i;:::-;38373:33;;38428:66;38421:5;38418:77;38415:103;;38498:18;;:::i;:::-;38415:103;38545:1;38538:5;38534:13;38527:20;;38320:233;;;:::o;38559:234::-;38699:34;38695:1;38687:6;38683:14;38676:58;38768:17;38763:2;38755:6;38751:15;38744:42;38559:234;:::o;38799:366::-;38941:3;38962:67;39026:2;39021:3;38962:67;:::i;:::-;38955:74;;39038:93;39127:3;39038:93;:::i;:::-;39156:2;39151:3;39147:12;39140:19;;38799:366;;;:::o;39171:419::-;39337:4;39375:2;39364:9;39360:18;39352:26;;39424:9;39418:4;39414:20;39410:1;39399:9;39395:17;39388:47;39452:131;39578:4;39452:131;:::i;:::-;39444:139;;39171:419;;;:::o;39596:148::-;39698:11;39735:3;39720:18;;39596:148;;;;:::o;39750:390::-;39856:3;39884:39;39917:5;39884:39;:::i;:::-;39939:89;40021:6;40016:3;39939:89;:::i;:::-;39932:96;;40037:65;40095:6;40090:3;40083:4;40076:5;40072:16;40037:65;:::i;:::-;40127:6;40122:3;40118:16;40111:23;;39860:280;39750:390;;;;:::o;40170:874::-;40273:3;40310:5;40304:12;40339:36;40365:9;40339:36;:::i;:::-;40391:89;40473:6;40468:3;40391:89;:::i;:::-;40384:96;;40511:1;40500:9;40496:17;40527:1;40522:166;;;;40702:1;40697:341;;;;40489:549;;40522:166;40606:4;40602:9;40591;40587:25;40582:3;40575:38;40668:6;40661:14;40654:22;40646:6;40642:35;40637:3;40633:45;40626:52;;40522:166;;40697:341;40764:38;40796:5;40764:38;:::i;:::-;40824:1;40838:154;40852:6;40849:1;40846:13;40838:154;;;40926:7;40920:14;40916:1;40911:3;40907:11;40900:35;40976:1;40967:7;40963:15;40952:26;;40874:4;40871:1;40867:12;40862:17;;40838:154;;;41021:6;41016:3;41012:16;41005:23;;40704:334;;40489:549;;40277:767;;40170:874;;;;:::o;41050:589::-;41275:3;41297:95;41388:3;41379:6;41297:95;:::i;:::-;41290:102;;41409:95;41500:3;41491:6;41409:95;:::i;:::-;41402:102;;41521:92;41609:3;41600:6;41521:92;:::i;:::-;41514:99;;41630:3;41623:10;;41050:589;;;;;;:::o;41645:225::-;41785:34;41781:1;41773:6;41769:14;41762:58;41854:8;41849:2;41841:6;41837:15;41830:33;41645:225;:::o;41876:366::-;42018:3;42039:67;42103:2;42098:3;42039:67;:::i;:::-;42032:74;;42115:93;42204:3;42115:93;:::i;:::-;42233:2;42228:3;42224:12;42217:19;;41876:366;;;:::o;42248:419::-;42414:4;42452:2;42441:9;42437:18;42429:26;;42501:9;42495:4;42491:20;42487:1;42476:9;42472:17;42465:47;42529:131;42655:4;42529:131;:::i;:::-;42521:139;;42248:419;;;:::o;42673:182::-;42813:34;42809:1;42801:6;42797:14;42790:58;42673:182;:::o;42861:366::-;43003:3;43024:67;43088:2;43083:3;43024:67;:::i;:::-;43017:74;;43100:93;43189:3;43100:93;:::i;:::-;43218:2;43213:3;43209:12;43202:19;;42861:366;;;:::o;43233:419::-;43399:4;43437:2;43426:9;43422:18;43414:26;;43486:9;43480:4;43476:20;43472:1;43461:9;43457:17;43450:47;43514:131;43640:4;43514:131;:::i;:::-;43506:139;;43233:419;;;:::o;43658:224::-;43798:34;43794:1;43786:6;43782:14;43775:58;43867:7;43862:2;43854:6;43850:15;43843:32;43658:224;:::o;43888:366::-;44030:3;44051:67;44115:2;44110:3;44051:67;:::i;:::-;44044:74;;44127:93;44216:3;44127:93;:::i;:::-;44245:2;44240:3;44236:12;44229:19;;43888:366;;;:::o;44260:419::-;44426:4;44464:2;44453:9;44449:18;44441:26;;44513:9;44507:4;44503:20;44499:1;44488:9;44484:17;44477:47;44541:131;44667:4;44541:131;:::i;:::-;44533:139;;44260:419;;;:::o;44685:223::-;44825:34;44821:1;44813:6;44809:14;44802:58;44894:6;44889:2;44881:6;44877:15;44870:31;44685:223;:::o;44914:366::-;45056:3;45077:67;45141:2;45136:3;45077:67;:::i;:::-;45070:74;;45153:93;45242:3;45153:93;:::i;:::-;45271:2;45266:3;45262:12;45255:19;;44914:366;;;:::o;45286:419::-;45452:4;45490:2;45479:9;45475:18;45467:26;;45539:9;45533:4;45529:20;45525:1;45514:9;45510:17;45503:47;45567:131;45693:4;45567:131;:::i;:::-;45559:139;;45286:419;;;:::o;45711:181::-;45851:33;45847:1;45839:6;45835:14;45828:57;45711:181;:::o;45898:366::-;46040:3;46061:67;46125:2;46120:3;46061:67;:::i;:::-;46054:74;;46137:93;46226:3;46137:93;:::i;:::-;46255:2;46250:3;46246:12;46239:19;;45898:366;;;:::o;46270:419::-;46436:4;46474:2;46463:9;46459:18;46451:26;;46523:9;46517:4;46513:20;46509:1;46498:9;46494:17;46487:47;46551:131;46677:4;46551:131;:::i;:::-;46543:139;;46270:419;;;:::o;46695:175::-;46835:27;46831:1;46823:6;46819:14;46812:51;46695:175;:::o;46876:366::-;47018:3;47039:67;47103:2;47098:3;47039:67;:::i;:::-;47032:74;;47115:93;47204:3;47115:93;:::i;:::-;47233:2;47228:3;47224:12;47217:19;;46876:366;;;:::o;47248:419::-;47414:4;47452:2;47441:9;47437:18;47429:26;;47501:9;47495:4;47491:20;47487:1;47476:9;47472:17;47465:47;47529:131;47655:4;47529:131;:::i;:::-;47521:139;;47248:419;;;:::o;47673:237::-;47813:34;47809:1;47801:6;47797:14;47790:58;47882:20;47877:2;47869:6;47865:15;47858:45;47673:237;:::o;47916:366::-;48058:3;48079:67;48143:2;48138:3;48079:67;:::i;:::-;48072:74;;48155:93;48244:3;48155:93;:::i;:::-;48273:2;48268:3;48264:12;48257:19;;47916:366;;;:::o;48288:419::-;48454:4;48492:2;48481:9;48477:18;48469:26;;48541:9;48535:4;48531:20;48527:1;48516:9;48512:17;48505:47;48569:131;48695:4;48569:131;:::i;:::-;48561:139;;48288:419;;;:::o;48713:240::-;48853:34;48849:1;48841:6;48837:14;48830:58;48922:23;48917:2;48909:6;48905:15;48898:48;48713:240;:::o;48959:366::-;49101:3;49122:67;49186:2;49181:3;49122:67;:::i;:::-;49115:74;;49198:93;49287:3;49198:93;:::i;:::-;49316:2;49311:3;49307:12;49300:19;;48959:366;;;:::o;49331:419::-;49497:4;49535:2;49524:9;49520:18;49512:26;;49584:9;49578:4;49574:20;49570:1;49559:9;49555:17;49548:47;49612:131;49738:4;49612:131;:::i;:::-;49604:139;;49331:419;;;:::o;49756:98::-;49807:6;49841:5;49835:12;49825:22;;49756:98;;;:::o;49860:168::-;49943:11;49977:6;49972:3;49965:19;50017:4;50012:3;50008:14;49993:29;;49860:168;;;;:::o;50034:373::-;50120:3;50148:38;50180:5;50148:38;:::i;:::-;50202:70;50265:6;50260:3;50202:70;:::i;:::-;50195:77;;50281:65;50339:6;50334:3;50327:4;50320:5;50316:16;50281:65;:::i;:::-;50371:29;50393:6;50371:29;:::i;:::-;50366:3;50362:39;50355:46;;50124:283;50034:373;;;;:::o;50413:640::-;50608:4;50646:3;50635:9;50631:19;50623:27;;50660:71;50728:1;50717:9;50713:17;50704:6;50660:71;:::i;:::-;50741:72;50809:2;50798:9;50794:18;50785:6;50741:72;:::i;:::-;50823;50891:2;50880:9;50876:18;50867:6;50823:72;:::i;:::-;50942:9;50936:4;50932:20;50927:2;50916:9;50912:18;50905:48;50970:76;51041:4;51032:6;50970:76;:::i;:::-;50962:84;;50413:640;;;;;;;:::o;51059:141::-;51115:5;51146:6;51140:13;51131:22;;51162:32;51188:5;51162:32;:::i;:::-;51059:141;;;;:::o;51206:349::-;51275:6;51324:2;51312:9;51303:7;51299:23;51295:32;51292:119;;;51330:79;;:::i;:::-;51292:119;51450:1;51475:63;51530:7;51521:6;51510:9;51506:22;51475:63;:::i;:::-;51465:73;;51421:127;51206:349;;;;:::o;51561:180::-;51609:77;51606:1;51599:88;51706:4;51703:1;51696:15;51730:4;51727:1;51720:15;51747:182;51887:34;51883:1;51875:6;51871:14;51864:58;51747:182;:::o;51935:366::-;52077:3;52098:67;52162:2;52157:3;52098:67;:::i;:::-;52091:74;;52174:93;52263:3;52174:93;:::i;:::-;52292:2;52287:3;52283:12;52276:19;;51935:366;;;:::o;52307:419::-;52473:4;52511:2;52500:9;52496:18;52488:26;;52560:9;52554:4;52550:20;52546:1;52535:9;52531:17;52524:47;52588:131;52714:4;52588:131;:::i;:::-;52580:139;;52307:419;;;:::o;52732:178::-;52872:30;52868:1;52860:6;52856:14;52849:54;52732:178;:::o;52916:366::-;53058:3;53079:67;53143:2;53138:3;53079:67;:::i;:::-;53072:74;;53155:93;53244:3;53155:93;:::i;:::-;53273:2;53268:3;53264:12;53257:19;;52916:366;;;:::o;53288:419::-;53454:4;53492:2;53481:9;53477:18;53469:26;;53541:9;53535:4;53531:20;53527:1;53516:9;53512:17;53505:47;53569:131;53695:4;53569:131;:::i;:::-;53561:139;;53288:419;;;:::o

Swarm Source

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