MATIC Price: $1.01 (-2.96%)
Gas: 133 GWei
 

Overview

TokenID

4839

Total Transfers

-

Market

Fully Diluted Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
CoinllectiblesToken

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2023-07-12
*/

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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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


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


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

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


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

// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}


// contracts/Coinllectibles.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.7;

contract CoinllectiblesToken is ERC721Enumerable, IERC2981, Ownable {
    mapping (uint256 => string) private Items;
    string private ContractURI;
    address public RoyaltyAddress;
    uint96 public RoyaltyPercentage; // *10

    constructor (string memory name, string memory symbol, uint96 royaltyPercentage, address royaltyAddress) ERC721(name, symbol){     
        require(royaltyAddress != address(0));
        require(royaltyPercentage > 0);
        
        RoyaltyAddress = royaltyAddress;
        RoyaltyPercentage = royaltyPercentage;
    }

    event itemCreated(uint256 tokenId, string tokenUri, address owner, address royaltyAddress, uint96 royaltyPercentage);
    event itemsCreated(uint256[] tokenIds, string[] tokenUris, address owner, address royaltyAddress, uint96 royaltyPercentage);
    event itemsUpdated(uint256[] tokenIds, string[] tokenUris);

    function createItem( string memory uri, address owner) public onlyOwner {
        uint256 newItemId = totalSupply();
        _safeMint(owner, newItemId);
      
        Items[newItemId] = uri;

        emit itemCreated(newItemId, uri, owner, RoyaltyAddress, RoyaltyPercentage);
    }

    function createItems(string[] memory tokenUris, address owner) public onlyOwner {
        require(tokenUris.length > 0, "The token URIs is not valid");
        uint256[] memory newItems = new uint256[](tokenUris.length);

        for (uint256 i = 0; i < tokenUris.length; i++) {
            uint256 newItemId = totalSupply();
            _safeMint(owner, newItemId);

            Items[newItemId] = tokenUris[i]; 

            newItems[i] = newItemId;
        }

        emit itemsCreated(newItems, tokenUris, owner, RoyaltyAddress, RoyaltyPercentage);
    }

    function updateItems(uint256[] memory tokenIds, string[] memory tokenUris) public onlyOwner{
        require(tokenUris.length > 0, "The token URIs is not valid");
        require(tokenUris.length == tokenIds.length, "The input data is not valid");

        for(uint256 i = 0; i < tokenUris.length; i++){            
            Items[tokenIds[i]] = tokenUris[i];
        }

        emit itemsUpdated(tokenIds, tokenUris);
    }  


    function setApprovalForItems(address to, uint256[] memory tokenIds) public{
        require(tokenIds.length > 0, "The input data is incorrect");
        
        for(uint256 i = 0; i < tokenIds.length; i++){
            require(_isApprovedOrOwner(msg.sender, tokenIds[i]), "You are not owner of item");

            _approve(to, tokenIds[i]);
        }
    }

    function transfers(address[] memory froms, address[] memory tos, uint256[] memory tokenIds) public{
        require(froms.length == tos.length, "The input data is incorrect");
        require(tokenIds.length == tos.length, "The input data is incorrect");

        for(uint256 i = 0; i < froms.length; i++){
            require(_isApprovedOrOwner(msg.sender, tokenIds[i]), "You are not owner of item");

            _transfer(froms[i], tos[i], tokenIds[i]);
        }
    }

    function changeRoyaltyReceiver(address royaltyAddress) onlyOwner public{
        require(royaltyAddress != address(0));
        RoyaltyAddress = royaltyAddress;
    }

     function changeRoyaltyPercentage(uint96 royaltyPercentage) onlyOwner public{
        require(royaltyPercentage > 0);
        RoyaltyPercentage = royaltyPercentage;
    }

    function setContractURI(string memory contractUri) public onlyOwner{
        ContractURI = contractUri;
    }


    // view function
    function tokenURI(uint256 tokenId) public view override returns (string memory)
    {
        require(_exists(tokenId), "No token ID exists");
        return Items[tokenId];
    }

    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view override returns (address receiver, uint256 royaltyAmount)
    {
        require(_exists(tokenId), "No token ID exists");
        return (RoyaltyAddress, (salePrice * RoyaltyPercentage) / 1000);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721Enumerable) returns (bool)
    {
        return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
    }

    function contractURI() public view returns (string memory) {
        return ContractURI;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint96","name":"royaltyPercentage","type":"uint96"},{"internalType":"address","name":"royaltyAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"tokenUri","type":"string"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"royaltyAddress","type":"address"},{"indexed":false,"internalType":"uint96","name":"royaltyPercentage","type":"uint96"}],"name":"itemCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"string[]","name":"tokenUris","type":"string[]"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"royaltyAddress","type":"address"},{"indexed":false,"internalType":"uint96","name":"royaltyPercentage","type":"uint96"}],"name":"itemsCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"string[]","name":"tokenUris","type":"string[]"}],"name":"itemsUpdated","type":"event"},{"inputs":[],"name":"RoyaltyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RoyaltyPercentage","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint96","name":"royaltyPercentage","type":"uint96"}],"name":"changeRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"royaltyAddress","type":"address"}],"name":"changeRoyaltyReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"},{"internalType":"address","name":"owner","type":"address"}],"name":"createItem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"tokenUris","type":"string[]"},{"internalType":"address","name":"owner","type":"address"}],"name":"createItems","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"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":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"setApprovalForItems","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"contractUri","type":"string"}],"name":"setContractURI","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":[{"internalType":"address[]","name":"froms","type":"address[]"},{"internalType":"address[]","name":"tos","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"transfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"tokenUris","type":"string[]"}],"name":"updateItems","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162004dbe38038062004dbe83398181016040528101906200003791906200038a565b83838160009080519060200190620000519291906200022e565b5080600190805190602001906200006a9291906200022e565b5050506200008d620000816200016060201b60201c565b6200016860201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620000c857600080fd5b6000826bffffffffffffffffffffffff1611620000e457600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600d60146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550505050506200063e565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200023c906200051b565b90600052602060002090601f016020900481019282620002605760008555620002ac565b82601f106200027b57805160ff1916838001178555620002ac565b82800160010185558215620002ac579182015b82811115620002ab5782518255916020019190600101906200028e565b5b509050620002bb9190620002bf565b5090565b5b80821115620002da576000816000905550600101620002c0565b5090565b6000620002f5620002ef8462000463565b6200043a565b905082815260208101848484011115620003145762000313620005ea565b5b62000321848285620004e5565b509392505050565b6000815190506200033a816200060a565b92915050565b600082601f830112620003585762000357620005e5565b5b81516200036a848260208601620002de565b91505092915050565b600081519050620003848162000624565b92915050565b60008060008060808587031215620003a757620003a6620005f4565b5b600085015167ffffffffffffffff811115620003c857620003c7620005ef565b5b620003d68782880162000340565b945050602085015167ffffffffffffffff811115620003fa57620003f9620005ef565b5b620004088782880162000340565b93505060406200041b8782880162000373565b92505060606200042e8782880162000329565b91505092959194509250565b60006200044662000459565b905062000454828262000551565b919050565b6000604051905090565b600067ffffffffffffffff821115620004815762000480620005b6565b5b6200048c82620005f9565b9050602081019050919050565b6000620004a682620004ad565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006bffffffffffffffffffffffff82169050919050565b60005b8381101562000505578082015181840152602081019050620004e8565b8381111562000515576000848401525b50505050565b600060028204905060018216806200053457607f821691505b602082108114156200054b576200054a62000587565b5b50919050565b6200055c82620005f9565b810181811067ffffffffffffffff821117156200057e576200057d620005b6565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b620006158162000499565b81146200062157600080fd5b50565b6200062f81620004cd565b81146200063b57600080fd5b50565b614770806200064e6000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c8063788c51cc1161010f578063c87b56dd116100a2578063e985e9c511610071578063e985e9c514610579578063f0414a99146105a9578063f2fde38b146105c7578063fb54453b146105e3576101e5565b8063c87b56dd146104f3578063dd34844514610523578063e1610f751461053f578063e8a3d4851461055b576101e5565b8063938e3d7b116100de578063938e3d7b1461048157806395d89b411461049d578063a22cb465146104bb578063b88d4fde146104d7576101e5565b8063788c51cc1461040d5780637f58e9111461042b5780638da5cb5b1461044757806392754a2614610465576101e5565b80632a55205a116101875780634f6ccce7116101565780634f6ccce7146103735780636352211e146103a357806370a08231146103d3578063715018a614610403576101e5565b80632a55205a146102da5780632f745c591461030b57806342842e0e1461033b57806343607b3014610357576101e5565b8063095ea7b3116101c3578063095ea7b31461026857806318160ddd14610284578063217ab9d2146102a257806323b872dd146102be576101e5565b806301ffc9a7146101ea57806306fdde031461021a578063081812fc14610238575b600080fd5b61020460048036038101906101ff9190613183565b6105ff565b6040516102119190613918565b60405180910390f35b610222610679565b60405161022f9190613933565b60405180910390f35b610252600480360381019061024d9190613282565b61070b565b60405161025f91906137f0565b60405180910390f35b610282600480360381019061027d9190612fc8565b610751565b005b61028c610869565b6040516102999190613bf5565b60405180910390f35b6102bc60048036038101906102b79190613008565b610876565b005b6102d860048036038101906102d39190612e56565b6109df565b005b6102f460048036038101906102ef91906132af565b610a3f565b604051610302929190613857565b60405180910390f35b61032560048036038101906103209190612fc8565b610af9565b6040516103329190613bf5565b60405180910390f35b61035560048036038101906103509190612e56565b610b9e565b005b610371600480360381019061036c91906132ef565b610bbe565b005b61038d60048036038101906103889190613282565b610c15565b60405161039a9190613bf5565b60405180910390f35b6103bd60048036038101906103b89190613282565b610c86565b6040516103ca91906137f0565b60405180910390f35b6103ed60048036038101906103e89190612de9565b610d0d565b6040516103fa9190613bf5565b60405180910390f35b61040b610dc5565b005b610415610dd9565b6040516104229190613c6a565b60405180910390f35b610445600480360381019061044091906130af565b610df7565b005b61044f610faa565b60405161045c91906137f0565b60405180910390f35b61047f600480360381019061047a9190612de9565b610fd4565b005b61049b600480360381019061049691906131dd565b61105a565b005b6104a561107c565b6040516104b29190613933565b60405180910390f35b6104d560048036038101906104d09190612f88565b61110e565b005b6104f160048036038101906104ec9190612ea9565b611124565b005b61050d60048036038101906105089190613282565b611186565b60405161051a9190613933565b60405180910390f35b61053d60048036038101906105389190612f2c565b611273565b005b6105596004803603810190610554919061310b565b611362565b005b6105636114ab565b6040516105709190613933565b60405180910390f35b610593600480360381019061058e9190612e16565b61153d565b6040516105a09190613918565b60405180910390f35b6105b16115d1565b6040516105be91906137f0565b60405180910390f35b6105e160048036038101906105dc9190612de9565b6115f7565b005b6105fd60048036038101906105f89190613226565b61167b565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610672575061067182611741565b5b9050919050565b60606000805461068890613fd8565b80601f01602080910402602001604051908101604052809291908181526020018280546106b490613fd8565b80156107015780601f106106d657610100808354040283529160200191610701565b820191906000526020600020905b8154815290600101906020018083116106e457829003601f168201915b5050505050905090565b6000610716826117bb565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061075c82610c86565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c490613b75565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107ec611806565b73ffffffffffffffffffffffffffffffffffffffff16148061081b575061081a81610815611806565b61153d565b5b61085a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085190613b95565b60405180910390fd5b610864838361180e565b505050565b6000600880549050905090565b81518351146108ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b190613a15565b60405180910390fd5b81518151146108fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f590613a15565b60405180910390fd5b60005b83518110156109d95761092e3383838151811061092157610920614140565b5b60200260200101516118c7565b61096d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096490613a35565b60405180910390fd5b6109c684828151811061098357610982614140565b5b602002602001015184838151811061099e5761099d614140565b5b60200260200101518484815181106109b9576109b8614140565b5b602002602001015161195c565b80806109d19061403b565b915050610901565b50505050565b6109f06109ea611806565b826118c7565b610a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2690613955565b60405180910390fd5b610a3a83838361195c565b505050565b600080610a4b84611c56565b610a8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8190613ab5565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166103e8600d60149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff1685610ae49190613e7c565b610aee9190613e4b565b915091509250929050565b6000610b0483610d0d565b8210610b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3c90613975565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610bb983838360405180602001604052806000815250611124565b505050565b610bc6611c97565b6000816bffffffffffffffffffffffff1611610be157600080fd5b80600d60146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555050565b6000610c1f610869565b8210610c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5790613bb5565b60405180910390fd5b60088281548110610c7457610c73614140565b5b90600052602060002001549050919050565b600080610c9283611d15565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfb90613b55565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7590613ad5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610dcd611c97565b610dd76000611d52565b565b600d60149054906101000a90046bffffffffffffffffffffffff1681565b610dff611c97565b6000825111610e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3a90613a95565b60405180910390fd5b6000825167ffffffffffffffff811115610e6057610e5f61416f565b5b604051908082528060200260200182016040528015610e8e5781602001602082028036833780820191505090505b50905060005b8351811015610f29576000610ea7610869565b9050610eb38482611e18565b848281518110610ec657610ec5614140565b5b6020026020010151600b60008381526020019081526020016000209080519060200190610ef49291906129f0565b5080838381518110610f0957610f08614140565b5b602002602001018181525050508080610f219061403b565b915050610e94565b507f287338e49ba50a36742de644e6bd28823e9102c35df360b08e65f6df6690b7c7818484600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d60149054906101000a90046bffffffffffffffffffffffff16604051610f9d9594939291906138b7565b60405180910390a1505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610fdc611c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561101657600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611062611c97565b80600c90805190602001906110789291906129f0565b5050565b60606001805461108b90613fd8565b80601f01602080910402602001604051908101604052809291908181526020018280546110b790613fd8565b80156111045780601f106110d957610100808354040283529160200191611104565b820191906000526020600020905b8154815290600101906020018083116110e757829003601f168201915b5050505050905090565b611120611119611806565b8383611e36565b5050565b61113561112f611806565b836118c7565b611174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116b90613955565b60405180910390fd5b61118084848484611fa3565b50505050565b606061119182611c56565b6111d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c790613ab5565b60405180910390fd5b600b600083815260200190815260200160002080546111ee90613fd8565b80601f016020809104026020016040519081016040528092919081815260200182805461121a90613fd8565b80156112675780601f1061123c57610100808354040283529160200191611267565b820191906000526020600020905b81548152906001019060200180831161124a57829003601f168201915b50505050509050919050565b60008151116112b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ae90613a15565b60405180910390fd5b60005b815181101561135d576112e7338383815181106112da576112d9614140565b5b60200260200101516118c7565b611326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131d90613a35565b60405180910390fd5b61134a8383838151811061133d5761133c614140565b5b602002602001015161180e565b80806113559061403b565b9150506112ba565b505050565b61136a611c97565b60008151116113ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a590613a95565b60405180910390fd5b81518151146113f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e990613af5565b60405180910390fd5b60005b815181101561146d5781818151811061141157611410614140565b5b6020026020010151600b60008584815181106114305761142f614140565b5b6020026020010151815260200190815260200160002090805190602001906114599291906129f0565b5080806114659061403b565b9150506113f5565b507f1adcc97d769b884a6d188c4a8b1134ee27069ee44aec2383d742ae4ba2b02f67828260405161149f929190613880565b60405180910390a15050565b6060600c80546114ba90613fd8565b80601f01602080910402602001604051908101604052809291908181526020018280546114e690613fd8565b80156115335780601f1061150857610100808354040283529160200191611533565b820191906000526020600020905b81548152906001019060200180831161151657829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6115ff611c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561166f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611666906139b5565b60405180910390fd5b61167881611d52565b50565b611683611c97565b600061168d610869565b90506116998282611e18565b82600b600083815260200190815260200160002090805190602001906116c09291906129f0565b507f4c2070fe1703dea1ee75e5ae890d9f8cbf543b4286f35cce392b633136b211c7818484600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d60149054906101000a90046bffffffffffffffffffffffff16604051611734959493929190613c10565b60405180910390a1505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806117b457506117b382611fff565b5b9050919050565b6117c481611c56565b611803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fa90613b55565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661188183610c86565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806118d383610c86565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806119155750611914818561153d565b5b8061195357508373ffffffffffffffffffffffffffffffffffffffff1661193b8461070b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661197c82610c86565b73ffffffffffffffffffffffffffffffffffffffff16146119d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c9906139d5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3990613a55565b60405180910390fd5b611a4f83838360016120e1565b8273ffffffffffffffffffffffffffffffffffffffff16611a6f82610c86565b73ffffffffffffffffffffffffffffffffffffffff1614611ac5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abc906139d5565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c518383836001612241565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff16611c7883611d15565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b611c9f611806565b73ffffffffffffffffffffffffffffffffffffffff16611cbd610faa565b73ffffffffffffffffffffffffffffffffffffffff1614611d13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0a90613b35565b60405180910390fd5b565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e32828260405180602001604052806000815250612247565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9c90613a75565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f969190613918565b60405180910390a3505050565b611fae84848461195c565b611fba848484846122a2565b611ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff090613995565b60405180910390fd5b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806120ca57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806120da57506120d982612439565b5b9050919050565b6120ed848484846124a3565b6001811115612131576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212890613bd5565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561217957612174816124a9565b6121b8565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146121b7576121b685826124f2565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156121fb576121f68161265f565b61223a565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612239576122388482612730565b5b5b5050505050565b50505050565b61225183836127af565b61225e60008484846122a2565b61229d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229490613995565b60405180910390fd5b505050565b60006122c38473ffffffffffffffffffffffffffffffffffffffff166129cd565b1561242c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122ec611806565b8786866040518563ffffffff1660e01b815260040161230e949392919061380b565b602060405180830381600087803b15801561232857600080fd5b505af192505050801561235957506040513d601f19601f8201168201806040525081019061235691906131b0565b60015b6123dc573d8060008114612389576040519150601f19603f3d011682016040523d82523d6000602084013e61238e565b606091505b506000815114156123d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cb90613995565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612431565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016124ff84610d0d565b6125099190613ed6565b90506000600760008481526020019081526020016000205490508181146125ee576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506126739190613ed6565b90506000600960008481526020019081526020016000205490506000600883815481106126a3576126a2614140565b5b9060005260206000200154905080600883815481106126c5576126c4614140565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061271457612713614111565b5b6001900381819060005260206000200160009055905550505050565b600061273b83610d0d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561281f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281690613b15565b60405180910390fd5b61282881611c56565b15612868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285f906139f5565b60405180910390fd5b6128766000838360016120e1565b61287f81611c56565b156128bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b6906139f5565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129c9600083836001612241565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546129fc90613fd8565b90600052602060002090601f016020900481019282612a1e5760008555612a65565b82601f10612a3757805160ff1916838001178555612a65565b82800160010185558215612a65579182015b82811115612a64578251825591602001919060010190612a49565b5b509050612a729190612a76565b5090565b5b80821115612a8f576000816000905550600101612a77565b5090565b6000612aa6612aa184613caa565b613c85565b90508083825260208201905082856020860282011115612ac957612ac86141a3565b5b60005b85811015612af95781612adf8882612c85565b845260208401935060208301925050600181019050612acc565b5050509392505050565b6000612b16612b1184613cd6565b613c85565b90508083825260208201905082856020860282011115612b3957612b386141a3565b5b60005b85811015612b8757813567ffffffffffffffff811115612b5f57612b5e61419e565b5b808601612b6c8982612d91565b85526020850194506020840193505050600181019050612b3c565b5050509392505050565b6000612ba4612b9f84613d02565b613c85565b90508083825260208201905082856020860282011115612bc757612bc66141a3565b5b60005b85811015612bf75781612bdd8882612dbf565b845260208401935060208301925050600181019050612bca565b5050509392505050565b6000612c14612c0f84613d2e565b613c85565b905082815260208101848484011115612c3057612c2f6141a8565b5b612c3b848285613f96565b509392505050565b6000612c56612c5184613d5f565b613c85565b905082815260208101848484011115612c7257612c716141a8565b5b612c7d848285613f96565b509392505050565b600081359050612c94816146c7565b92915050565b600082601f830112612caf57612cae61419e565b5b8135612cbf848260208601612a93565b91505092915050565b600082601f830112612cdd57612cdc61419e565b5b8135612ced848260208601612b03565b91505092915050565b600082601f830112612d0b57612d0a61419e565b5b8135612d1b848260208601612b91565b91505092915050565b600081359050612d33816146de565b92915050565b600081359050612d48816146f5565b92915050565b600081519050612d5d816146f5565b92915050565b600082601f830112612d7857612d7761419e565b5b8135612d88848260208601612c01565b91505092915050565b600082601f830112612da657612da561419e565b5b8135612db6848260208601612c43565b91505092915050565b600081359050612dce8161470c565b92915050565b600081359050612de381614723565b92915050565b600060208284031215612dff57612dfe6141b2565b5b6000612e0d84828501612c85565b91505092915050565b60008060408385031215612e2d57612e2c6141b2565b5b6000612e3b85828601612c85565b9250506020612e4c85828601612c85565b9150509250929050565b600080600060608486031215612e6f57612e6e6141b2565b5b6000612e7d86828701612c85565b9350506020612e8e86828701612c85565b9250506040612e9f86828701612dbf565b9150509250925092565b60008060008060808587031215612ec357612ec26141b2565b5b6000612ed187828801612c85565b9450506020612ee287828801612c85565b9350506040612ef387828801612dbf565b925050606085013567ffffffffffffffff811115612f1457612f136141ad565b5b612f2087828801612d63565b91505092959194509250565b60008060408385031215612f4357612f426141b2565b5b6000612f5185828601612c85565b925050602083013567ffffffffffffffff811115612f7257612f716141ad565b5b612f7e85828601612cf6565b9150509250929050565b60008060408385031215612f9f57612f9e6141b2565b5b6000612fad85828601612c85565b9250506020612fbe85828601612d24565b9150509250929050565b60008060408385031215612fdf57612fde6141b2565b5b6000612fed85828601612c85565b9250506020612ffe85828601612dbf565b9150509250929050565b600080600060608486031215613021576130206141b2565b5b600084013567ffffffffffffffff81111561303f5761303e6141ad565b5b61304b86828701612c9a565b935050602084013567ffffffffffffffff81111561306c5761306b6141ad565b5b61307886828701612c9a565b925050604084013567ffffffffffffffff811115613099576130986141ad565b5b6130a586828701612cf6565b9150509250925092565b600080604083850312156130c6576130c56141b2565b5b600083013567ffffffffffffffff8111156130e4576130e36141ad565b5b6130f085828601612cc8565b925050602061310185828601612c85565b9150509250929050565b60008060408385031215613122576131216141b2565b5b600083013567ffffffffffffffff8111156131405761313f6141ad565b5b61314c85828601612cf6565b925050602083013567ffffffffffffffff81111561316d5761316c6141ad565b5b61317985828601612cc8565b9150509250929050565b600060208284031215613199576131986141b2565b5b60006131a784828501612d39565b91505092915050565b6000602082840312156131c6576131c56141b2565b5b60006131d484828501612d4e565b91505092915050565b6000602082840312156131f3576131f26141b2565b5b600082013567ffffffffffffffff811115613211576132106141ad565b5b61321d84828501612d91565b91505092915050565b6000806040838503121561323d5761323c6141b2565b5b600083013567ffffffffffffffff81111561325b5761325a6141ad565b5b61326785828601612d91565b925050602061327885828601612c85565b9150509250929050565b600060208284031215613298576132976141b2565b5b60006132a684828501612dbf565b91505092915050565b600080604083850312156132c6576132c56141b2565b5b60006132d485828601612dbf565b92505060206132e585828601612dbf565b9150509250929050565b600060208284031215613305576133046141b2565b5b600061331384828501612dd4565b91505092915050565b60006133288383613472565b905092915050565b600061333c83836137c3565b60208301905092915050565b61335181613f0a565b82525050565b600061336282613db0565b61336c8185613df6565b93508360208202850161337e85613d90565b8060005b858110156133ba578484038952815161339b858261331c565b94506133a683613ddc565b925060208a01995050600181019050613382565b50829750879550505050505092915050565b60006133d782613dbb565b6133e18185613e07565b93506133ec83613da0565b8060005b8381101561341d5781516134048882613330565b975061340f83613de9565b9250506001810190506133f0565b5085935050505092915050565b61343381613f1c565b82525050565b600061344482613dc6565b61344e8185613e18565b935061345e818560208601613fa5565b613467816141b7565b840191505092915050565b600061347d82613dd1565b6134878185613e29565b9350613497818560208601613fa5565b6134a0816141b7565b840191505092915050565b60006134b682613dd1565b6134c08185613e3a565b93506134d0818560208601613fa5565b6134d9816141b7565b840191505092915050565b60006134f1602d83613e3a565b91506134fc826141c8565b604082019050919050565b6000613514602b83613e3a565b915061351f82614217565b604082019050919050565b6000613537603283613e3a565b915061354282614266565b604082019050919050565b600061355a602683613e3a565b9150613565826142b5565b604082019050919050565b600061357d602583613e3a565b915061358882614304565b604082019050919050565b60006135a0601c83613e3a565b91506135ab82614353565b602082019050919050565b60006135c3601b83613e3a565b91506135ce8261437c565b602082019050919050565b60006135e6601983613e3a565b91506135f1826143a5565b602082019050919050565b6000613609602483613e3a565b9150613614826143ce565b604082019050919050565b600061362c601983613e3a565b91506136378261441d565b602082019050919050565b600061364f601b83613e3a565b915061365a82614446565b602082019050919050565b6000613672601283613e3a565b915061367d8261446f565b602082019050919050565b6000613695602983613e3a565b91506136a082614498565b604082019050919050565b60006136b8601b83613e3a565b91506136c3826144e7565b602082019050919050565b60006136db602083613e3a565b91506136e682614510565b602082019050919050565b60006136fe602083613e3a565b915061370982614539565b602082019050919050565b6000613721601883613e3a565b915061372c82614562565b602082019050919050565b6000613744602183613e3a565b915061374f8261458b565b604082019050919050565b6000613767603d83613e3a565b9150613772826145da565b604082019050919050565b600061378a602c83613e3a565b915061379582614629565b604082019050919050565b60006137ad603583613e3a565b91506137b882614678565b604082019050919050565b6137cc81613f74565b82525050565b6137db81613f74565b82525050565b6137ea81613f7e565b82525050565b60006020820190506138056000830184613348565b92915050565b60006080820190506138206000830187613348565b61382d6020830186613348565b61383a60408301856137d2565b818103606083015261384c8184613439565b905095945050505050565b600060408201905061386c6000830185613348565b61387960208301846137d2565b9392505050565b6000604082019050818103600083015261389a81856133cc565b905081810360208301526138ae8184613357565b90509392505050565b600060a08201905081810360008301526138d181886133cc565b905081810360208301526138e58187613357565b90506138f46040830186613348565b6139016060830185613348565b61390e60808301846137e1565b9695505050505050565b600060208201905061392d600083018461342a565b92915050565b6000602082019050818103600083015261394d81846134ab565b905092915050565b6000602082019050818103600083015261396e816134e4565b9050919050565b6000602082019050818103600083015261398e81613507565b9050919050565b600060208201905081810360008301526139ae8161352a565b9050919050565b600060208201905081810360008301526139ce8161354d565b9050919050565b600060208201905081810360008301526139ee81613570565b9050919050565b60006020820190508181036000830152613a0e81613593565b9050919050565b60006020820190508181036000830152613a2e816135b6565b9050919050565b60006020820190508181036000830152613a4e816135d9565b9050919050565b60006020820190508181036000830152613a6e816135fc565b9050919050565b60006020820190508181036000830152613a8e8161361f565b9050919050565b60006020820190508181036000830152613aae81613642565b9050919050565b60006020820190508181036000830152613ace81613665565b9050919050565b60006020820190508181036000830152613aee81613688565b9050919050565b60006020820190508181036000830152613b0e816136ab565b9050919050565b60006020820190508181036000830152613b2e816136ce565b9050919050565b60006020820190508181036000830152613b4e816136f1565b9050919050565b60006020820190508181036000830152613b6e81613714565b9050919050565b60006020820190508181036000830152613b8e81613737565b9050919050565b60006020820190508181036000830152613bae8161375a565b9050919050565b60006020820190508181036000830152613bce8161377d565b9050919050565b60006020820190508181036000830152613bee816137a0565b9050919050565b6000602082019050613c0a60008301846137d2565b92915050565b600060a082019050613c2560008301886137d2565b8181036020830152613c3781876134ab565b9050613c466040830186613348565b613c536060830185613348565b613c6060808301846137e1565b9695505050505050565b6000602082019050613c7f60008301846137e1565b92915050565b6000613c8f613ca0565b9050613c9b828261400a565b919050565b6000604051905090565b600067ffffffffffffffff821115613cc557613cc461416f565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613cf157613cf061416f565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613d1d57613d1c61416f565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613d4957613d4861416f565b5b613d52826141b7565b9050602081019050919050565b600067ffffffffffffffff821115613d7a57613d7961416f565b5b613d83826141b7565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000613e5682613f74565b9150613e6183613f74565b925082613e7157613e706140b3565b5b828204905092915050565b6000613e8782613f74565b9150613e9283613f74565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613ecb57613eca614084565b5b828202905092915050565b6000613ee182613f74565b9150613eec83613f74565b925082821015613eff57613efe614084565b5b828203905092915050565b6000613f1582613f54565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613fc3578082015181840152602081019050613fa8565b83811115613fd2576000848401525b50505050565b60006002820490506001821680613ff057607f821691505b60208210811415614004576140036140e2565b5b50919050565b614013826141b7565b810181811067ffffffffffffffff821117156140325761403161416f565b5b80604052505050565b600061404682613f74565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561407957614078614084565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f54686520696e707574206461746120697320696e636f72726563740000000000600082015250565b7f596f7520617265206e6f74206f776e6572206f66206974656d00000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f54686520746f6b656e2055524973206973206e6f742076616c69640000000000600082015250565b7f4e6f20746f6b656e204944206578697374730000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f54686520696e7075742064617461206973206e6f742076616c69640000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6146d081613f0a565b81146146db57600080fd5b50565b6146e781613f1c565b81146146f257600080fd5b50565b6146fe81613f28565b811461470957600080fd5b50565b61471581613f74565b811461472057600080fd5b50565b61472c81613f7e565b811461473757600080fd5b5056fea264697066735822122021f4dc25ac3bafc996534b905d0052f827c1ae77837fbce8e972db1c66c1a0c964736f6c63430008070033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000725a9120fa719db6fffef28396ca57fe4aee689000000000000000000000000000000000000000000000000000000000000000b467573696f6e204e4654730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004464e465400000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101e55760003560e01c8063788c51cc1161010f578063c87b56dd116100a2578063e985e9c511610071578063e985e9c514610579578063f0414a99146105a9578063f2fde38b146105c7578063fb54453b146105e3576101e5565b8063c87b56dd146104f3578063dd34844514610523578063e1610f751461053f578063e8a3d4851461055b576101e5565b8063938e3d7b116100de578063938e3d7b1461048157806395d89b411461049d578063a22cb465146104bb578063b88d4fde146104d7576101e5565b8063788c51cc1461040d5780637f58e9111461042b5780638da5cb5b1461044757806392754a2614610465576101e5565b80632a55205a116101875780634f6ccce7116101565780634f6ccce7146103735780636352211e146103a357806370a08231146103d3578063715018a614610403576101e5565b80632a55205a146102da5780632f745c591461030b57806342842e0e1461033b57806343607b3014610357576101e5565b8063095ea7b3116101c3578063095ea7b31461026857806318160ddd14610284578063217ab9d2146102a257806323b872dd146102be576101e5565b806301ffc9a7146101ea57806306fdde031461021a578063081812fc14610238575b600080fd5b61020460048036038101906101ff9190613183565b6105ff565b6040516102119190613918565b60405180910390f35b610222610679565b60405161022f9190613933565b60405180910390f35b610252600480360381019061024d9190613282565b61070b565b60405161025f91906137f0565b60405180910390f35b610282600480360381019061027d9190612fc8565b610751565b005b61028c610869565b6040516102999190613bf5565b60405180910390f35b6102bc60048036038101906102b79190613008565b610876565b005b6102d860048036038101906102d39190612e56565b6109df565b005b6102f460048036038101906102ef91906132af565b610a3f565b604051610302929190613857565b60405180910390f35b61032560048036038101906103209190612fc8565b610af9565b6040516103329190613bf5565b60405180910390f35b61035560048036038101906103509190612e56565b610b9e565b005b610371600480360381019061036c91906132ef565b610bbe565b005b61038d60048036038101906103889190613282565b610c15565b60405161039a9190613bf5565b60405180910390f35b6103bd60048036038101906103b89190613282565b610c86565b6040516103ca91906137f0565b60405180910390f35b6103ed60048036038101906103e89190612de9565b610d0d565b6040516103fa9190613bf5565b60405180910390f35b61040b610dc5565b005b610415610dd9565b6040516104229190613c6a565b60405180910390f35b610445600480360381019061044091906130af565b610df7565b005b61044f610faa565b60405161045c91906137f0565b60405180910390f35b61047f600480360381019061047a9190612de9565b610fd4565b005b61049b600480360381019061049691906131dd565b61105a565b005b6104a561107c565b6040516104b29190613933565b60405180910390f35b6104d560048036038101906104d09190612f88565b61110e565b005b6104f160048036038101906104ec9190612ea9565b611124565b005b61050d60048036038101906105089190613282565b611186565b60405161051a9190613933565b60405180910390f35b61053d60048036038101906105389190612f2c565b611273565b005b6105596004803603810190610554919061310b565b611362565b005b6105636114ab565b6040516105709190613933565b60405180910390f35b610593600480360381019061058e9190612e16565b61153d565b6040516105a09190613918565b60405180910390f35b6105b16115d1565b6040516105be91906137f0565b60405180910390f35b6105e160048036038101906105dc9190612de9565b6115f7565b005b6105fd60048036038101906105f89190613226565b61167b565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610672575061067182611741565b5b9050919050565b60606000805461068890613fd8565b80601f01602080910402602001604051908101604052809291908181526020018280546106b490613fd8565b80156107015780601f106106d657610100808354040283529160200191610701565b820191906000526020600020905b8154815290600101906020018083116106e457829003601f168201915b5050505050905090565b6000610716826117bb565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061075c82610c86565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c490613b75565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107ec611806565b73ffffffffffffffffffffffffffffffffffffffff16148061081b575061081a81610815611806565b61153d565b5b61085a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085190613b95565b60405180910390fd5b610864838361180e565b505050565b6000600880549050905090565b81518351146108ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b190613a15565b60405180910390fd5b81518151146108fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f590613a15565b60405180910390fd5b60005b83518110156109d95761092e3383838151811061092157610920614140565b5b60200260200101516118c7565b61096d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096490613a35565b60405180910390fd5b6109c684828151811061098357610982614140565b5b602002602001015184838151811061099e5761099d614140565b5b60200260200101518484815181106109b9576109b8614140565b5b602002602001015161195c565b80806109d19061403b565b915050610901565b50505050565b6109f06109ea611806565b826118c7565b610a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2690613955565b60405180910390fd5b610a3a83838361195c565b505050565b600080610a4b84611c56565b610a8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8190613ab5565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166103e8600d60149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff1685610ae49190613e7c565b610aee9190613e4b565b915091509250929050565b6000610b0483610d0d565b8210610b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3c90613975565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610bb983838360405180602001604052806000815250611124565b505050565b610bc6611c97565b6000816bffffffffffffffffffffffff1611610be157600080fd5b80600d60146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555050565b6000610c1f610869565b8210610c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5790613bb5565b60405180910390fd5b60088281548110610c7457610c73614140565b5b90600052602060002001549050919050565b600080610c9283611d15565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfb90613b55565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7590613ad5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610dcd611c97565b610dd76000611d52565b565b600d60149054906101000a90046bffffffffffffffffffffffff1681565b610dff611c97565b6000825111610e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3a90613a95565b60405180910390fd5b6000825167ffffffffffffffff811115610e6057610e5f61416f565b5b604051908082528060200260200182016040528015610e8e5781602001602082028036833780820191505090505b50905060005b8351811015610f29576000610ea7610869565b9050610eb38482611e18565b848281518110610ec657610ec5614140565b5b6020026020010151600b60008381526020019081526020016000209080519060200190610ef49291906129f0565b5080838381518110610f0957610f08614140565b5b602002602001018181525050508080610f219061403b565b915050610e94565b507f287338e49ba50a36742de644e6bd28823e9102c35df360b08e65f6df6690b7c7818484600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d60149054906101000a90046bffffffffffffffffffffffff16604051610f9d9594939291906138b7565b60405180910390a1505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610fdc611c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561101657600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611062611c97565b80600c90805190602001906110789291906129f0565b5050565b60606001805461108b90613fd8565b80601f01602080910402602001604051908101604052809291908181526020018280546110b790613fd8565b80156111045780601f106110d957610100808354040283529160200191611104565b820191906000526020600020905b8154815290600101906020018083116110e757829003601f168201915b5050505050905090565b611120611119611806565b8383611e36565b5050565b61113561112f611806565b836118c7565b611174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116b90613955565b60405180910390fd5b61118084848484611fa3565b50505050565b606061119182611c56565b6111d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c790613ab5565b60405180910390fd5b600b600083815260200190815260200160002080546111ee90613fd8565b80601f016020809104026020016040519081016040528092919081815260200182805461121a90613fd8565b80156112675780601f1061123c57610100808354040283529160200191611267565b820191906000526020600020905b81548152906001019060200180831161124a57829003601f168201915b50505050509050919050565b60008151116112b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ae90613a15565b60405180910390fd5b60005b815181101561135d576112e7338383815181106112da576112d9614140565b5b60200260200101516118c7565b611326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131d90613a35565b60405180910390fd5b61134a8383838151811061133d5761133c614140565b5b602002602001015161180e565b80806113559061403b565b9150506112ba565b505050565b61136a611c97565b60008151116113ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a590613a95565b60405180910390fd5b81518151146113f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e990613af5565b60405180910390fd5b60005b815181101561146d5781818151811061141157611410614140565b5b6020026020010151600b60008584815181106114305761142f614140565b5b6020026020010151815260200190815260200160002090805190602001906114599291906129f0565b5080806114659061403b565b9150506113f5565b507f1adcc97d769b884a6d188c4a8b1134ee27069ee44aec2383d742ae4ba2b02f67828260405161149f929190613880565b60405180910390a15050565b6060600c80546114ba90613fd8565b80601f01602080910402602001604051908101604052809291908181526020018280546114e690613fd8565b80156115335780601f1061150857610100808354040283529160200191611533565b820191906000526020600020905b81548152906001019060200180831161151657829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6115ff611c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561166f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611666906139b5565b60405180910390fd5b61167881611d52565b50565b611683611c97565b600061168d610869565b90506116998282611e18565b82600b600083815260200190815260200160002090805190602001906116c09291906129f0565b507f4c2070fe1703dea1ee75e5ae890d9f8cbf543b4286f35cce392b633136b211c7818484600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d60149054906101000a90046bffffffffffffffffffffffff16604051611734959493929190613c10565b60405180910390a1505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806117b457506117b382611fff565b5b9050919050565b6117c481611c56565b611803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fa90613b55565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661188183610c86565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806118d383610c86565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806119155750611914818561153d565b5b8061195357508373ffffffffffffffffffffffffffffffffffffffff1661193b8461070b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661197c82610c86565b73ffffffffffffffffffffffffffffffffffffffff16146119d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c9906139d5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3990613a55565b60405180910390fd5b611a4f83838360016120e1565b8273ffffffffffffffffffffffffffffffffffffffff16611a6f82610c86565b73ffffffffffffffffffffffffffffffffffffffff1614611ac5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abc906139d5565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c518383836001612241565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff16611c7883611d15565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b611c9f611806565b73ffffffffffffffffffffffffffffffffffffffff16611cbd610faa565b73ffffffffffffffffffffffffffffffffffffffff1614611d13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0a90613b35565b60405180910390fd5b565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e32828260405180602001604052806000815250612247565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9c90613a75565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f969190613918565b60405180910390a3505050565b611fae84848461195c565b611fba848484846122a2565b611ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff090613995565b60405180910390fd5b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806120ca57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806120da57506120d982612439565b5b9050919050565b6120ed848484846124a3565b6001811115612131576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212890613bd5565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561217957612174816124a9565b6121b8565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146121b7576121b685826124f2565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156121fb576121f68161265f565b61223a565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612239576122388482612730565b5b5b5050505050565b50505050565b61225183836127af565b61225e60008484846122a2565b61229d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229490613995565b60405180910390fd5b505050565b60006122c38473ffffffffffffffffffffffffffffffffffffffff166129cd565b1561242c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122ec611806565b8786866040518563ffffffff1660e01b815260040161230e949392919061380b565b602060405180830381600087803b15801561232857600080fd5b505af192505050801561235957506040513d601f19601f8201168201806040525081019061235691906131b0565b60015b6123dc573d8060008114612389576040519150601f19603f3d011682016040523d82523d6000602084013e61238e565b606091505b506000815114156123d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cb90613995565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612431565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016124ff84610d0d565b6125099190613ed6565b90506000600760008481526020019081526020016000205490508181146125ee576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506126739190613ed6565b90506000600960008481526020019081526020016000205490506000600883815481106126a3576126a2614140565b5b9060005260206000200154905080600883815481106126c5576126c4614140565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061271457612713614111565b5b6001900381819060005260206000200160009055905550505050565b600061273b83610d0d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561281f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281690613b15565b60405180910390fd5b61282881611c56565b15612868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285f906139f5565b60405180910390fd5b6128766000838360016120e1565b61287f81611c56565b156128bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b6906139f5565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129c9600083836001612241565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546129fc90613fd8565b90600052602060002090601f016020900481019282612a1e5760008555612a65565b82601f10612a3757805160ff1916838001178555612a65565b82800160010185558215612a65579182015b82811115612a64578251825591602001919060010190612a49565b5b509050612a729190612a76565b5090565b5b80821115612a8f576000816000905550600101612a77565b5090565b6000612aa6612aa184613caa565b613c85565b90508083825260208201905082856020860282011115612ac957612ac86141a3565b5b60005b85811015612af95781612adf8882612c85565b845260208401935060208301925050600181019050612acc565b5050509392505050565b6000612b16612b1184613cd6565b613c85565b90508083825260208201905082856020860282011115612b3957612b386141a3565b5b60005b85811015612b8757813567ffffffffffffffff811115612b5f57612b5e61419e565b5b808601612b6c8982612d91565b85526020850194506020840193505050600181019050612b3c565b5050509392505050565b6000612ba4612b9f84613d02565b613c85565b90508083825260208201905082856020860282011115612bc757612bc66141a3565b5b60005b85811015612bf75781612bdd8882612dbf565b845260208401935060208301925050600181019050612bca565b5050509392505050565b6000612c14612c0f84613d2e565b613c85565b905082815260208101848484011115612c3057612c2f6141a8565b5b612c3b848285613f96565b509392505050565b6000612c56612c5184613d5f565b613c85565b905082815260208101848484011115612c7257612c716141a8565b5b612c7d848285613f96565b509392505050565b600081359050612c94816146c7565b92915050565b600082601f830112612caf57612cae61419e565b5b8135612cbf848260208601612a93565b91505092915050565b600082601f830112612cdd57612cdc61419e565b5b8135612ced848260208601612b03565b91505092915050565b600082601f830112612d0b57612d0a61419e565b5b8135612d1b848260208601612b91565b91505092915050565b600081359050612d33816146de565b92915050565b600081359050612d48816146f5565b92915050565b600081519050612d5d816146f5565b92915050565b600082601f830112612d7857612d7761419e565b5b8135612d88848260208601612c01565b91505092915050565b600082601f830112612da657612da561419e565b5b8135612db6848260208601612c43565b91505092915050565b600081359050612dce8161470c565b92915050565b600081359050612de381614723565b92915050565b600060208284031215612dff57612dfe6141b2565b5b6000612e0d84828501612c85565b91505092915050565b60008060408385031215612e2d57612e2c6141b2565b5b6000612e3b85828601612c85565b9250506020612e4c85828601612c85565b9150509250929050565b600080600060608486031215612e6f57612e6e6141b2565b5b6000612e7d86828701612c85565b9350506020612e8e86828701612c85565b9250506040612e9f86828701612dbf565b9150509250925092565b60008060008060808587031215612ec357612ec26141b2565b5b6000612ed187828801612c85565b9450506020612ee287828801612c85565b9350506040612ef387828801612dbf565b925050606085013567ffffffffffffffff811115612f1457612f136141ad565b5b612f2087828801612d63565b91505092959194509250565b60008060408385031215612f4357612f426141b2565b5b6000612f5185828601612c85565b925050602083013567ffffffffffffffff811115612f7257612f716141ad565b5b612f7e85828601612cf6565b9150509250929050565b60008060408385031215612f9f57612f9e6141b2565b5b6000612fad85828601612c85565b9250506020612fbe85828601612d24565b9150509250929050565b60008060408385031215612fdf57612fde6141b2565b5b6000612fed85828601612c85565b9250506020612ffe85828601612dbf565b9150509250929050565b600080600060608486031215613021576130206141b2565b5b600084013567ffffffffffffffff81111561303f5761303e6141ad565b5b61304b86828701612c9a565b935050602084013567ffffffffffffffff81111561306c5761306b6141ad565b5b61307886828701612c9a565b925050604084013567ffffffffffffffff811115613099576130986141ad565b5b6130a586828701612cf6565b9150509250925092565b600080604083850312156130c6576130c56141b2565b5b600083013567ffffffffffffffff8111156130e4576130e36141ad565b5b6130f085828601612cc8565b925050602061310185828601612c85565b9150509250929050565b60008060408385031215613122576131216141b2565b5b600083013567ffffffffffffffff8111156131405761313f6141ad565b5b61314c85828601612cf6565b925050602083013567ffffffffffffffff81111561316d5761316c6141ad565b5b61317985828601612cc8565b9150509250929050565b600060208284031215613199576131986141b2565b5b60006131a784828501612d39565b91505092915050565b6000602082840312156131c6576131c56141b2565b5b60006131d484828501612d4e565b91505092915050565b6000602082840312156131f3576131f26141b2565b5b600082013567ffffffffffffffff811115613211576132106141ad565b5b61321d84828501612d91565b91505092915050565b6000806040838503121561323d5761323c6141b2565b5b600083013567ffffffffffffffff81111561325b5761325a6141ad565b5b61326785828601612d91565b925050602061327885828601612c85565b9150509250929050565b600060208284031215613298576132976141b2565b5b60006132a684828501612dbf565b91505092915050565b600080604083850312156132c6576132c56141b2565b5b60006132d485828601612dbf565b92505060206132e585828601612dbf565b9150509250929050565b600060208284031215613305576133046141b2565b5b600061331384828501612dd4565b91505092915050565b60006133288383613472565b905092915050565b600061333c83836137c3565b60208301905092915050565b61335181613f0a565b82525050565b600061336282613db0565b61336c8185613df6565b93508360208202850161337e85613d90565b8060005b858110156133ba578484038952815161339b858261331c565b94506133a683613ddc565b925060208a01995050600181019050613382565b50829750879550505050505092915050565b60006133d782613dbb565b6133e18185613e07565b93506133ec83613da0565b8060005b8381101561341d5781516134048882613330565b975061340f83613de9565b9250506001810190506133f0565b5085935050505092915050565b61343381613f1c565b82525050565b600061344482613dc6565b61344e8185613e18565b935061345e818560208601613fa5565b613467816141b7565b840191505092915050565b600061347d82613dd1565b6134878185613e29565b9350613497818560208601613fa5565b6134a0816141b7565b840191505092915050565b60006134b682613dd1565b6134c08185613e3a565b93506134d0818560208601613fa5565b6134d9816141b7565b840191505092915050565b60006134f1602d83613e3a565b91506134fc826141c8565b604082019050919050565b6000613514602b83613e3a565b915061351f82614217565b604082019050919050565b6000613537603283613e3a565b915061354282614266565b604082019050919050565b600061355a602683613e3a565b9150613565826142b5565b604082019050919050565b600061357d602583613e3a565b915061358882614304565b604082019050919050565b60006135a0601c83613e3a565b91506135ab82614353565b602082019050919050565b60006135c3601b83613e3a565b91506135ce8261437c565b602082019050919050565b60006135e6601983613e3a565b91506135f1826143a5565b602082019050919050565b6000613609602483613e3a565b9150613614826143ce565b604082019050919050565b600061362c601983613e3a565b91506136378261441d565b602082019050919050565b600061364f601b83613e3a565b915061365a82614446565b602082019050919050565b6000613672601283613e3a565b915061367d8261446f565b602082019050919050565b6000613695602983613e3a565b91506136a082614498565b604082019050919050565b60006136b8601b83613e3a565b91506136c3826144e7565b602082019050919050565b60006136db602083613e3a565b91506136e682614510565b602082019050919050565b60006136fe602083613e3a565b915061370982614539565b602082019050919050565b6000613721601883613e3a565b915061372c82614562565b602082019050919050565b6000613744602183613e3a565b915061374f8261458b565b604082019050919050565b6000613767603d83613e3a565b9150613772826145da565b604082019050919050565b600061378a602c83613e3a565b915061379582614629565b604082019050919050565b60006137ad603583613e3a565b91506137b882614678565b604082019050919050565b6137cc81613f74565b82525050565b6137db81613f74565b82525050565b6137ea81613f7e565b82525050565b60006020820190506138056000830184613348565b92915050565b60006080820190506138206000830187613348565b61382d6020830186613348565b61383a60408301856137d2565b818103606083015261384c8184613439565b905095945050505050565b600060408201905061386c6000830185613348565b61387960208301846137d2565b9392505050565b6000604082019050818103600083015261389a81856133cc565b905081810360208301526138ae8184613357565b90509392505050565b600060a08201905081810360008301526138d181886133cc565b905081810360208301526138e58187613357565b90506138f46040830186613348565b6139016060830185613348565b61390e60808301846137e1565b9695505050505050565b600060208201905061392d600083018461342a565b92915050565b6000602082019050818103600083015261394d81846134ab565b905092915050565b6000602082019050818103600083015261396e816134e4565b9050919050565b6000602082019050818103600083015261398e81613507565b9050919050565b600060208201905081810360008301526139ae8161352a565b9050919050565b600060208201905081810360008301526139ce8161354d565b9050919050565b600060208201905081810360008301526139ee81613570565b9050919050565b60006020820190508181036000830152613a0e81613593565b9050919050565b60006020820190508181036000830152613a2e816135b6565b9050919050565b60006020820190508181036000830152613a4e816135d9565b9050919050565b60006020820190508181036000830152613a6e816135fc565b9050919050565b60006020820190508181036000830152613a8e8161361f565b9050919050565b60006020820190508181036000830152613aae81613642565b9050919050565b60006020820190508181036000830152613ace81613665565b9050919050565b60006020820190508181036000830152613aee81613688565b9050919050565b60006020820190508181036000830152613b0e816136ab565b9050919050565b60006020820190508181036000830152613b2e816136ce565b9050919050565b60006020820190508181036000830152613b4e816136f1565b9050919050565b60006020820190508181036000830152613b6e81613714565b9050919050565b60006020820190508181036000830152613b8e81613737565b9050919050565b60006020820190508181036000830152613bae8161375a565b9050919050565b60006020820190508181036000830152613bce8161377d565b9050919050565b60006020820190508181036000830152613bee816137a0565b9050919050565b6000602082019050613c0a60008301846137d2565b92915050565b600060a082019050613c2560008301886137d2565b8181036020830152613c3781876134ab565b9050613c466040830186613348565b613c536060830185613348565b613c6060808301846137e1565b9695505050505050565b6000602082019050613c7f60008301846137e1565b92915050565b6000613c8f613ca0565b9050613c9b828261400a565b919050565b6000604051905090565b600067ffffffffffffffff821115613cc557613cc461416f565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613cf157613cf061416f565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613d1d57613d1c61416f565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613d4957613d4861416f565b5b613d52826141b7565b9050602081019050919050565b600067ffffffffffffffff821115613d7a57613d7961416f565b5b613d83826141b7565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000613e5682613f74565b9150613e6183613f74565b925082613e7157613e706140b3565b5b828204905092915050565b6000613e8782613f74565b9150613e9283613f74565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613ecb57613eca614084565b5b828202905092915050565b6000613ee182613f74565b9150613eec83613f74565b925082821015613eff57613efe614084565b5b828203905092915050565b6000613f1582613f54565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613fc3578082015181840152602081019050613fa8565b83811115613fd2576000848401525b50505050565b60006002820490506001821680613ff057607f821691505b60208210811415614004576140036140e2565b5b50919050565b614013826141b7565b810181811067ffffffffffffffff821117156140325761403161416f565b5b80604052505050565b600061404682613f74565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561407957614078614084565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f54686520696e707574206461746120697320696e636f72726563740000000000600082015250565b7f596f7520617265206e6f74206f776e6572206f66206974656d00000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f54686520746f6b656e2055524973206973206e6f742076616c69640000000000600082015250565b7f4e6f20746f6b656e204944206578697374730000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f54686520696e7075742064617461206973206e6f742076616c69640000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6146d081613f0a565b81146146db57600080fd5b50565b6146e781613f1c565b81146146f257600080fd5b50565b6146fe81613f28565b811461470957600080fd5b50565b61471581613f74565b811461472057600080fd5b50565b61472c81613f7e565b811461473757600080fd5b5056fea264697066735822122021f4dc25ac3bafc996534b905d0052f827c1ae77837fbce8e972db1c66c1a0c964736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000725a9120fa719db6fffef28396ca57fe4aee689000000000000000000000000000000000000000000000000000000000000000b467573696f6e204e4654730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004464e465400000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Fusion NFTs
Arg [1] : symbol (string): FNFT
Arg [2] : royaltyPercentage (uint96): 80
Arg [3] : royaltyAddress (address): 0x0725A9120fA719Db6ffFEF28396cA57fE4AeE689

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [3] : 0000000000000000000000000725a9120fa719db6fffef28396ca57fe4aee689
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [5] : 467573696f6e204e465473000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 464e465400000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

62831:4395:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66889:230;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38760:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40272:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39790:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56606:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65425:481;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40972:335;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66606:275;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;56274:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41378:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66092:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56796:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38470:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38201:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2663:103;;;:::i;:::-;;63023:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64023:572;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2015:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65914:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66272:111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38929:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40515:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41634:322;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66415:183;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65051:366;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64603:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67127:96;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40741:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62987:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2921:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63725:290;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66889:230;67001:4;67045:26;67030:41;;;:11;:41;;;;:81;;;;67075:36;67099:11;67075:23;:36::i;:::-;67030:81;67023:88;;66889:230;;;:::o;38760:100::-;38814:13;38847:5;38840:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38760:100;:::o;40272:171::-;40348:7;40368:23;40383:7;40368:14;:23::i;:::-;40411:15;:24;40427:7;40411:24;;;;;;;;;;;;;;;;;;;;;40404:31;;40272:171;;;:::o;39790:416::-;39871:13;39887:23;39902:7;39887:14;:23::i;:::-;39871:39;;39935:5;39929:11;;:2;:11;;;;39921:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;40029:5;40013:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;40038:37;40055:5;40062:12;:10;:12::i;:::-;40038:16;:37::i;:::-;40013:62;39991:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;40177:21;40186:2;40190:7;40177:8;:21::i;:::-;39860:346;39790:416;;:::o;56606:113::-;56667:7;56694:10;:17;;;;56687:24;;56606:113;:::o;65425:481::-;65558:3;:10;65542:5;:12;:26;65534:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;65638:3;:10;65619:8;:15;:29;65611:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;65697:9;65693:206;65716:5;:12;65712:1;:16;65693:206;;;65757:43;65776:10;65788:8;65797:1;65788:11;;;;;;;;:::i;:::-;;;;;;;;65757:18;:43::i;:::-;65749:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;65847:40;65857:5;65863:1;65857:8;;;;;;;;:::i;:::-;;;;;;;;65867:3;65871:1;65867:6;;;;;;;;:::i;:::-;;;;;;;;65875:8;65884:1;65875:11;;;;;;;;:::i;:::-;;;;;;;;65847:9;:40::i;:::-;65730:3;;;;;:::i;:::-;;;;65693:206;;;;65425:481;;;:::o;40972:335::-;41167:41;41186:12;:10;:12::i;:::-;41200:7;41167:18;:41::i;:::-;41159:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;41271:28;41281:4;41287:2;41291:7;41271:9;:28::i;:::-;40972:335;;;:::o;66606:275::-;66695:16;66713:21;66760:16;66768:7;66760;:16::i;:::-;66752:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;66818:14;;;;;;;;;;;66868:4;66847:17;;;;;;;;;;;66835:29;;:9;:29;;;;:::i;:::-;66834:38;;;;:::i;:::-;66810:63;;;;66606:275;;;;;:::o;56274:256::-;56371:7;56407:23;56424:5;56407:16;:23::i;:::-;56399:5;:31;56391:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;56496:12;:19;56509:5;56496:19;;;;;;;;;;;;;;;:26;56516:5;56496:26;;;;;;;;;;;;56489:33;;56274:256;;;;:::o;41378:185::-;41516:39;41533:4;41539:2;41543:7;41516:39;;;;;;;;;;;;:16;:39::i;:::-;41378:185;;;:::o;66092:172::-;1901:13;:11;:13::i;:::-;66206:1:::1;66186:17;:21;;;66178:30;;;::::0;::::1;;66239:17;66219;;:37;;;;;;;;;;;;;;;;;;66092:172:::0;:::o;56796:233::-;56871:7;56907:30;:28;:30::i;:::-;56899:5;:38;56891:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;57004:10;57015:5;57004:17;;;;;;;;:::i;:::-;;;;;;;;;;56997:24;;56796:233;;;:::o;38470:223::-;38542:7;38562:13;38578:17;38587:7;38578:8;:17::i;:::-;38562:33;;38631:1;38614:19;;:5;:19;;;;38606:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;38680:5;38673:12;;;38470:223;;;:::o;38201:207::-;38273:7;38318:1;38301:19;;:5;:19;;;;38293:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38384:9;:16;38394:5;38384:16;;;;;;;;;;;;;;;;38377:23;;38201:207;;;:::o;2663:103::-;1901:13;:11;:13::i;:::-;2728:30:::1;2755:1;2728:18;:30::i;:::-;2663:103::o:0;63023:31::-;;;;;;;;;;;;;:::o;64023:572::-;1901:13;:11;:13::i;:::-;64141:1:::1;64122:9;:16;:20;64114:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;64185:25;64227:9;:16;64213:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64185:59;;64262:9;64257:238;64281:9;:16;64277:1;:20;64257:238;;;64319:17;64339:13;:11;:13::i;:::-;64319:33;;64367:27;64377:5;64384:9;64367;:27::i;:::-;64430:9;64440:1;64430:12;;;;;;;;:::i;:::-;;;;;;;;64411:5;:16;64417:9;64411:16;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;64474:9;64460:8;64469:1;64460:11;;;;;;;;:::i;:::-;;;;;;;:23;;;::::0;::::1;64304:191;64299:3;;;;;:::i;:::-;;;;64257:238;;;;64512:75;64525:8;64535:9;64546:5;64553:14;;;;;;;;;;;64569:17;;;;;;;;;;;64512:75;;;;;;;;;;:::i;:::-;;;;;;;;64103:492;64023:572:::0;;:::o;2015:87::-;2061:7;2088:6;;;;;;;;;;;2081:13;;2015:87;:::o;65914:169::-;1901:13;:11;:13::i;:::-;66030:1:::1;66004:28;;:14;:28;;;;65996:37;;;::::0;::::1;;66061:14;66044;;:31;;;;;;;;;;;;;;;;;;65914:169:::0;:::o;66272:111::-;1901:13;:11;:13::i;:::-;66364:11:::1;66350;:25;;;;;;;;;;;;:::i;:::-;;66272:111:::0;:::o;38929:104::-;38985:13;39018:7;39011:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38929:104;:::o;40515:155::-;40610:52;40629:12;:10;:12::i;:::-;40643:8;40653;40610:18;:52::i;:::-;40515:155;;:::o;41634:322::-;41808:41;41827:12;:10;:12::i;:::-;41841:7;41808:18;:41::i;:::-;41800:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;41910:38;41924:4;41930:2;41934:7;41943:4;41910:13;:38::i;:::-;41634:322;;;;:::o;66415:183::-;66480:13;66519:16;66527:7;66519;:16::i;:::-;66511:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;66576:5;:14;66582:7;66576:14;;;;;;;;;;;66569:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66415:183;;;:::o;65051:366::-;65162:1;65144:8;:15;:19;65136:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;65220:9;65216:194;65239:8;:15;65235:1;:19;65216:194;;;65283:43;65302:10;65314:8;65323:1;65314:11;;;;;;;;:::i;:::-;;;;;;;;65283:18;:43::i;:::-;65275:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;65373:25;65382:2;65386:8;65395:1;65386:11;;;;;;;;:::i;:::-;;;;;;;;65373:8;:25::i;:::-;65256:3;;;;;:::i;:::-;;;;65216:194;;;;65051:366;;:::o;64603:436::-;1901:13;:11;:13::i;:::-;64732:1:::1;64713:9;:16;:20;64705:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;64804:8;:15;64784:9;:16;:35;64776:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;64868:9;64864:117;64887:9;:16;64883:1;:20;64864:117;;;64957:9;64967:1;64957:12;;;;;;;;:::i;:::-;;;;;;;;64936:5;:18;64942:8;64951:1;64942:11;;;;;;;;:::i;:::-;;;;;;;;64936:18;;;;;;;;;;;:33;;;;;;;;;;;;:::i;:::-;;64905:3;;;;;:::i;:::-;;;;64864:117;;;;64998:33;65011:8;65021:9;64998:33;;;;;;;:::i;:::-;;;;;;;;64603:436:::0;;:::o;67127:96::-;67171:13;67204:11;67197:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67127:96;:::o;40741:164::-;40838:4;40862:18;:25;40881:5;40862:25;;;;;;;;;;;;;;;:35;40888:8;40862:35;;;;;;;;;;;;;;;;;;;;;;;;;40855:42;;40741:164;;;;:::o;62987:29::-;;;;;;;;;;;;;:::o;2921:201::-;1901:13;:11;:13::i;:::-;3030:1:::1;3010:22;;:8;:22;;;;3002:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3086:28;3105:8;3086:18;:28::i;:::-;2921:201:::0;:::o;63725:290::-;1901:13;:11;:13::i;:::-;63808:17:::1;63828:13;:11;:13::i;:::-;63808:33;;63852:27;63862:5;63869:9;63852;:27::i;:::-;63917:3;63898:5;:16;63904:9;63898:16;;;;;;;;;;;:22;;;;;;;;;;;;:::i;:::-;;63938:69;63950:9;63961:3;63966:5;63973:14;;;;;;;;;;;63989:17;;;;;;;;;;;63938:69;;;;;;;;;;:::i;:::-;;;;;;;;63797:218;63725:290:::0;;:::o;55966:224::-;56068:4;56107:35;56092:50;;;:11;:50;;;;:90;;;;56146:36;56170:11;56146:23;:36::i;:::-;56092:90;56085:97;;55966:224;;;:::o;50091:135::-;50173:16;50181:7;50173;:16::i;:::-;50165:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;50091:135;:::o;623:98::-;676:7;703:10;696:17;;623:98;:::o;49370:174::-;49472:2;49445:15;:24;49461:7;49445:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;49528:7;49524:2;49490:46;;49499:23;49514:7;49499:14;:23::i;:::-;49490:46;;;;;;;;;;;;49370:174;;:::o;43989:264::-;44082:4;44099:13;44115:23;44130:7;44115:14;:23::i;:::-;44099:39;;44168:5;44157:16;;:7;:16;;;:52;;;;44177:32;44194:5;44201:7;44177:16;:32::i;:::-;44157:52;:87;;;;44237:7;44213:31;;:20;44225:7;44213:11;:20::i;:::-;:31;;;44157:87;44149:96;;;43989:264;;;;:::o;47988:1263::-;48147:4;48120:31;;:23;48135:7;48120:14;:23::i;:::-;:31;;;48112:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;48226:1;48212:16;;:2;:16;;;;48204:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;48282:42;48303:4;48309:2;48313:7;48322:1;48282:20;:42::i;:::-;48454:4;48427:31;;:23;48442:7;48427:14;:23::i;:::-;:31;;;48419:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;48572:15;:24;48588:7;48572:24;;;;;;;;;;;;48565:31;;;;;;;;;;;49067:1;49048:9;:15;49058:4;49048:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;49100:1;49083:9;:13;49093:2;49083:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;49142:2;49123:7;:16;49131:7;49123:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;49181:7;49177:2;49162:27;;49171:4;49162:27;;;;;;;;;;;;49202:41;49222:4;49228:2;49232:7;49241:1;49202:19;:41::i;:::-;47988:1263;;;:::o;43694:128::-;43759:4;43812:1;43783:31;;:17;43792:7;43783:8;:17::i;:::-;:31;;;;43776:38;;43694:128;;;:::o;2180:132::-;2255:12;:10;:12::i;:::-;2244:23;;:7;:5;:7::i;:::-;:23;;;2236:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2180:132::o;43264:117::-;43330:7;43357;:16;43365:7;43357:16;;;;;;;;;;;;;;;;;;;;;43350:23;;43264:117;;;:::o;3282:191::-;3356:16;3375:6;;;;;;;;;;;3356:25;;3401:8;3392:6;;:17;;;;;;;;;;;;;;;;;;3456:8;3425:40;;3446:8;3425:40;;;;;;;;;;;;3345:128;3282:191;:::o;44595:110::-;44671:26;44681:2;44685:7;44671:26;;;;;;;;;;;;:9;:26::i;:::-;44595:110;;:::o;49687:315::-;49842:8;49833:17;;:5;:17;;;;49825:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;49929:8;49891:18;:25;49910:5;49891:25;;;;;;;;;;;;;;;:35;49917:8;49891:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;49975:8;49953:41;;49968:5;49953:41;;;49985:8;49953:41;;;;;;:::i;:::-;;;;;;;;49687:315;;;:::o;42837:313::-;42993:28;43003:4;43009:2;43013:7;42993:9;:28::i;:::-;43040:47;43063:4;43069:2;43073:7;43082:4;43040:22;:47::i;:::-;43032:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;42837:313;;;;:::o;37832:305::-;37934:4;37986:25;37971:40;;;:11;:40;;;;:105;;;;38043:33;38028:48;;;:11;:48;;;;37971:105;:158;;;;38093:36;38117:11;38093:23;:36::i;:::-;37971:158;37951:178;;37832:305;;;:::o;57103:915::-;57280:61;57307:4;57313:2;57317:12;57331:9;57280:26;:61::i;:::-;57370:1;57358:9;:13;57354:222;;;57501:63;;;;;;;;;;:::i;:::-;;;;;;;;57354:222;57588:15;57606:12;57588:30;;57651:1;57635:18;;:4;:18;;;57631:187;;;57670:40;57702:7;57670:31;:40::i;:::-;57631:187;;;57740:2;57732:10;;:4;:10;;;57728:90;;57759:47;57792:4;57798:7;57759:32;:47::i;:::-;57728:90;57631:187;57846:1;57832:16;;:2;:16;;;57828:183;;;57865:45;57902:7;57865:36;:45::i;:::-;57828:183;;;57938:4;57932:10;;:2;:10;;;57928:83;;57959:40;57987:2;57991:7;57959:27;:40::i;:::-;57928:83;57828:183;57269:749;57103:915;;;;:::o;53256:158::-;;;;;:::o;44932:319::-;45061:18;45067:2;45071:7;45061:5;:18::i;:::-;45112:53;45143:1;45147:2;45151:7;45160:4;45112:22;:53::i;:::-;45090:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;44932:319;;;:::o;50790:853::-;50944:4;50965:15;:2;:13;;;:15::i;:::-;50961:675;;;51017:2;51001:36;;;51038:12;:10;:12::i;:::-;51052:4;51058:7;51067:4;51001:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50997:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51259:1;51242:6;:13;:18;51238:328;;;51285:60;;;;;;;;;;:::i;:::-;;;;;;;;51238:328;51516:6;51510:13;51501:6;51497:2;51493:15;51486:38;50997:584;51133:41;;;51123:51;;;:6;:51;;;;51116:58;;;;;50961:675;51620:4;51613:11;;50790:853;;;;;;;:::o;36335:157::-;36420:4;36459:25;36444:40;;;:11;:40;;;;36437:47;;36335:157;;;:::o;52375:159::-;;;;;:::o;58741:164::-;58845:10;:17;;;;58818:15;:24;58834:7;58818:24;;;;;;;;;;;:44;;;;58873:10;58889:7;58873:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58741:164;:::o;59532:988::-;59798:22;59848:1;59823:22;59840:4;59823:16;:22::i;:::-;:26;;;;:::i;:::-;59798:51;;59860:18;59881:17;:26;59899:7;59881:26;;;;;;;;;;;;59860:47;;60028:14;60014:10;:28;60010:328;;60059:19;60081:12;:18;60094:4;60081:18;;;;;;;;;;;;;;;:34;60100:14;60081:34;;;;;;;;;;;;60059:56;;60165:11;60132:12;:18;60145:4;60132:18;;;;;;;;;;;;;;;:30;60151:10;60132:30;;;;;;;;;;;:44;;;;60282:10;60249:17;:30;60267:11;60249:30;;;;;;;;;;;:43;;;;60044:294;60010:328;60434:17;:26;60452:7;60434:26;;;;;;;;;;;60427:33;;;60478:12;:18;60491:4;60478:18;;;;;;;;;;;;;;;:34;60497:14;60478:34;;;;;;;;;;;60471:41;;;59613:907;;59532:988;;:::o;60815:1079::-;61068:22;61113:1;61093:10;:17;;;;:21;;;;:::i;:::-;61068:46;;61125:18;61146:15;:24;61162:7;61146:24;;;;;;;;;;;;61125:45;;61497:19;61519:10;61530:14;61519:26;;;;;;;;:::i;:::-;;;;;;;;;;61497:48;;61583:11;61558:10;61569;61558:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;61694:10;61663:15;:28;61679:11;61663:28;;;;;;;;;;;:41;;;;61835:15;:24;61851:7;61835:24;;;;;;;;;;;61828:31;;;61870:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;60886:1008;;;60815:1079;:::o;58319:221::-;58404:14;58421:20;58438:2;58421:16;:20::i;:::-;58404:37;;58479:7;58452:12;:16;58465:2;58452:16;;;;;;;;;;;;;;;:24;58469:6;58452:24;;;;;;;;;;;:34;;;;58526:6;58497:17;:26;58515:7;58497:26;;;;;;;;;;;:35;;;;58393:147;58319:221;;:::o;45587:942::-;45681:1;45667:16;;:2;:16;;;;45659:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;45740:16;45748:7;45740;:16::i;:::-;45739:17;45731:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;45802:48;45831:1;45835:2;45839:7;45848:1;45802:20;:48::i;:::-;45949:16;45957:7;45949;:16::i;:::-;45948:17;45940:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;46364:1;46347:9;:13;46357:2;46347:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;46408:2;46389:7;:16;46397:7;46389:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;46453:7;46449:2;46428:33;;46445:1;46428:33;;;;;;;;;;;;46474:47;46502:1;46506:2;46510:7;46519:1;46474:19;:47::i;:::-;45587:942;;:::o;12259:326::-;12319:4;12576:1;12554:7;:19;;;:23;12547:30;;12259:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;768:957::-;874:5;899:91;915:74;982:6;915:74;:::i;:::-;899:91;:::i;:::-;890:100;;1010:5;1039:6;1032:5;1025:21;1073:4;1066:5;1062:16;1055:23;;1099:6;1149:3;1141:4;1133:6;1129:17;1124:3;1120:27;1117:36;1114:143;;;1168:79;;:::i;:::-;1114:143;1281:1;1266:453;1291:6;1288:1;1285:13;1266:453;;;1373:3;1360:17;1409:18;1396:11;1393:35;1390:122;;;1431:79;;:::i;:::-;1390:122;1555:11;1547:6;1543:24;1593:47;1636:3;1624:10;1593:47;:::i;:::-;1588:3;1581:60;1670:4;1665:3;1661:14;1654:21;;1704:4;1699:3;1695:14;1688:21;;1326:393;;1313:1;1310;1306:9;1301:14;;1266:453;;;1270:14;880:845;;768:957;;;;;:::o;1748:722::-;1844:5;1869:81;1885:64;1942:6;1885:64;:::i;:::-;1869:81;:::i;:::-;1860:90;;1970:5;1999:6;1992:5;1985:21;2033:4;2026:5;2022:16;2015:23;;2059:6;2109:3;2101:4;2093:6;2089:17;2084:3;2080:27;2077:36;2074:143;;;2128:79;;:::i;:::-;2074:143;2241:1;2226:238;2251:6;2248:1;2245:13;2226:238;;;2319:3;2348:37;2381:3;2369:10;2348:37;:::i;:::-;2343:3;2336:50;2415:4;2410:3;2406:14;2399:21;;2449:4;2444:3;2440:14;2433:21;;2286:178;2273:1;2270;2266:9;2261:14;;2226:238;;;2230:14;1850:620;;1748:722;;;;;:::o;2476:410::-;2553:5;2578:65;2594:48;2635:6;2594:48;:::i;:::-;2578:65;:::i;:::-;2569:74;;2666:6;2659:5;2652:21;2704:4;2697:5;2693:16;2742:3;2733:6;2728:3;2724:16;2721:25;2718:112;;;2749:79;;:::i;:::-;2718:112;2839:41;2873:6;2868:3;2863;2839:41;:::i;:::-;2559:327;2476:410;;;;;:::o;2892:412::-;2970:5;2995:66;3011:49;3053:6;3011:49;:::i;:::-;2995:66;:::i;:::-;2986:75;;3084:6;3077:5;3070:21;3122:4;3115:5;3111:16;3160:3;3151:6;3146:3;3142:16;3139:25;3136:112;;;3167:79;;:::i;:::-;3136:112;3257:41;3291:6;3286:3;3281;3257:41;:::i;:::-;2976:328;2892:412;;;;;:::o;3310:139::-;3356:5;3394:6;3381:20;3372:29;;3410:33;3437:5;3410:33;:::i;:::-;3310:139;;;;:::o;3472:370::-;3543:5;3592:3;3585:4;3577:6;3573:17;3569:27;3559:122;;3600:79;;:::i;:::-;3559:122;3717:6;3704:20;3742:94;3832:3;3824:6;3817:4;3809:6;3805:17;3742:94;:::i;:::-;3733:103;;3549:293;3472:370;;;;:::o;3864:390::-;3945:5;3994:3;3987:4;3979:6;3975:17;3971:27;3961:122;;4002:79;;:::i;:::-;3961:122;4119:6;4106:20;4144:104;4244:3;4236:6;4229:4;4221:6;4217:17;4144:104;:::i;:::-;4135:113;;3951:303;3864:390;;;;:::o;4277:370::-;4348:5;4397:3;4390:4;4382:6;4378:17;4374:27;4364:122;;4405:79;;:::i;:::-;4364:122;4522:6;4509:20;4547:94;4637:3;4629:6;4622:4;4614:6;4610:17;4547:94;:::i;:::-;4538:103;;4354:293;4277:370;;;;:::o;4653:133::-;4696:5;4734:6;4721:20;4712:29;;4750:30;4774:5;4750:30;:::i;:::-;4653:133;;;;:::o;4792:137::-;4837:5;4875:6;4862:20;4853:29;;4891:32;4917:5;4891:32;:::i;:::-;4792:137;;;;:::o;4935:141::-;4991:5;5022:6;5016:13;5007:22;;5038:32;5064:5;5038:32;:::i;:::-;4935:141;;;;:::o;5095:338::-;5150:5;5199:3;5192:4;5184:6;5180:17;5176:27;5166:122;;5207:79;;:::i;:::-;5166:122;5324:6;5311:20;5349:78;5423:3;5415:6;5408:4;5400:6;5396:17;5349:78;:::i;:::-;5340:87;;5156:277;5095:338;;;;:::o;5453:340::-;5509:5;5558:3;5551:4;5543:6;5539:17;5535:27;5525:122;;5566:79;;:::i;:::-;5525:122;5683:6;5670:20;5708:79;5783:3;5775:6;5768:4;5760:6;5756:17;5708:79;:::i;:::-;5699:88;;5515:278;5453:340;;;;:::o;5799:139::-;5845:5;5883:6;5870:20;5861:29;;5899:33;5926:5;5899:33;:::i;:::-;5799:139;;;;:::o;5944:137::-;5989:5;6027:6;6014:20;6005:29;;6043:32;6069:5;6043:32;:::i;:::-;5944:137;;;;:::o;6087:329::-;6146:6;6195:2;6183:9;6174:7;6170:23;6166:32;6163:119;;;6201:79;;:::i;:::-;6163:119;6321:1;6346:53;6391:7;6382:6;6371:9;6367:22;6346:53;:::i;:::-;6336:63;;6292:117;6087:329;;;;:::o;6422:474::-;6490:6;6498;6547:2;6535:9;6526:7;6522:23;6518:32;6515:119;;;6553:79;;:::i;:::-;6515:119;6673:1;6698:53;6743:7;6734:6;6723:9;6719:22;6698:53;:::i;:::-;6688:63;;6644:117;6800:2;6826:53;6871:7;6862:6;6851:9;6847:22;6826:53;:::i;:::-;6816:63;;6771:118;6422:474;;;;;:::o;6902:619::-;6979:6;6987;6995;7044:2;7032:9;7023:7;7019:23;7015:32;7012:119;;;7050:79;;:::i;:::-;7012:119;7170:1;7195:53;7240:7;7231:6;7220:9;7216:22;7195:53;:::i;:::-;7185:63;;7141:117;7297:2;7323:53;7368:7;7359:6;7348:9;7344:22;7323:53;:::i;:::-;7313:63;;7268:118;7425:2;7451:53;7496:7;7487:6;7476:9;7472:22;7451:53;:::i;:::-;7441:63;;7396:118;6902:619;;;;;:::o;7527:943::-;7622:6;7630;7638;7646;7695:3;7683:9;7674:7;7670:23;7666:33;7663:120;;;7702:79;;:::i;:::-;7663:120;7822:1;7847:53;7892:7;7883:6;7872:9;7868:22;7847:53;:::i;:::-;7837:63;;7793:117;7949:2;7975:53;8020:7;8011:6;8000:9;7996:22;7975:53;:::i;:::-;7965:63;;7920:118;8077:2;8103:53;8148:7;8139:6;8128:9;8124:22;8103:53;:::i;:::-;8093:63;;8048:118;8233:2;8222:9;8218:18;8205:32;8264:18;8256:6;8253:30;8250:117;;;8286:79;;:::i;:::-;8250:117;8391:62;8445:7;8436:6;8425:9;8421:22;8391:62;:::i;:::-;8381:72;;8176:287;7527:943;;;;;;;:::o;8476:684::-;8569:6;8577;8626:2;8614:9;8605:7;8601:23;8597:32;8594:119;;;8632:79;;:::i;:::-;8594:119;8752:1;8777:53;8822:7;8813:6;8802:9;8798:22;8777:53;:::i;:::-;8767:63;;8723:117;8907:2;8896:9;8892:18;8879:32;8938:18;8930:6;8927:30;8924:117;;;8960:79;;:::i;:::-;8924:117;9065:78;9135:7;9126:6;9115:9;9111:22;9065:78;:::i;:::-;9055:88;;8850:303;8476:684;;;;;:::o;9166:468::-;9231:6;9239;9288:2;9276:9;9267:7;9263:23;9259:32;9256:119;;;9294:79;;:::i;:::-;9256:119;9414:1;9439:53;9484:7;9475:6;9464:9;9460:22;9439:53;:::i;:::-;9429:63;;9385:117;9541:2;9567:50;9609:7;9600:6;9589:9;9585:22;9567:50;:::i;:::-;9557:60;;9512:115;9166:468;;;;;:::o;9640:474::-;9708:6;9716;9765:2;9753:9;9744:7;9740:23;9736:32;9733:119;;;9771:79;;:::i;:::-;9733:119;9891:1;9916:53;9961:7;9952:6;9941:9;9937:22;9916:53;:::i;:::-;9906:63;;9862:117;10018:2;10044:53;10089:7;10080:6;10069:9;10065:22;10044:53;:::i;:::-;10034:63;;9989:118;9640:474;;;;;:::o;10120:1249::-;10272:6;10280;10288;10337:2;10325:9;10316:7;10312:23;10308:32;10305:119;;;10343:79;;:::i;:::-;10305:119;10491:1;10480:9;10476:17;10463:31;10521:18;10513:6;10510:30;10507:117;;;10543:79;;:::i;:::-;10507:117;10648:78;10718:7;10709:6;10698:9;10694:22;10648:78;:::i;:::-;10638:88;;10434:302;10803:2;10792:9;10788:18;10775:32;10834:18;10826:6;10823:30;10820:117;;;10856:79;;:::i;:::-;10820:117;10961:78;11031:7;11022:6;11011:9;11007:22;10961:78;:::i;:::-;10951:88;;10746:303;11116:2;11105:9;11101:18;11088:32;11147:18;11139:6;11136:30;11133:117;;;11169:79;;:::i;:::-;11133:117;11274:78;11344:7;11335:6;11324:9;11320:22;11274:78;:::i;:::-;11264:88;;11059:303;10120:1249;;;;;:::o;11375:704::-;11478:6;11486;11535:2;11523:9;11514:7;11510:23;11506:32;11503:119;;;11541:79;;:::i;:::-;11503:119;11689:1;11678:9;11674:17;11661:31;11719:18;11711:6;11708:30;11705:117;;;11741:79;;:::i;:::-;11705:117;11846:88;11926:7;11917:6;11906:9;11902:22;11846:88;:::i;:::-;11836:98;;11632:312;11983:2;12009:53;12054:7;12045:6;12034:9;12030:22;12009:53;:::i;:::-;11999:63;;11954:118;11375:704;;;;;:::o;12085:914::-;12213:6;12221;12270:2;12258:9;12249:7;12245:23;12241:32;12238:119;;;12276:79;;:::i;:::-;12238:119;12424:1;12413:9;12409:17;12396:31;12454:18;12446:6;12443:30;12440:117;;;12476:79;;:::i;:::-;12440:117;12581:78;12651:7;12642:6;12631:9;12627:22;12581:78;:::i;:::-;12571:88;;12367:302;12736:2;12725:9;12721:18;12708:32;12767:18;12759:6;12756:30;12753:117;;;12789:79;;:::i;:::-;12753:117;12894:88;12974:7;12965:6;12954:9;12950:22;12894:88;:::i;:::-;12884:98;;12679:313;12085:914;;;;;:::o;13005:327::-;13063:6;13112:2;13100:9;13091:7;13087:23;13083:32;13080:119;;;13118:79;;:::i;:::-;13080:119;13238:1;13263:52;13307:7;13298:6;13287:9;13283:22;13263:52;:::i;:::-;13253:62;;13209:116;13005:327;;;;:::o;13338:349::-;13407:6;13456:2;13444:9;13435:7;13431:23;13427:32;13424:119;;;13462:79;;:::i;:::-;13424:119;13582:1;13607:63;13662:7;13653:6;13642:9;13638:22;13607:63;:::i;:::-;13597:73;;13553:127;13338:349;;;;:::o;13693:509::-;13762:6;13811:2;13799:9;13790:7;13786:23;13782:32;13779:119;;;13817:79;;:::i;:::-;13779:119;13965:1;13954:9;13950:17;13937:31;13995:18;13987:6;13984:30;13981:117;;;14017:79;;:::i;:::-;13981:117;14122:63;14177:7;14168:6;14157:9;14153:22;14122:63;:::i;:::-;14112:73;;13908:287;13693:509;;;;:::o;14208:654::-;14286:6;14294;14343:2;14331:9;14322:7;14318:23;14314:32;14311:119;;;14349:79;;:::i;:::-;14311:119;14497:1;14486:9;14482:17;14469:31;14527:18;14519:6;14516:30;14513:117;;;14549:79;;:::i;:::-;14513:117;14654:63;14709:7;14700:6;14689:9;14685:22;14654:63;:::i;:::-;14644:73;;14440:287;14766:2;14792:53;14837:7;14828:6;14817:9;14813:22;14792:53;:::i;:::-;14782:63;;14737:118;14208:654;;;;;:::o;14868:329::-;14927:6;14976:2;14964:9;14955:7;14951:23;14947:32;14944:119;;;14982:79;;:::i;:::-;14944:119;15102:1;15127:53;15172:7;15163:6;15152:9;15148:22;15127:53;:::i;:::-;15117:63;;15073:117;14868:329;;;;:::o;15203:474::-;15271:6;15279;15328:2;15316:9;15307:7;15303:23;15299:32;15296:119;;;15334:79;;:::i;:::-;15296:119;15454:1;15479:53;15524:7;15515:6;15504:9;15500:22;15479:53;:::i;:::-;15469:63;;15425:117;15581:2;15607:53;15652:7;15643:6;15632:9;15628:22;15607:53;:::i;:::-;15597:63;;15552:118;15203:474;;;;;:::o;15683:327::-;15741:6;15790:2;15778:9;15769:7;15765:23;15761:32;15758:119;;;15796:79;;:::i;:::-;15758:119;15916:1;15941:52;15985:7;15976:6;15965:9;15961:22;15941:52;:::i;:::-;15931:62;;15887:116;15683:327;;;;:::o;16016:196::-;16105:10;16140:66;16202:3;16194:6;16140:66;:::i;:::-;16126:80;;16016:196;;;;:::o;16218:179::-;16287:10;16308:46;16350:3;16342:6;16308:46;:::i;:::-;16386:4;16381:3;16377:14;16363:28;;16218:179;;;;:::o;16403:118::-;16490:24;16508:5;16490:24;:::i;:::-;16485:3;16478:37;16403:118;;:::o;16555:991::-;16694:3;16723:64;16781:5;16723:64;:::i;:::-;16803:96;16892:6;16887:3;16803:96;:::i;:::-;16796:103;;16925:3;16970:4;16962:6;16958:17;16953:3;16949:27;17000:66;17060:5;17000:66;:::i;:::-;17089:7;17120:1;17105:396;17130:6;17127:1;17124:13;17105:396;;;17201:9;17195:4;17191:20;17186:3;17179:33;17252:6;17246:13;17280:84;17359:4;17344:13;17280:84;:::i;:::-;17272:92;;17387:70;17450:6;17387:70;:::i;:::-;17377:80;;17486:4;17481:3;17477:14;17470:21;;17165:336;17152:1;17149;17145:9;17140:14;;17105:396;;;17109:14;17517:4;17510:11;;17537:3;17530:10;;16699:847;;;;;16555:991;;;;:::o;17582:732::-;17701:3;17730:54;17778:5;17730:54;:::i;:::-;17800:86;17879:6;17874:3;17800:86;:::i;:::-;17793:93;;17910:56;17960:5;17910:56;:::i;:::-;17989:7;18020:1;18005:284;18030:6;18027:1;18024:13;18005:284;;;18106:6;18100:13;18133:63;18192:3;18177:13;18133:63;:::i;:::-;18126:70;;18219:60;18272:6;18219:60;:::i;:::-;18209:70;;18065:224;18052:1;18049;18045:9;18040:14;;18005:284;;;18009:14;18305:3;18298:10;;17706:608;;;17582:732;;;;:::o;18320:109::-;18401:21;18416:5;18401:21;:::i;:::-;18396:3;18389:34;18320:109;;:::o;18435:360::-;18521:3;18549:38;18581:5;18549:38;:::i;:::-;18603:70;18666:6;18661:3;18603:70;:::i;:::-;18596:77;;18682:52;18727:6;18722:3;18715:4;18708:5;18704:16;18682:52;:::i;:::-;18759:29;18781:6;18759:29;:::i;:::-;18754:3;18750:39;18743:46;;18525:270;18435:360;;;;:::o;18801:344::-;18879:3;18907:39;18940:5;18907:39;:::i;:::-;18962:61;19016:6;19011:3;18962:61;:::i;:::-;18955:68;;19032:52;19077:6;19072:3;19065:4;19058:5;19054:16;19032:52;:::i;:::-;19109:29;19131:6;19109:29;:::i;:::-;19104:3;19100:39;19093:46;;18883:262;18801:344;;;;:::o;19151:364::-;19239:3;19267:39;19300:5;19267:39;:::i;:::-;19322:71;19386:6;19381:3;19322:71;:::i;:::-;19315:78;;19402:52;19447:6;19442:3;19435:4;19428:5;19424:16;19402:52;:::i;:::-;19479:29;19501:6;19479:29;:::i;:::-;19474:3;19470:39;19463:46;;19243:272;19151:364;;;;:::o;19521:366::-;19663:3;19684:67;19748:2;19743:3;19684:67;:::i;:::-;19677:74;;19760:93;19849:3;19760:93;:::i;:::-;19878:2;19873:3;19869:12;19862:19;;19521:366;;;:::o;19893:::-;20035:3;20056:67;20120:2;20115:3;20056:67;:::i;:::-;20049:74;;20132:93;20221:3;20132:93;:::i;:::-;20250:2;20245:3;20241:12;20234:19;;19893:366;;;:::o;20265:::-;20407:3;20428:67;20492:2;20487:3;20428:67;:::i;:::-;20421:74;;20504:93;20593:3;20504:93;:::i;:::-;20622:2;20617:3;20613:12;20606:19;;20265:366;;;:::o;20637:::-;20779:3;20800:67;20864:2;20859:3;20800:67;:::i;:::-;20793:74;;20876:93;20965:3;20876:93;:::i;:::-;20994:2;20989:3;20985:12;20978:19;;20637:366;;;:::o;21009:::-;21151:3;21172:67;21236:2;21231:3;21172:67;:::i;:::-;21165:74;;21248:93;21337:3;21248:93;:::i;:::-;21366:2;21361:3;21357:12;21350:19;;21009:366;;;:::o;21381:::-;21523:3;21544:67;21608:2;21603:3;21544:67;:::i;:::-;21537:74;;21620:93;21709:3;21620:93;:::i;:::-;21738:2;21733:3;21729:12;21722:19;;21381:366;;;:::o;21753:::-;21895:3;21916:67;21980:2;21975:3;21916:67;:::i;:::-;21909:74;;21992:93;22081:3;21992:93;:::i;:::-;22110:2;22105:3;22101:12;22094:19;;21753:366;;;:::o;22125:::-;22267:3;22288:67;22352:2;22347:3;22288:67;:::i;:::-;22281:74;;22364:93;22453:3;22364:93;:::i;:::-;22482:2;22477:3;22473:12;22466:19;;22125:366;;;:::o;22497:::-;22639:3;22660:67;22724:2;22719:3;22660:67;:::i;:::-;22653:74;;22736:93;22825:3;22736:93;:::i;:::-;22854:2;22849:3;22845:12;22838:19;;22497:366;;;:::o;22869:::-;23011:3;23032:67;23096:2;23091:3;23032:67;:::i;:::-;23025:74;;23108:93;23197:3;23108:93;:::i;:::-;23226:2;23221:3;23217:12;23210:19;;22869:366;;;:::o;23241:::-;23383:3;23404:67;23468:2;23463:3;23404:67;:::i;:::-;23397:74;;23480:93;23569:3;23480:93;:::i;:::-;23598:2;23593:3;23589:12;23582:19;;23241:366;;;:::o;23613:::-;23755:3;23776:67;23840:2;23835:3;23776:67;:::i;:::-;23769:74;;23852:93;23941:3;23852:93;:::i;:::-;23970:2;23965:3;23961:12;23954:19;;23613:366;;;:::o;23985:::-;24127:3;24148:67;24212:2;24207:3;24148:67;:::i;:::-;24141:74;;24224:93;24313:3;24224:93;:::i;:::-;24342:2;24337:3;24333:12;24326:19;;23985:366;;;:::o;24357:::-;24499:3;24520:67;24584:2;24579:3;24520:67;:::i;:::-;24513:74;;24596:93;24685:3;24596:93;:::i;:::-;24714:2;24709:3;24705:12;24698:19;;24357:366;;;:::o;24729:::-;24871:3;24892:67;24956:2;24951:3;24892:67;:::i;:::-;24885:74;;24968:93;25057:3;24968:93;:::i;:::-;25086:2;25081:3;25077:12;25070:19;;24729:366;;;:::o;25101:::-;25243:3;25264:67;25328:2;25323:3;25264:67;:::i;:::-;25257:74;;25340:93;25429:3;25340:93;:::i;:::-;25458:2;25453:3;25449:12;25442:19;;25101:366;;;:::o;25473:::-;25615:3;25636:67;25700:2;25695:3;25636:67;:::i;:::-;25629:74;;25712:93;25801:3;25712:93;:::i;:::-;25830:2;25825:3;25821:12;25814:19;;25473:366;;;:::o;25845:::-;25987:3;26008:67;26072:2;26067:3;26008:67;:::i;:::-;26001:74;;26084:93;26173:3;26084:93;:::i;:::-;26202:2;26197:3;26193:12;26186:19;;25845:366;;;:::o;26217:::-;26359:3;26380:67;26444:2;26439:3;26380:67;:::i;:::-;26373:74;;26456:93;26545:3;26456:93;:::i;:::-;26574:2;26569:3;26565:12;26558:19;;26217:366;;;:::o;26589:::-;26731:3;26752:67;26816:2;26811:3;26752:67;:::i;:::-;26745:74;;26828:93;26917:3;26828:93;:::i;:::-;26946:2;26941:3;26937:12;26930:19;;26589:366;;;:::o;26961:::-;27103:3;27124:67;27188:2;27183:3;27124:67;:::i;:::-;27117:74;;27200:93;27289:3;27200:93;:::i;:::-;27318:2;27313:3;27309:12;27302:19;;26961:366;;;:::o;27333:108::-;27410:24;27428:5;27410:24;:::i;:::-;27405:3;27398:37;27333:108;;:::o;27447:118::-;27534:24;27552:5;27534:24;:::i;:::-;27529:3;27522:37;27447:118;;:::o;27571:115::-;27656:23;27673:5;27656:23;:::i;:::-;27651:3;27644:36;27571:115;;:::o;27692:222::-;27785:4;27823:2;27812:9;27808:18;27800:26;;27836:71;27904:1;27893:9;27889:17;27880:6;27836:71;:::i;:::-;27692:222;;;;:::o;27920:640::-;28115:4;28153:3;28142:9;28138:19;28130:27;;28167:71;28235:1;28224:9;28220:17;28211:6;28167:71;:::i;:::-;28248:72;28316:2;28305:9;28301:18;28292:6;28248:72;:::i;:::-;28330;28398:2;28387:9;28383:18;28374:6;28330:72;:::i;:::-;28449:9;28443:4;28439:20;28434:2;28423:9;28419:18;28412:48;28477:76;28548:4;28539:6;28477:76;:::i;:::-;28469:84;;27920:640;;;;;;;:::o;28566:332::-;28687:4;28725:2;28714:9;28710:18;28702:26;;28738:71;28806:1;28795:9;28791:17;28782:6;28738:71;:::i;:::-;28819:72;28887:2;28876:9;28872:18;28863:6;28819:72;:::i;:::-;28566:332;;;;;:::o;28904:674::-;29145:4;29183:2;29172:9;29168:18;29160:26;;29232:9;29226:4;29222:20;29218:1;29207:9;29203:17;29196:47;29260:108;29363:4;29354:6;29260:108;:::i;:::-;29252:116;;29415:9;29409:4;29405:20;29400:2;29389:9;29385:18;29378:48;29443:128;29566:4;29557:6;29443:128;:::i;:::-;29435:136;;28904:674;;;;;:::o;29584:1002::-;29907:4;29945:3;29934:9;29930:19;29922:27;;29995:9;29989:4;29985:20;29981:1;29970:9;29966:17;29959:47;30023:108;30126:4;30117:6;30023:108;:::i;:::-;30015:116;;30178:9;30172:4;30168:20;30163:2;30152:9;30148:18;30141:48;30206:128;30329:4;30320:6;30206:128;:::i;:::-;30198:136;;30344:72;30412:2;30401:9;30397:18;30388:6;30344:72;:::i;:::-;30426;30494:2;30483:9;30479:18;30470:6;30426:72;:::i;:::-;30508:71;30574:3;30563:9;30559:19;30550:6;30508:71;:::i;:::-;29584:1002;;;;;;;;:::o;30592:210::-;30679:4;30717:2;30706:9;30702:18;30694:26;;30730:65;30792:1;30781:9;30777:17;30768:6;30730:65;:::i;:::-;30592:210;;;;:::o;30808:313::-;30921:4;30959:2;30948:9;30944:18;30936:26;;31008:9;31002:4;30998:20;30994:1;30983:9;30979:17;30972:47;31036:78;31109:4;31100:6;31036:78;:::i;:::-;31028:86;;30808:313;;;;:::o;31127:419::-;31293:4;31331:2;31320:9;31316:18;31308:26;;31380:9;31374:4;31370:20;31366:1;31355:9;31351:17;31344:47;31408:131;31534:4;31408:131;:::i;:::-;31400:139;;31127:419;;;:::o;31552:::-;31718:4;31756:2;31745:9;31741:18;31733:26;;31805:9;31799:4;31795:20;31791:1;31780:9;31776:17;31769:47;31833:131;31959:4;31833:131;:::i;:::-;31825:139;;31552:419;;;:::o;31977:::-;32143:4;32181:2;32170:9;32166:18;32158:26;;32230:9;32224:4;32220:20;32216:1;32205:9;32201:17;32194:47;32258:131;32384:4;32258:131;:::i;:::-;32250:139;;31977:419;;;:::o;32402:::-;32568:4;32606:2;32595:9;32591:18;32583:26;;32655:9;32649:4;32645:20;32641:1;32630:9;32626:17;32619:47;32683:131;32809:4;32683:131;:::i;:::-;32675:139;;32402:419;;;:::o;32827:::-;32993:4;33031:2;33020:9;33016:18;33008:26;;33080:9;33074:4;33070:20;33066:1;33055:9;33051:17;33044:47;33108:131;33234:4;33108:131;:::i;:::-;33100:139;;32827:419;;;:::o;33252:::-;33418:4;33456:2;33445:9;33441:18;33433:26;;33505:9;33499:4;33495:20;33491:1;33480:9;33476:17;33469:47;33533:131;33659:4;33533:131;:::i;:::-;33525:139;;33252:419;;;:::o;33677:::-;33843:4;33881:2;33870:9;33866:18;33858:26;;33930:9;33924:4;33920:20;33916:1;33905:9;33901:17;33894:47;33958:131;34084:4;33958:131;:::i;:::-;33950:139;;33677:419;;;:::o;34102:::-;34268:4;34306:2;34295:9;34291:18;34283:26;;34355:9;34349:4;34345:20;34341:1;34330:9;34326:17;34319:47;34383:131;34509:4;34383:131;:::i;:::-;34375:139;;34102:419;;;:::o;34527:::-;34693:4;34731:2;34720:9;34716:18;34708:26;;34780:9;34774:4;34770:20;34766:1;34755:9;34751:17;34744:47;34808:131;34934:4;34808:131;:::i;:::-;34800:139;;34527:419;;;:::o;34952:::-;35118:4;35156:2;35145:9;35141:18;35133:26;;35205:9;35199:4;35195:20;35191:1;35180:9;35176:17;35169:47;35233:131;35359:4;35233:131;:::i;:::-;35225:139;;34952:419;;;:::o;35377:::-;35543:4;35581:2;35570:9;35566:18;35558:26;;35630:9;35624:4;35620:20;35616:1;35605:9;35601:17;35594:47;35658:131;35784:4;35658:131;:::i;:::-;35650:139;;35377:419;;;:::o;35802:::-;35968:4;36006:2;35995:9;35991:18;35983:26;;36055:9;36049:4;36045:20;36041:1;36030:9;36026:17;36019:47;36083:131;36209:4;36083:131;:::i;:::-;36075:139;;35802:419;;;:::o;36227:::-;36393:4;36431:2;36420:9;36416:18;36408:26;;36480:9;36474:4;36470:20;36466:1;36455:9;36451:17;36444:47;36508:131;36634:4;36508:131;:::i;:::-;36500:139;;36227:419;;;:::o;36652:::-;36818:4;36856:2;36845:9;36841:18;36833:26;;36905:9;36899:4;36895:20;36891:1;36880:9;36876:17;36869:47;36933:131;37059:4;36933:131;:::i;:::-;36925:139;;36652:419;;;:::o;37077:::-;37243:4;37281:2;37270:9;37266:18;37258:26;;37330:9;37324:4;37320:20;37316:1;37305:9;37301:17;37294:47;37358:131;37484:4;37358:131;:::i;:::-;37350:139;;37077:419;;;:::o;37502:::-;37668:4;37706:2;37695:9;37691:18;37683:26;;37755:9;37749:4;37745:20;37741:1;37730:9;37726:17;37719:47;37783:131;37909:4;37783:131;:::i;:::-;37775:139;;37502:419;;;:::o;37927:::-;38093:4;38131:2;38120:9;38116:18;38108:26;;38180:9;38174:4;38170:20;38166:1;38155:9;38151:17;38144:47;38208:131;38334:4;38208:131;:::i;:::-;38200:139;;37927:419;;;:::o;38352:::-;38518:4;38556:2;38545:9;38541:18;38533:26;;38605:9;38599:4;38595:20;38591:1;38580:9;38576:17;38569:47;38633:131;38759:4;38633:131;:::i;:::-;38625:139;;38352:419;;;:::o;38777:::-;38943:4;38981:2;38970:9;38966:18;38958:26;;39030:9;39024:4;39020:20;39016:1;39005:9;39001:17;38994:47;39058:131;39184:4;39058:131;:::i;:::-;39050:139;;38777:419;;;:::o;39202:::-;39368:4;39406:2;39395:9;39391:18;39383:26;;39455:9;39449:4;39445:20;39441:1;39430:9;39426:17;39419:47;39483:131;39609:4;39483:131;:::i;:::-;39475:139;;39202:419;;;:::o;39627:::-;39793:4;39831:2;39820:9;39816:18;39808:26;;39880:9;39874:4;39870:20;39866:1;39855:9;39851:17;39844:47;39908:131;40034:4;39908:131;:::i;:::-;39900:139;;39627:419;;;:::o;40052:222::-;40145:4;40183:2;40172:9;40168:18;40160:26;;40196:71;40264:1;40253:9;40249:17;40240:6;40196:71;:::i;:::-;40052:222;;;;:::o;40280:751::-;40503:4;40541:3;40530:9;40526:19;40518:27;;40555:71;40623:1;40612:9;40608:17;40599:6;40555:71;:::i;:::-;40673:9;40667:4;40663:20;40658:2;40647:9;40643:18;40636:48;40701:78;40774:4;40765:6;40701:78;:::i;:::-;40693:86;;40789:72;40857:2;40846:9;40842:18;40833:6;40789:72;:::i;:::-;40871;40939:2;40928:9;40924:18;40915:6;40871:72;:::i;:::-;40953:71;41019:3;41008:9;41004:19;40995:6;40953:71;:::i;:::-;40280:751;;;;;;;;:::o;41037:218::-;41128:4;41166:2;41155:9;41151:18;41143:26;;41179:69;41245:1;41234:9;41230:17;41221:6;41179:69;:::i;:::-;41037:218;;;;:::o;41261:129::-;41295:6;41322:20;;:::i;:::-;41312:30;;41351:33;41379:4;41371:6;41351:33;:::i;:::-;41261:129;;;:::o;41396:75::-;41429:6;41462:2;41456:9;41446:19;;41396:75;:::o;41477:311::-;41554:4;41644:18;41636:6;41633:30;41630:56;;;41666:18;;:::i;:::-;41630:56;41716:4;41708:6;41704:17;41696:25;;41776:4;41770;41766:15;41758:23;;41477:311;;;:::o;41794:321::-;41881:4;41971:18;41963:6;41960:30;41957:56;;;41993:18;;:::i;:::-;41957:56;42043:4;42035:6;42031:17;42023:25;;42103:4;42097;42093:15;42085:23;;41794:321;;;:::o;42121:311::-;42198:4;42288:18;42280:6;42277:30;42274:56;;;42310:18;;:::i;:::-;42274:56;42360:4;42352:6;42348:17;42340:25;;42420:4;42414;42410:15;42402:23;;42121:311;;;:::o;42438:307::-;42499:4;42589:18;42581:6;42578:30;42575:56;;;42611:18;;:::i;:::-;42575:56;42649:29;42671:6;42649:29;:::i;:::-;42641:37;;42733:4;42727;42723:15;42715:23;;42438:307;;;:::o;42751:308::-;42813:4;42903:18;42895:6;42892:30;42889:56;;;42925:18;;:::i;:::-;42889:56;42963:29;42985:6;42963:29;:::i;:::-;42955:37;;43047:4;43041;43037:15;43029:23;;42751:308;;;:::o;43065:142::-;43142:4;43165:3;43157:11;;43195:4;43190:3;43186:14;43178:22;;43065:142;;;:::o;43213:132::-;43280:4;43303:3;43295:11;;43333:4;43328:3;43324:14;43316:22;;43213:132;;;:::o;43351:124::-;43428:6;43462:5;43456:12;43446:22;;43351:124;;;:::o;43481:114::-;43548:6;43582:5;43576:12;43566:22;;43481:114;;;:::o;43601:98::-;43652:6;43686:5;43680:12;43670:22;;43601:98;;;:::o;43705:99::-;43757:6;43791:5;43785:12;43775:22;;43705:99;;;:::o;43810:123::-;43890:4;43922;43917:3;43913:14;43905:22;;43810:123;;;:::o;43939:113::-;44009:4;44041;44036:3;44032:14;44024:22;;43939:113;;;:::o;44058:194::-;44167:11;44201:6;44196:3;44189:19;44241:4;44236:3;44232:14;44217:29;;44058:194;;;;:::o;44258:184::-;44357:11;44391:6;44386:3;44379:19;44431:4;44426:3;44422:14;44407:29;;44258:184;;;;:::o;44448:168::-;44531:11;44565:6;44560:3;44553:19;44605:4;44600:3;44596:14;44581:29;;44448:168;;;;:::o;44622:159::-;44696:11;44730:6;44725:3;44718:19;44770:4;44765:3;44761:14;44746:29;;44622:159;;;;:::o;44787:169::-;44871:11;44905:6;44900:3;44893:19;44945:4;44940:3;44936:14;44921:29;;44787:169;;;;:::o;44962:185::-;45002:1;45019:20;45037:1;45019:20;:::i;:::-;45014:25;;45053:20;45071:1;45053:20;:::i;:::-;45048:25;;45092:1;45082:35;;45097:18;;:::i;:::-;45082:35;45139:1;45136;45132:9;45127:14;;44962:185;;;;:::o;45153:348::-;45193:7;45216:20;45234:1;45216:20;:::i;:::-;45211:25;;45250:20;45268:1;45250:20;:::i;:::-;45245:25;;45438:1;45370:66;45366:74;45363:1;45360:81;45355:1;45348:9;45341:17;45337:105;45334:131;;;45445:18;;:::i;:::-;45334:131;45493:1;45490;45486:9;45475:20;;45153:348;;;;:::o;45507:191::-;45547:4;45567:20;45585:1;45567:20;:::i;:::-;45562:25;;45601:20;45619:1;45601:20;:::i;:::-;45596:25;;45640:1;45637;45634:8;45631:34;;;45645:18;;:::i;:::-;45631:34;45690:1;45687;45683:9;45675:17;;45507:191;;;;:::o;45704:96::-;45741:7;45770:24;45788:5;45770:24;:::i;:::-;45759:35;;45704:96;;;:::o;45806:90::-;45840:7;45883:5;45876:13;45869:21;45858:32;;45806:90;;;:::o;45902:149::-;45938:7;45978:66;45971:5;45967:78;45956:89;;45902:149;;;:::o;46057:126::-;46094:7;46134:42;46127:5;46123:54;46112:65;;46057:126;;;:::o;46189:77::-;46226:7;46255:5;46244:16;;46189:77;;;:::o;46272:109::-;46308:7;46348:26;46341:5;46337:38;46326:49;;46272:109;;;:::o;46387:154::-;46471:6;46466:3;46461;46448:30;46533:1;46524:6;46519:3;46515:16;46508:27;46387:154;;;:::o;46547:307::-;46615:1;46625:113;46639:6;46636:1;46633:13;46625:113;;;46724:1;46719:3;46715:11;46709:18;46705:1;46700:3;46696:11;46689:39;46661:2;46658:1;46654:10;46649:15;;46625:113;;;46756:6;46753:1;46750:13;46747:101;;;46836:1;46827:6;46822:3;46818:16;46811:27;46747:101;46596:258;46547:307;;;:::o;46860:320::-;46904:6;46941:1;46935:4;46931:12;46921:22;;46988:1;46982:4;46978:12;47009:18;46999:81;;47065:4;47057:6;47053:17;47043:27;;46999:81;47127:2;47119:6;47116:14;47096:18;47093:38;47090:84;;;47146:18;;:::i;:::-;47090:84;46911:269;46860:320;;;:::o;47186:281::-;47269:27;47291:4;47269:27;:::i;:::-;47261:6;47257:40;47399:6;47387:10;47384:22;47363:18;47351:10;47348:34;47345:62;47342:88;;;47410:18;;:::i;:::-;47342:88;47450:10;47446:2;47439:22;47229:238;47186:281;;:::o;47473:233::-;47512:3;47535:24;47553:5;47535:24;:::i;:::-;47526:33;;47581:66;47574:5;47571:77;47568:103;;;47651:18;;:::i;:::-;47568:103;47698:1;47691:5;47687:13;47680:20;;47473:233;;;:::o;47712:180::-;47760:77;47757:1;47750:88;47857:4;47854:1;47847:15;47881:4;47878:1;47871:15;47898:180;47946:77;47943:1;47936:88;48043:4;48040:1;48033:15;48067:4;48064:1;48057:15;48084:180;48132:77;48129:1;48122:88;48229:4;48226:1;48219:15;48253:4;48250:1;48243:15;48270:180;48318:77;48315:1;48308:88;48415:4;48412:1;48405:15;48439:4;48436:1;48429:15;48456:180;48504:77;48501:1;48494:88;48601:4;48598:1;48591:15;48625:4;48622:1;48615:15;48642:180;48690:77;48687:1;48680:88;48787:4;48784:1;48777:15;48811:4;48808:1;48801:15;48828:117;48937:1;48934;48927:12;48951:117;49060:1;49057;49050:12;49074:117;49183:1;49180;49173:12;49197:117;49306:1;49303;49296:12;49320:117;49429:1;49426;49419:12;49443:102;49484:6;49535:2;49531:7;49526:2;49519:5;49515:14;49511:28;49501:38;;49443:102;;;:::o;49551:232::-;49691:34;49687:1;49679:6;49675:14;49668:58;49760:15;49755:2;49747:6;49743:15;49736:40;49551:232;:::o;49789:230::-;49929:34;49925:1;49917:6;49913:14;49906:58;49998:13;49993:2;49985:6;49981:15;49974:38;49789:230;:::o;50025:237::-;50165:34;50161:1;50153:6;50149:14;50142:58;50234:20;50229:2;50221:6;50217:15;50210:45;50025:237;:::o;50268:225::-;50408:34;50404:1;50396:6;50392:14;50385:58;50477:8;50472:2;50464:6;50460:15;50453:33;50268:225;:::o;50499:224::-;50639:34;50635:1;50627:6;50623:14;50616:58;50708:7;50703:2;50695:6;50691:15;50684:32;50499:224;:::o;50729:178::-;50869:30;50865:1;50857:6;50853:14;50846:54;50729:178;:::o;50913:177::-;51053:29;51049:1;51041:6;51037:14;51030:53;50913:177;:::o;51096:175::-;51236:27;51232:1;51224:6;51220:14;51213:51;51096:175;:::o;51277:223::-;51417:34;51413:1;51405:6;51401:14;51394:58;51486:6;51481:2;51473:6;51469:15;51462:31;51277:223;:::o;51506:175::-;51646:27;51642:1;51634:6;51630:14;51623:51;51506:175;:::o;51687:177::-;51827:29;51823:1;51815:6;51811:14;51804:53;51687:177;:::o;51870:168::-;52010:20;52006:1;51998:6;51994:14;51987:44;51870:168;:::o;52044:228::-;52184:34;52180:1;52172:6;52168:14;52161:58;52253:11;52248:2;52240:6;52236:15;52229:36;52044:228;:::o;52278:177::-;52418:29;52414:1;52406:6;52402:14;52395:53;52278:177;:::o;52461:182::-;52601:34;52597:1;52589:6;52585:14;52578:58;52461:182;:::o;52649:::-;52789:34;52785:1;52777:6;52773:14;52766:58;52649:182;:::o;52837:174::-;52977:26;52973:1;52965:6;52961:14;52954:50;52837:174;:::o;53017:220::-;53157:34;53153:1;53145:6;53141:14;53134:58;53226:3;53221:2;53213:6;53209:15;53202:28;53017:220;:::o;53243:248::-;53383:34;53379:1;53371:6;53367:14;53360:58;53452:31;53447:2;53439:6;53435:15;53428:56;53243:248;:::o;53497:231::-;53637:34;53633:1;53625:6;53621:14;53614:58;53706:14;53701:2;53693:6;53689:15;53682:39;53497:231;:::o;53734:240::-;53874:34;53870:1;53862:6;53858:14;53851:58;53943:23;53938:2;53930:6;53926:15;53919:48;53734:240;:::o;53980:122::-;54053:24;54071:5;54053:24;:::i;:::-;54046:5;54043:35;54033:63;;54092:1;54089;54082:12;54033:63;53980:122;:::o;54108:116::-;54178:21;54193:5;54178:21;:::i;:::-;54171:5;54168:32;54158:60;;54214:1;54211;54204:12;54158:60;54108:116;:::o;54230:120::-;54302:23;54319:5;54302:23;:::i;:::-;54295:5;54292:34;54282:62;;54340:1;54337;54330:12;54282:62;54230:120;:::o;54356:122::-;54429:24;54447:5;54429:24;:::i;:::-;54422:5;54419:35;54409:63;;54468:1;54465;54458:12;54409:63;54356:122;:::o;54484:120::-;54556:23;54573:5;54556:23;:::i;:::-;54549:5;54546:34;54536:62;;54594:1;54591;54584:12;54536:62;54484:120;:::o

Swarm Source

ipfs://21f4dc25ac3bafc996534b905d0052f827c1ae77837fbce8e972db1c66c1a0c9
Loading...
Loading
[ 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.