S Price: $0.414591 (+0.99%)

FlowerNFT (FLOWERNFT)

Overview

TokenID

2

Total Transfers

-

Market

Onchain 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:
FlowerNFT

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

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


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/[email protected]/token/ERC721/IERC721.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/[email protected]/token/ERC721/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Metadata.sol


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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


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

pragma solidity ^0.8.0;



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

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

    /**
     * @dev Converts a `int256` to its ASCII `string` decimal representation.
     */
    function toString(int256 value) internal pure returns (string memory) {
        return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value))));
    }

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

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

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

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

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


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

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

        _owners[tokenId] = to;

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

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

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

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

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

        // Clear approvals
        delete _tokenApprovals[tokenId];

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId, 1);

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

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

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

        emit Transfer(from, to, tokenId);

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

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

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

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

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

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

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

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

// File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Enumerable.sol


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

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721Enumerable.sol


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

        uint256 tokenId = firstTokenId;

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/[email protected]/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

    bool private _paused;

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

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

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

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

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

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

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

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

// File: flowernft.sol


pragma solidity ^0.8.0;




interface IFlowerPower {
    function burn(uint256 tokenId) external;
    function ownerOf(uint256 tokenId) external view returns (address);
}

contract FlowerNFT is ERC721Enumerable, Ownable, Pausable {
    using Strings for uint256;

    uint256 public maxLevel = 10; // Changeable by the contract owner
    mapping(uint256 => uint256) public levels;

    IFlowerPower public FlowerPowerContract;
    string private baseURI;

    event Mint(address indexed to, uint256 tokenId);
    event MintBatch(address indexed to, uint256 amount);
    event LevelUp(address indexed user, uint256 tokenId, uint256 previousLevel, uint256 newLevel);
    event MaxLevelUpdated(uint256 newMaxLevel);
    event FlowerPowerContractUpdated(address newAddress);

    constructor(address POWERAddress, string memory baseURI_) ERC721("FlowerNFT", "FLOWERNFT") {
        require(POWERAddress != address(0), "FlowerPower contract address cannot be zero");
        FlowerPowerContract = IFlowerPower(POWERAddress);
        baseURI = baseURI_;
    }

    function setFlowerPowerAddress(address newAddress) external onlyOwner {
        require(newAddress != address(0), "Invalid address");
        FlowerPowerContract = IFlowerPower(newAddress);
        emit FlowerPowerContractUpdated(newAddress);
    }

    function setMaxLevel(uint256 newMaxLevel) external onlyOwner {
        require(newMaxLevel >= 1, "Max level must be at least 1");
        maxLevel = newMaxLevel;
        emit MaxLevelUpdated(newMaxLevel);
    }

    function mint(address to) external onlyOwner whenNotPaused {
        uint256 tokenId = totalSupply() + 1;
        _safeMint(to, tokenId);
        levels[tokenId] = 1;
        emit Mint(to, tokenId);
    }

    function mintBatch(address to, uint256 amount) external onlyOwner whenNotPaused {
        require(amount > 0, "Amount must be greater than 0");

        uint256 startId = totalSupply() + 1;
        for (uint256 i = 0; i < amount; i++) {
            _safeMint(to, startId + i);
            levels[startId + i] = 1;
        }

        emit MintBatch(to, amount);
    }

    function levelUp(uint256 flowerTokenId, uint256 POWERTokenId) external whenNotPaused {
        require(ownerOf(flowerTokenId) == msg.sender, "You do not own this FlowerNFT");
        require(levels[flowerTokenId] < maxLevel, "Already at max level");
        require(address(FlowerPowerContract) != address(0), "FlowerPower contract not set");
        require(FlowerPowerContract.ownerOf(POWERTokenId) == msg.sender, "You do not own this FlowerPower NFT");

        uint256 previousLevel = levels[flowerTokenId];

        FlowerPowerContract.burn(POWERTokenId);
        levels[flowerTokenId] += 1;

        emit LevelUp(msg.sender, flowerTokenId, previousLevel, levels[flowerTokenId]);
    }

    function setBaseURI(string memory newBaseURI) external onlyOwner {
        baseURI = newBaseURI;
    }

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

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "Token does not exist");
        uint256 currentLevel = levels[tokenId];
        return string(abi.encodePacked(baseURI, "/level_", currentLevel.toString(), ".json"));
    }

    function pause() external onlyOwner {
        _pause();
    }

    function unpause() external onlyOwner {
        _unpause();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"POWERAddress","type":"address"},{"internalType":"string","name":"baseURI_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"FlowerPowerContractUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"previousLevel","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newLevel","type":"uint256"}],"name":"LevelUp","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxLevel","type":"uint256"}],"name":"MaxLevelUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MintBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"FlowerPowerContract","outputs":[{"internalType":"contract IFlowerPower","name":"","type":"address"}],"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":"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":[{"internalType":"uint256","name":"flowerTokenId","type":"uint256"},{"internalType":"uint256","name":"POWERTokenId","type":"uint256"}],"name":"levelUp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"levels","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setFlowerPowerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxLevel","type":"uint256"}],"name":"setMaxLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600a600b553480156200001657600080fd5b5060405162004f9438038062004f9483398181016040528101906200003c91906200049c565b6040518060400160405280600981526020017f466c6f7765724e465400000000000000000000000000000000000000000000008152506040518060400160405280600981526020017f464c4f5745524e465400000000000000000000000000000000000000000000008152508160009081620000b991906200074d565b508060019081620000cb91906200074d565b505050620000ee620000e2620001d660201b60201c565b620001de60201b60201c565b6000600a60146101000a81548160ff021916908315150217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200017b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200017290620008bb565b60405180910390fd5b81600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600e9081620001cd91906200074d565b505050620008dd565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002e582620002b8565b9050919050565b620002f781620002d8565b81146200030357600080fd5b50565b6000815190506200031781620002ec565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003728262000327565b810181811067ffffffffffffffff8211171562000394576200039362000338565b5b80604052505050565b6000620003a9620002a4565b9050620003b7828262000367565b919050565b600067ffffffffffffffff821115620003da57620003d962000338565b5b620003e58262000327565b9050602081019050919050565b60005b8381101562000412578082015181840152602081019050620003f5565b60008484015250505050565b6000620004356200042f84620003bc565b6200039d565b90508281526020810184848401111562000454576200045362000322565b5b62000461848285620003f2565b509392505050565b600082601f8301126200048157620004806200031d565b5b8151620004938482602086016200041e565b91505092915050565b60008060408385031215620004b657620004b5620002ae565b5b6000620004c68582860162000306565b925050602083015167ffffffffffffffff811115620004ea57620004e9620002b3565b5b620004f88582860162000469565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200055557607f821691505b6020821081036200056b576200056a6200050d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005d57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000596565b620005e1868362000596565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200062e620006286200062284620005f9565b62000603565b620005f9565b9050919050565b6000819050919050565b6200064a836200060d565b62000662620006598262000635565b848454620005a3565b825550505050565b600090565b620006796200066a565b620006868184846200063f565b505050565b5b81811015620006ae57620006a26000826200066f565b6001810190506200068c565b5050565b601f821115620006fd57620006c78162000571565b620006d28462000586565b81016020851015620006e2578190505b620006fa620006f18562000586565b8301826200068b565b50505b505050565b600082821c905092915050565b6000620007226000198460080262000702565b1980831691505092915050565b60006200073d83836200070f565b9150826002028217905092915050565b620007588262000502565b67ffffffffffffffff81111562000774576200077362000338565b5b6200078082546200053c565b6200078d828285620006b2565b600060209050601f831160018114620007c55760008415620007b0578287015190505b620007bc85826200072f565b8655506200082c565b601f198416620007d58662000571565b60005b82811015620007ff57848901518255600182019150602085019450602081019050620007d8565b868310156200081f57848901516200081b601f8916826200070f565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f466c6f776572506f77657220636f6e747261637420616464726573732063616e60008201527f6e6f74206265207a65726f000000000000000000000000000000000000000000602082015250565b6000620008a3602b8362000834565b9150620008b08262000845565b604082019050919050565b60006020820190508181036000830152620008d68162000894565b9050919050565b6146a780620008ed6000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c80636352211e1161010f578063a22cb465116100a2578063c87b56dd11610071578063c87b56dd14610540578063cc06c35914610570578063e985e9c51461058e578063f2fde38b146105be576101e5565b8063a22cb465146104ba578063a7b443bb146104d6578063b2596a67146104f4578063b88d4fde14610524576101e5565b8063817731bb116100de578063817731bb146104585780638456cb59146104745780638da5cb5b1461047e57806395d89b411461049c576101e5565b80636352211e146103d25780636a6278421461040257806370a082311461041e578063715018a61461044e576101e5565b80632f745c59116101875780634f6ccce7116101565780634f6ccce71461034c5780635226dc931461037c57806355f804b3146103985780635c975abb146103b4576101e5565b80632f745c59146102da578063344f1ba51461030a5780633f4ba83a1461032657806342842e0e14610330576101e5565b8063095ea7b3116101c3578063095ea7b31461026857806318160ddd1461028457806323b872dd146102a2578063248b71fc146102be576101e5565b806301ffc9a7146101ea57806306fdde031461021a578063081812fc14610238575b600080fd5b61020460048036038101906101ff9190612b92565b6105da565b6040516102119190612bda565b60405180910390f35b610222610654565b60405161022f9190612c85565b60405180910390f35b610252600480360381019061024d9190612cdd565b6106e6565b60405161025f9190612d4b565b60405180910390f35b610282600480360381019061027d9190612d92565b61072c565b005b61028c610843565b6040516102999190612de1565b60405180910390f35b6102bc60048036038101906102b79190612dfc565b610850565b005b6102d860048036038101906102d39190612d92565b6108b0565b005b6102f460048036038101906102ef9190612d92565b6109c6565b6040516103019190612de1565b60405180910390f35b610324600480360381019061031f9190612cdd565b610a6b565b005b61032e610af8565b005b61034a60048036038101906103459190612dfc565b610b0a565b005b61036660048036038101906103619190612cdd565b610b2a565b6040516103739190612de1565b60405180910390f35b61039660048036038101906103919190612e4f565b610b9b565b005b6103b260048036038101906103ad9190612fc4565b610f44565b005b6103bc610f5f565b6040516103c99190612bda565b60405180910390f35b6103ec60048036038101906103e79190612cdd565b610f76565b6040516103f99190612d4b565b60405180910390f35b61041c6004803603810190610417919061300d565b610ffc565b005b6104386004803603810190610433919061300d565b611099565b6040516104459190612de1565b60405180910390f35b610456611150565b005b610472600480360381019061046d919061300d565b611164565b005b61047c611256565b005b610486611268565b6040516104939190612d4b565b60405180910390f35b6104a4611292565b6040516104b19190612c85565b60405180910390f35b6104d460048036038101906104cf9190613066565b611324565b005b6104de61133a565b6040516104eb9190613105565b60405180910390f35b61050e60048036038101906105099190612cdd565b611360565b60405161051b9190612de1565b60405180910390f35b61053e600480360381019061053991906131c1565b611378565b005b61055a60048036038101906105559190612cdd565b6113da565b6040516105679190612c85565b60405180910390f35b61057861146f565b6040516105859190612de1565b60405180910390f35b6105a860048036038101906105a39190613244565b611475565b6040516105b59190612bda565b60405180910390f35b6105d860048036038101906105d3919061300d565b611509565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061064d575061064c8261158c565b5b9050919050565b606060008054610663906132b3565b80601f016020809104026020016040519081016040528092919081815260200182805461068f906132b3565b80156106dc5780601f106106b1576101008083540402835291602001916106dc565b820191906000526020600020905b8154815290600101906020018083116106bf57829003601f168201915b5050505050905090565b60006106f18261166e565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061073782610f76565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079e90613356565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107c66116b9565b73ffffffffffffffffffffffffffffffffffffffff1614806107f557506107f4816107ef6116b9565b611475565b5b610834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082b906133e8565b60405180910390fd5b61083e83836116c1565b505050565b6000600880549050905090565b61086161085b6116b9565b8261177a565b6108a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108979061347a565b60405180910390fd5b6108ab83838361180f565b505050565b6108b8611b08565b6108c0611b86565b60008111610903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fa906134e6565b60405180910390fd5b6000600161090f610843565b6109199190613535565b905060005b828110156109725761093b8482846109369190613535565b611bd0565b6001600c6000838561094d9190613535565b815260200190815260200160002081905550808061096a90613569565b91505061091e565b508273ffffffffffffffffffffffffffffffffffffffff167ff2d22a802fa8508cb755e309620b4a3dfeac486dd4c53fd49c316855fc451f22836040516109b99190612de1565b60405180910390a2505050565b60006109d183611099565b8210610a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0990613623565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a73611b08565b6001811015610ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aae9061368f565b60405180910390fd5b80600b819055507f208d11d52773c1d4fd0ee1d58ba297710cbb04e75e4ec24b4898f3745cce9bb381604051610aed9190612de1565b60405180910390a150565b610b00611b08565b610b08611bee565b565b610b2583838360405180602001604052806000815250611378565b505050565b6000610b34610843565b8210610b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6c90613721565b60405180910390fd5b60088281548110610b8957610b88613741565b5b90600052602060002001549050919050565b610ba3611b86565b3373ffffffffffffffffffffffffffffffffffffffff16610bc383610f76565b73ffffffffffffffffffffffffffffffffffffffff1614610c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c10906137bc565b60405180910390fd5b600b54600c60008481526020019081526020016000205410610c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6790613828565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf890613894565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610d739190612de1565b602060405180830381865afa158015610d90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db491906138c9565b73ffffffffffffffffffffffffffffffffffffffff1614610e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0190613968565b60405180910390fd5b6000600c6000848152602001908152602001600020549050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68836040518263ffffffff1660e01b8152600401610e7d9190612de1565b600060405180830381600087803b158015610e9757600080fd5b505af1158015610eab573d6000803e3d6000fd5b505050506001600c60008581526020019081526020016000206000828254610ed39190613535565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f0ee22ce17ae6ff55501ec7491afa3f5397a17ee7cd88fe56c39569e2c13bd9188483600c600088815260200190815260200160002054604051610f3793929190613988565b60405180910390a2505050565b610f4c611b08565b80600e9081610f5b9190613b61565b5050565b6000600a60149054906101000a900460ff16905090565b600080610f8283611c51565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fea90613c7f565b60405180910390fd5b80915050919050565b611004611b08565b61100c611b86565b60006001611018610843565b6110229190613535565b905061102e8282611bd0565b6001600c6000838152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161108d9190612de1565b60405180910390a25050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611109576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110090613d11565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611158611b08565b6111626000611c8e565b565b61116c611b08565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d290613d7d565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f7c419c072016df3f812503da3d5f59c6d6058a69f9c01d9e6c7d187eb8b5c8f68160405161124b9190612d4b565b60405180910390a150565b61125e611b08565b611266611d54565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112a1906132b3565b80601f01602080910402602001604051908101604052809291908181526020018280546112cd906132b3565b801561131a5780601f106112ef5761010080835404028352916020019161131a565b820191906000526020600020905b8154815290600101906020018083116112fd57829003601f168201915b5050505050905090565b61133661132f6116b9565b8383611db7565b5050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c6020528060005260406000206000915090505481565b6113896113836116b9565b8361177a565b6113c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bf9061347a565b60405180910390fd5b6113d484848484611f23565b50505050565b60606113e582611f7f565b611424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141b90613de9565b60405180910390fd5b6000600c6000848152602001908152602001600020549050600e61144782611fc0565b604051602001611458929190613f60565b604051602081830303815290604052915050919050565b600b5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611511611b08565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611580576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115779061400c565b60405180910390fd5b61158981611c8e565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061165757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061166757506116668261208e565b5b9050919050565b61167781611f7f565b6116b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ad90613c7f565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661173483610f76565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061178683610f76565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806117c857506117c78185611475565b5b8061180657508373ffffffffffffffffffffffffffffffffffffffff166117ee846106e6565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661182f82610f76565b73ffffffffffffffffffffffffffffffffffffffff1614611885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187c9061409e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118eb90614130565b60405180910390fd5b61190183838360016120f8565b8273ffffffffffffffffffffffffffffffffffffffff1661192182610f76565b73ffffffffffffffffffffffffffffffffffffffff1614611977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196e9061409e565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b038383836001612256565b505050565b611b106116b9565b73ffffffffffffffffffffffffffffffffffffffff16611b2e611268565b73ffffffffffffffffffffffffffffffffffffffff1614611b84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7b9061419c565b60405180910390fd5b565b611b8e610f5f565b15611bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc590614208565b60405180910390fd5b565b611bea82826040518060200160405280600081525061225c565b5050565b611bf66122b7565b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611c3a6116b9565b604051611c479190612d4b565b60405180910390a1565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611d5c611b86565b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611da06116b9565b604051611dad9190612d4b565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614274565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f169190612bda565b60405180910390a3505050565b611f2e84848461180f565b611f3a84848484612300565b611f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7090614306565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16611fa183611c51565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b606060006001611fcf84612487565b01905060008167ffffffffffffffff811115611fee57611fed612e99565b5b6040519080825280601f01601f1916602001820160405280156120205781602001600182028036833780820191505090505b509050600082602001820190505b600115612083578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161207757612076614326565b5b0494506000850361202e575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612104848484846125da565b6001811115612148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213f906143c7565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361218f5761218a816125e0565b6121ce565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146121cd576121cc8582612629565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036122105761220b81612796565b61224f565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461224e5761224d8482612867565b5b5b5050505050565b50505050565b61226683836128e6565b6122736000848484612300565b6122b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a990614306565b60405180910390fd5b505050565b6122bf610f5f565b6122fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f590614433565b60405180910390fd5b565b60006123218473ffffffffffffffffffffffffffffffffffffffff16612b03565b1561247a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261234a6116b9565b8786866040518563ffffffff1660e01b815260040161236c94939291906144a8565b6020604051808303816000875af19250505080156123a857506040513d601f19601f820116820180604052508101906123a59190614509565b60015b61242a573d80600081146123d8576040519150601f19603f3d011682016040523d82523d6000602084013e6123dd565b606091505b506000815103612422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241990614306565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061247f565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106124e5577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816124db576124da614326565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612522576d04ee2d6d415b85acef8100000000838161251857612517614326565b5b0492506020810190505b662386f26fc10000831061255157662386f26fc10000838161254757612546614326565b5b0492506010810190505b6305f5e100831061257a576305f5e10083816125705761256f614326565b5b0492506008810190505b612710831061259f57612710838161259557612594614326565b5b0492506004810190505b606483106125c257606483816125b8576125b7614326565b5b0492506002810190505b600a83106125d1576001810190505b80915050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161263684611099565b6126409190614536565b9050600060076000848152602001908152602001600020549050818114612725576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127aa9190614536565b90506000600960008481526020019081526020016000205490506000600883815481106127da576127d9613741565b5b9060005260206000200154905080600883815481106127fc576127fb613741565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061284b5761284a61456a565b5b6001900381819060005260206000200160009055905550505050565b600061287283611099565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294c906145e5565b60405180910390fd5b61295e81611f7f565b1561299e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299590614651565b60405180910390fd5b6129ac6000838360016120f8565b6129b581611f7f565b156129f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ec90614651565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612aff600083836001612256565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b6f81612b3a565b8114612b7a57600080fd5b50565b600081359050612b8c81612b66565b92915050565b600060208284031215612ba857612ba7612b30565b5b6000612bb684828501612b7d565b91505092915050565b60008115159050919050565b612bd481612bbf565b82525050565b6000602082019050612bef6000830184612bcb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c2f578082015181840152602081019050612c14565b60008484015250505050565b6000601f19601f8301169050919050565b6000612c5782612bf5565b612c618185612c00565b9350612c71818560208601612c11565b612c7a81612c3b565b840191505092915050565b60006020820190508181036000830152612c9f8184612c4c565b905092915050565b6000819050919050565b612cba81612ca7565b8114612cc557600080fd5b50565b600081359050612cd781612cb1565b92915050565b600060208284031215612cf357612cf2612b30565b5b6000612d0184828501612cc8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d3582612d0a565b9050919050565b612d4581612d2a565b82525050565b6000602082019050612d606000830184612d3c565b92915050565b612d6f81612d2a565b8114612d7a57600080fd5b50565b600081359050612d8c81612d66565b92915050565b60008060408385031215612da957612da8612b30565b5b6000612db785828601612d7d565b9250506020612dc885828601612cc8565b9150509250929050565b612ddb81612ca7565b82525050565b6000602082019050612df66000830184612dd2565b92915050565b600080600060608486031215612e1557612e14612b30565b5b6000612e2386828701612d7d565b9350506020612e3486828701612d7d565b9250506040612e4586828701612cc8565b9150509250925092565b60008060408385031215612e6657612e65612b30565b5b6000612e7485828601612cc8565b9250506020612e8585828601612cc8565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ed182612c3b565b810181811067ffffffffffffffff82111715612ef057612eef612e99565b5b80604052505050565b6000612f03612b26565b9050612f0f8282612ec8565b919050565b600067ffffffffffffffff821115612f2f57612f2e612e99565b5b612f3882612c3b565b9050602081019050919050565b82818337600083830152505050565b6000612f67612f6284612f14565b612ef9565b905082815260208101848484011115612f8357612f82612e94565b5b612f8e848285612f45565b509392505050565b600082601f830112612fab57612faa612e8f565b5b8135612fbb848260208601612f54565b91505092915050565b600060208284031215612fda57612fd9612b30565b5b600082013567ffffffffffffffff811115612ff857612ff7612b35565b5b61300484828501612f96565b91505092915050565b60006020828403121561302357613022612b30565b5b600061303184828501612d7d565b91505092915050565b61304381612bbf565b811461304e57600080fd5b50565b6000813590506130608161303a565b92915050565b6000806040838503121561307d5761307c612b30565b5b600061308b85828601612d7d565b925050602061309c85828601613051565b9150509250929050565b6000819050919050565b60006130cb6130c66130c184612d0a565b6130a6565b612d0a565b9050919050565b60006130dd826130b0565b9050919050565b60006130ef826130d2565b9050919050565b6130ff816130e4565b82525050565b600060208201905061311a60008301846130f6565b92915050565b600067ffffffffffffffff82111561313b5761313a612e99565b5b61314482612c3b565b9050602081019050919050565b600061316461315f84613120565b612ef9565b9050828152602081018484840111156131805761317f612e94565b5b61318b848285612f45565b509392505050565b600082601f8301126131a8576131a7612e8f565b5b81356131b8848260208601613151565b91505092915050565b600080600080608085870312156131db576131da612b30565b5b60006131e987828801612d7d565b94505060206131fa87828801612d7d565b935050604061320b87828801612cc8565b925050606085013567ffffffffffffffff81111561322c5761322b612b35565b5b61323887828801613193565b91505092959194509250565b6000806040838503121561325b5761325a612b30565b5b600061326985828601612d7d565b925050602061327a85828601612d7d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806132cb57607f821691505b6020821081036132de576132dd613284565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613340602183612c00565b915061334b826132e4565b604082019050919050565b6000602082019050818103600083015261336f81613333565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006133d2603d83612c00565b91506133dd82613376565b604082019050919050565b60006020820190508181036000830152613401816133c5565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613464602d83612c00565b915061346f82613408565b604082019050919050565b6000602082019050818103600083015261349381613457565b9050919050565b7f416d6f756e74206d7573742062652067726561746572207468616e2030000000600082015250565b60006134d0601d83612c00565b91506134db8261349a565b602082019050919050565b600060208201905081810360008301526134ff816134c3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061354082612ca7565b915061354b83612ca7565b925082820190508082111561356357613562613506565b5b92915050565b600061357482612ca7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036135a6576135a5613506565b5b600182019050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061360d602b83612c00565b9150613618826135b1565b604082019050919050565b6000602082019050818103600083015261363c81613600565b9050919050565b7f4d6178206c6576656c206d757374206265206174206c65617374203100000000600082015250565b6000613679601c83612c00565b915061368482613643565b602082019050919050565b600060208201905081810360008301526136a88161366c565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061370b602c83612c00565b9150613716826136af565b604082019050919050565b6000602082019050818103600083015261373a816136fe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f596f7520646f206e6f74206f776e207468697320466c6f7765724e4654000000600082015250565b60006137a6601d83612c00565b91506137b182613770565b602082019050919050565b600060208201905081810360008301526137d581613799565b9050919050565b7f416c7265616479206174206d6178206c6576656c000000000000000000000000600082015250565b6000613812601483612c00565b915061381d826137dc565b602082019050919050565b6000602082019050818103600083015261384181613805565b9050919050565b7f466c6f776572506f77657220636f6e7472616374206e6f742073657400000000600082015250565b600061387e601c83612c00565b915061388982613848565b602082019050919050565b600060208201905081810360008301526138ad81613871565b9050919050565b6000815190506138c381612d66565b92915050565b6000602082840312156138df576138de612b30565b5b60006138ed848285016138b4565b91505092915050565b7f596f7520646f206e6f74206f776e207468697320466c6f776572506f7765722060008201527f4e46540000000000000000000000000000000000000000000000000000000000602082015250565b6000613952602383612c00565b915061395d826138f6565b604082019050919050565b6000602082019050818103600083015261398181613945565b9050919050565b600060608201905061399d6000830186612dd2565b6139aa6020830185612dd2565b6139b76040830184612dd2565b949350505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613a217fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826139e4565b613a2b86836139e4565b95508019841693508086168417925050509392505050565b6000613a5e613a59613a5484612ca7565b6130a6565b612ca7565b9050919050565b6000819050919050565b613a7883613a43565b613a8c613a8482613a65565b8484546139f1565b825550505050565b600090565b613aa1613a94565b613aac818484613a6f565b505050565b5b81811015613ad057613ac5600082613a99565b600181019050613ab2565b5050565b601f821115613b1557613ae6816139bf565b613aef846139d4565b81016020851015613afe578190505b613b12613b0a856139d4565b830182613ab1565b50505b505050565b600082821c905092915050565b6000613b3860001984600802613b1a565b1980831691505092915050565b6000613b518383613b27565b9150826002028217905092915050565b613b6a82612bf5565b67ffffffffffffffff811115613b8357613b82612e99565b5b613b8d82546132b3565b613b98828285613ad4565b600060209050601f831160018114613bcb5760008415613bb9578287015190505b613bc38582613b45565b865550613c2b565b601f198416613bd9866139bf565b60005b82811015613c0157848901518255600182019150602085019450602081019050613bdc565b86831015613c1e5784890151613c1a601f891682613b27565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613c69601883612c00565b9150613c7482613c33565b602082019050919050565b60006020820190508181036000830152613c9881613c5c565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613cfb602983612c00565b9150613d0682613c9f565b604082019050919050565b60006020820190508181036000830152613d2a81613cee565b9050919050565b7f496e76616c696420616464726573730000000000000000000000000000000000600082015250565b6000613d67600f83612c00565b9150613d7282613d31565b602082019050919050565b60006020820190508181036000830152613d9681613d5a565b9050919050565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b6000613dd3601483612c00565b9150613dde82613d9d565b602082019050919050565b60006020820190508181036000830152613e0281613dc6565b9050919050565b600081905092915050565b60008154613e21816132b3565b613e2b8186613e09565b94506001821660008114613e465760018114613e5b57613e8e565b60ff1983168652811515820286019350613e8e565b613e64856139bf565b60005b83811015613e8657815481890152600182019150602081019050613e67565b838801955050505b50505092915050565b7f2f6c6576656c5f00000000000000000000000000000000000000000000000000600082015250565b6000613ecd600783613e09565b9150613ed882613e97565b600782019050919050565b6000613eee82612bf5565b613ef88185613e09565b9350613f08818560208601612c11565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613f4a600583613e09565b9150613f5582613f14565b600582019050919050565b6000613f6c8285613e14565b9150613f7782613ec0565b9150613f838284613ee3565b9150613f8e82613f3d565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613ff6602683612c00565b915061400182613f9a565b604082019050919050565b6000602082019050818103600083015261402581613fe9565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614088602583612c00565b91506140938261402c565b604082019050919050565b600060208201905081810360008301526140b78161407b565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061411a602483612c00565b9150614125826140be565b604082019050919050565b600060208201905081810360008301526141498161410d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614186602083612c00565b915061419182614150565b602082019050919050565b600060208201905081810360008301526141b581614179565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006141f2601083612c00565b91506141fd826141bc565b602082019050919050565b60006020820190508181036000830152614221816141e5565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061425e601983612c00565b915061426982614228565b602082019050919050565b6000602082019050818103600083015261428d81614251565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006142f0603283612c00565b91506142fb82614294565b604082019050919050565b6000602082019050818103600083015261431f816142e3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b60006143b1603583612c00565b91506143bc82614355565b604082019050919050565b600060208201905081810360008301526143e0816143a4565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b600061441d601483612c00565b9150614428826143e7565b602082019050919050565b6000602082019050818103600083015261444c81614410565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061447a82614453565b614484818561445e565b9350614494818560208601612c11565b61449d81612c3b565b840191505092915050565b60006080820190506144bd6000830187612d3c565b6144ca6020830186612d3c565b6144d76040830185612dd2565b81810360608301526144e9818461446f565b905095945050505050565b60008151905061450381612b66565b92915050565b60006020828403121561451f5761451e612b30565b5b600061452d848285016144f4565b91505092915050565b600061454182612ca7565b915061454c83612ca7565b925082820390508181111561456457614563613506565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006145cf602083612c00565b91506145da82614599565b602082019050919050565b600060208201905081810360008301526145fe816145c2565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061463b601c83612c00565b915061464682614605565b602082019050919050565b6000602082019050818103600083015261466a8161462e565b905091905056fea2646970667358221220f5c95be94ce41cb0a8dae858e91466f1d7a18b03831a8aa0895823ee81f167e564736f6c63430008130033000000000000000000000000eeed99218ad74b2e7b7ed988ddf203964e3ac84500000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000043697066733a2f2f626166796265696471786173786778756e6a376b6b6a363569636e74777662787374736e726c726c3436676b757561616e33776f73626433376a692f0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101e55760003560e01c80636352211e1161010f578063a22cb465116100a2578063c87b56dd11610071578063c87b56dd14610540578063cc06c35914610570578063e985e9c51461058e578063f2fde38b146105be576101e5565b8063a22cb465146104ba578063a7b443bb146104d6578063b2596a67146104f4578063b88d4fde14610524576101e5565b8063817731bb116100de578063817731bb146104585780638456cb59146104745780638da5cb5b1461047e57806395d89b411461049c576101e5565b80636352211e146103d25780636a6278421461040257806370a082311461041e578063715018a61461044e576101e5565b80632f745c59116101875780634f6ccce7116101565780634f6ccce71461034c5780635226dc931461037c57806355f804b3146103985780635c975abb146103b4576101e5565b80632f745c59146102da578063344f1ba51461030a5780633f4ba83a1461032657806342842e0e14610330576101e5565b8063095ea7b3116101c3578063095ea7b31461026857806318160ddd1461028457806323b872dd146102a2578063248b71fc146102be576101e5565b806301ffc9a7146101ea57806306fdde031461021a578063081812fc14610238575b600080fd5b61020460048036038101906101ff9190612b92565b6105da565b6040516102119190612bda565b60405180910390f35b610222610654565b60405161022f9190612c85565b60405180910390f35b610252600480360381019061024d9190612cdd565b6106e6565b60405161025f9190612d4b565b60405180910390f35b610282600480360381019061027d9190612d92565b61072c565b005b61028c610843565b6040516102999190612de1565b60405180910390f35b6102bc60048036038101906102b79190612dfc565b610850565b005b6102d860048036038101906102d39190612d92565b6108b0565b005b6102f460048036038101906102ef9190612d92565b6109c6565b6040516103019190612de1565b60405180910390f35b610324600480360381019061031f9190612cdd565b610a6b565b005b61032e610af8565b005b61034a60048036038101906103459190612dfc565b610b0a565b005b61036660048036038101906103619190612cdd565b610b2a565b6040516103739190612de1565b60405180910390f35b61039660048036038101906103919190612e4f565b610b9b565b005b6103b260048036038101906103ad9190612fc4565b610f44565b005b6103bc610f5f565b6040516103c99190612bda565b60405180910390f35b6103ec60048036038101906103e79190612cdd565b610f76565b6040516103f99190612d4b565b60405180910390f35b61041c6004803603810190610417919061300d565b610ffc565b005b6104386004803603810190610433919061300d565b611099565b6040516104459190612de1565b60405180910390f35b610456611150565b005b610472600480360381019061046d919061300d565b611164565b005b61047c611256565b005b610486611268565b6040516104939190612d4b565b60405180910390f35b6104a4611292565b6040516104b19190612c85565b60405180910390f35b6104d460048036038101906104cf9190613066565b611324565b005b6104de61133a565b6040516104eb9190613105565b60405180910390f35b61050e60048036038101906105099190612cdd565b611360565b60405161051b9190612de1565b60405180910390f35b61053e600480360381019061053991906131c1565b611378565b005b61055a60048036038101906105559190612cdd565b6113da565b6040516105679190612c85565b60405180910390f35b61057861146f565b6040516105859190612de1565b60405180910390f35b6105a860048036038101906105a39190613244565b611475565b6040516105b59190612bda565b60405180910390f35b6105d860048036038101906105d3919061300d565b611509565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061064d575061064c8261158c565b5b9050919050565b606060008054610663906132b3565b80601f016020809104026020016040519081016040528092919081815260200182805461068f906132b3565b80156106dc5780601f106106b1576101008083540402835291602001916106dc565b820191906000526020600020905b8154815290600101906020018083116106bf57829003601f168201915b5050505050905090565b60006106f18261166e565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061073782610f76565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079e90613356565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107c66116b9565b73ffffffffffffffffffffffffffffffffffffffff1614806107f557506107f4816107ef6116b9565b611475565b5b610834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082b906133e8565b60405180910390fd5b61083e83836116c1565b505050565b6000600880549050905090565b61086161085b6116b9565b8261177a565b6108a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108979061347a565b60405180910390fd5b6108ab83838361180f565b505050565b6108b8611b08565b6108c0611b86565b60008111610903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fa906134e6565b60405180910390fd5b6000600161090f610843565b6109199190613535565b905060005b828110156109725761093b8482846109369190613535565b611bd0565b6001600c6000838561094d9190613535565b815260200190815260200160002081905550808061096a90613569565b91505061091e565b508273ffffffffffffffffffffffffffffffffffffffff167ff2d22a802fa8508cb755e309620b4a3dfeac486dd4c53fd49c316855fc451f22836040516109b99190612de1565b60405180910390a2505050565b60006109d183611099565b8210610a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0990613623565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a73611b08565b6001811015610ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aae9061368f565b60405180910390fd5b80600b819055507f208d11d52773c1d4fd0ee1d58ba297710cbb04e75e4ec24b4898f3745cce9bb381604051610aed9190612de1565b60405180910390a150565b610b00611b08565b610b08611bee565b565b610b2583838360405180602001604052806000815250611378565b505050565b6000610b34610843565b8210610b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6c90613721565b60405180910390fd5b60088281548110610b8957610b88613741565b5b90600052602060002001549050919050565b610ba3611b86565b3373ffffffffffffffffffffffffffffffffffffffff16610bc383610f76565b73ffffffffffffffffffffffffffffffffffffffff1614610c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c10906137bc565b60405180910390fd5b600b54600c60008481526020019081526020016000205410610c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6790613828565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf890613894565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610d739190612de1565b602060405180830381865afa158015610d90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db491906138c9565b73ffffffffffffffffffffffffffffffffffffffff1614610e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0190613968565b60405180910390fd5b6000600c6000848152602001908152602001600020549050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68836040518263ffffffff1660e01b8152600401610e7d9190612de1565b600060405180830381600087803b158015610e9757600080fd5b505af1158015610eab573d6000803e3d6000fd5b505050506001600c60008581526020019081526020016000206000828254610ed39190613535565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f0ee22ce17ae6ff55501ec7491afa3f5397a17ee7cd88fe56c39569e2c13bd9188483600c600088815260200190815260200160002054604051610f3793929190613988565b60405180910390a2505050565b610f4c611b08565b80600e9081610f5b9190613b61565b5050565b6000600a60149054906101000a900460ff16905090565b600080610f8283611c51565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fea90613c7f565b60405180910390fd5b80915050919050565b611004611b08565b61100c611b86565b60006001611018610843565b6110229190613535565b905061102e8282611bd0565b6001600c6000838152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161108d9190612de1565b60405180910390a25050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611109576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110090613d11565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611158611b08565b6111626000611c8e565b565b61116c611b08565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d290613d7d565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f7c419c072016df3f812503da3d5f59c6d6058a69f9c01d9e6c7d187eb8b5c8f68160405161124b9190612d4b565b60405180910390a150565b61125e611b08565b611266611d54565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112a1906132b3565b80601f01602080910402602001604051908101604052809291908181526020018280546112cd906132b3565b801561131a5780601f106112ef5761010080835404028352916020019161131a565b820191906000526020600020905b8154815290600101906020018083116112fd57829003601f168201915b5050505050905090565b61133661132f6116b9565b8383611db7565b5050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c6020528060005260406000206000915090505481565b6113896113836116b9565b8361177a565b6113c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bf9061347a565b60405180910390fd5b6113d484848484611f23565b50505050565b60606113e582611f7f565b611424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141b90613de9565b60405180910390fd5b6000600c6000848152602001908152602001600020549050600e61144782611fc0565b604051602001611458929190613f60565b604051602081830303815290604052915050919050565b600b5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611511611b08565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611580576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115779061400c565b60405180910390fd5b61158981611c8e565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061165757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061166757506116668261208e565b5b9050919050565b61167781611f7f565b6116b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ad90613c7f565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661173483610f76565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061178683610f76565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806117c857506117c78185611475565b5b8061180657508373ffffffffffffffffffffffffffffffffffffffff166117ee846106e6565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661182f82610f76565b73ffffffffffffffffffffffffffffffffffffffff1614611885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187c9061409e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118eb90614130565b60405180910390fd5b61190183838360016120f8565b8273ffffffffffffffffffffffffffffffffffffffff1661192182610f76565b73ffffffffffffffffffffffffffffffffffffffff1614611977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196e9061409e565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b038383836001612256565b505050565b611b106116b9565b73ffffffffffffffffffffffffffffffffffffffff16611b2e611268565b73ffffffffffffffffffffffffffffffffffffffff1614611b84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7b9061419c565b60405180910390fd5b565b611b8e610f5f565b15611bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc590614208565b60405180910390fd5b565b611bea82826040518060200160405280600081525061225c565b5050565b611bf66122b7565b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611c3a6116b9565b604051611c479190612d4b565b60405180910390a1565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611d5c611b86565b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611da06116b9565b604051611dad9190612d4b565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614274565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f169190612bda565b60405180910390a3505050565b611f2e84848461180f565b611f3a84848484612300565b611f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7090614306565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16611fa183611c51565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b606060006001611fcf84612487565b01905060008167ffffffffffffffff811115611fee57611fed612e99565b5b6040519080825280601f01601f1916602001820160405280156120205781602001600182028036833780820191505090505b509050600082602001820190505b600115612083578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161207757612076614326565b5b0494506000850361202e575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612104848484846125da565b6001811115612148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213f906143c7565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361218f5761218a816125e0565b6121ce565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146121cd576121cc8582612629565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036122105761220b81612796565b61224f565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461224e5761224d8482612867565b5b5b5050505050565b50505050565b61226683836128e6565b6122736000848484612300565b6122b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a990614306565b60405180910390fd5b505050565b6122bf610f5f565b6122fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f590614433565b60405180910390fd5b565b60006123218473ffffffffffffffffffffffffffffffffffffffff16612b03565b1561247a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261234a6116b9565b8786866040518563ffffffff1660e01b815260040161236c94939291906144a8565b6020604051808303816000875af19250505080156123a857506040513d601f19601f820116820180604052508101906123a59190614509565b60015b61242a573d80600081146123d8576040519150601f19603f3d011682016040523d82523d6000602084013e6123dd565b606091505b506000815103612422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241990614306565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061247f565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106124e5577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816124db576124da614326565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612522576d04ee2d6d415b85acef8100000000838161251857612517614326565b5b0492506020810190505b662386f26fc10000831061255157662386f26fc10000838161254757612546614326565b5b0492506010810190505b6305f5e100831061257a576305f5e10083816125705761256f614326565b5b0492506008810190505b612710831061259f57612710838161259557612594614326565b5b0492506004810190505b606483106125c257606483816125b8576125b7614326565b5b0492506002810190505b600a83106125d1576001810190505b80915050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161263684611099565b6126409190614536565b9050600060076000848152602001908152602001600020549050818114612725576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127aa9190614536565b90506000600960008481526020019081526020016000205490506000600883815481106127da576127d9613741565b5b9060005260206000200154905080600883815481106127fc576127fb613741565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061284b5761284a61456a565b5b6001900381819060005260206000200160009055905550505050565b600061287283611099565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294c906145e5565b60405180910390fd5b61295e81611f7f565b1561299e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299590614651565b60405180910390fd5b6129ac6000838360016120f8565b6129b581611f7f565b156129f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ec90614651565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612aff600083836001612256565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b6f81612b3a565b8114612b7a57600080fd5b50565b600081359050612b8c81612b66565b92915050565b600060208284031215612ba857612ba7612b30565b5b6000612bb684828501612b7d565b91505092915050565b60008115159050919050565b612bd481612bbf565b82525050565b6000602082019050612bef6000830184612bcb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c2f578082015181840152602081019050612c14565b60008484015250505050565b6000601f19601f8301169050919050565b6000612c5782612bf5565b612c618185612c00565b9350612c71818560208601612c11565b612c7a81612c3b565b840191505092915050565b60006020820190508181036000830152612c9f8184612c4c565b905092915050565b6000819050919050565b612cba81612ca7565b8114612cc557600080fd5b50565b600081359050612cd781612cb1565b92915050565b600060208284031215612cf357612cf2612b30565b5b6000612d0184828501612cc8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d3582612d0a565b9050919050565b612d4581612d2a565b82525050565b6000602082019050612d606000830184612d3c565b92915050565b612d6f81612d2a565b8114612d7a57600080fd5b50565b600081359050612d8c81612d66565b92915050565b60008060408385031215612da957612da8612b30565b5b6000612db785828601612d7d565b9250506020612dc885828601612cc8565b9150509250929050565b612ddb81612ca7565b82525050565b6000602082019050612df66000830184612dd2565b92915050565b600080600060608486031215612e1557612e14612b30565b5b6000612e2386828701612d7d565b9350506020612e3486828701612d7d565b9250506040612e4586828701612cc8565b9150509250925092565b60008060408385031215612e6657612e65612b30565b5b6000612e7485828601612cc8565b9250506020612e8585828601612cc8565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ed182612c3b565b810181811067ffffffffffffffff82111715612ef057612eef612e99565b5b80604052505050565b6000612f03612b26565b9050612f0f8282612ec8565b919050565b600067ffffffffffffffff821115612f2f57612f2e612e99565b5b612f3882612c3b565b9050602081019050919050565b82818337600083830152505050565b6000612f67612f6284612f14565b612ef9565b905082815260208101848484011115612f8357612f82612e94565b5b612f8e848285612f45565b509392505050565b600082601f830112612fab57612faa612e8f565b5b8135612fbb848260208601612f54565b91505092915050565b600060208284031215612fda57612fd9612b30565b5b600082013567ffffffffffffffff811115612ff857612ff7612b35565b5b61300484828501612f96565b91505092915050565b60006020828403121561302357613022612b30565b5b600061303184828501612d7d565b91505092915050565b61304381612bbf565b811461304e57600080fd5b50565b6000813590506130608161303a565b92915050565b6000806040838503121561307d5761307c612b30565b5b600061308b85828601612d7d565b925050602061309c85828601613051565b9150509250929050565b6000819050919050565b60006130cb6130c66130c184612d0a565b6130a6565b612d0a565b9050919050565b60006130dd826130b0565b9050919050565b60006130ef826130d2565b9050919050565b6130ff816130e4565b82525050565b600060208201905061311a60008301846130f6565b92915050565b600067ffffffffffffffff82111561313b5761313a612e99565b5b61314482612c3b565b9050602081019050919050565b600061316461315f84613120565b612ef9565b9050828152602081018484840111156131805761317f612e94565b5b61318b848285612f45565b509392505050565b600082601f8301126131a8576131a7612e8f565b5b81356131b8848260208601613151565b91505092915050565b600080600080608085870312156131db576131da612b30565b5b60006131e987828801612d7d565b94505060206131fa87828801612d7d565b935050604061320b87828801612cc8565b925050606085013567ffffffffffffffff81111561322c5761322b612b35565b5b61323887828801613193565b91505092959194509250565b6000806040838503121561325b5761325a612b30565b5b600061326985828601612d7d565b925050602061327a85828601612d7d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806132cb57607f821691505b6020821081036132de576132dd613284565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613340602183612c00565b915061334b826132e4565b604082019050919050565b6000602082019050818103600083015261336f81613333565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006133d2603d83612c00565b91506133dd82613376565b604082019050919050565b60006020820190508181036000830152613401816133c5565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613464602d83612c00565b915061346f82613408565b604082019050919050565b6000602082019050818103600083015261349381613457565b9050919050565b7f416d6f756e74206d7573742062652067726561746572207468616e2030000000600082015250565b60006134d0601d83612c00565b91506134db8261349a565b602082019050919050565b600060208201905081810360008301526134ff816134c3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061354082612ca7565b915061354b83612ca7565b925082820190508082111561356357613562613506565b5b92915050565b600061357482612ca7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036135a6576135a5613506565b5b600182019050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061360d602b83612c00565b9150613618826135b1565b604082019050919050565b6000602082019050818103600083015261363c81613600565b9050919050565b7f4d6178206c6576656c206d757374206265206174206c65617374203100000000600082015250565b6000613679601c83612c00565b915061368482613643565b602082019050919050565b600060208201905081810360008301526136a88161366c565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061370b602c83612c00565b9150613716826136af565b604082019050919050565b6000602082019050818103600083015261373a816136fe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f596f7520646f206e6f74206f776e207468697320466c6f7765724e4654000000600082015250565b60006137a6601d83612c00565b91506137b182613770565b602082019050919050565b600060208201905081810360008301526137d581613799565b9050919050565b7f416c7265616479206174206d6178206c6576656c000000000000000000000000600082015250565b6000613812601483612c00565b915061381d826137dc565b602082019050919050565b6000602082019050818103600083015261384181613805565b9050919050565b7f466c6f776572506f77657220636f6e7472616374206e6f742073657400000000600082015250565b600061387e601c83612c00565b915061388982613848565b602082019050919050565b600060208201905081810360008301526138ad81613871565b9050919050565b6000815190506138c381612d66565b92915050565b6000602082840312156138df576138de612b30565b5b60006138ed848285016138b4565b91505092915050565b7f596f7520646f206e6f74206f776e207468697320466c6f776572506f7765722060008201527f4e46540000000000000000000000000000000000000000000000000000000000602082015250565b6000613952602383612c00565b915061395d826138f6565b604082019050919050565b6000602082019050818103600083015261398181613945565b9050919050565b600060608201905061399d6000830186612dd2565b6139aa6020830185612dd2565b6139b76040830184612dd2565b949350505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613a217fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826139e4565b613a2b86836139e4565b95508019841693508086168417925050509392505050565b6000613a5e613a59613a5484612ca7565b6130a6565b612ca7565b9050919050565b6000819050919050565b613a7883613a43565b613a8c613a8482613a65565b8484546139f1565b825550505050565b600090565b613aa1613a94565b613aac818484613a6f565b505050565b5b81811015613ad057613ac5600082613a99565b600181019050613ab2565b5050565b601f821115613b1557613ae6816139bf565b613aef846139d4565b81016020851015613afe578190505b613b12613b0a856139d4565b830182613ab1565b50505b505050565b600082821c905092915050565b6000613b3860001984600802613b1a565b1980831691505092915050565b6000613b518383613b27565b9150826002028217905092915050565b613b6a82612bf5565b67ffffffffffffffff811115613b8357613b82612e99565b5b613b8d82546132b3565b613b98828285613ad4565b600060209050601f831160018114613bcb5760008415613bb9578287015190505b613bc38582613b45565b865550613c2b565b601f198416613bd9866139bf565b60005b82811015613c0157848901518255600182019150602085019450602081019050613bdc565b86831015613c1e5784890151613c1a601f891682613b27565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613c69601883612c00565b9150613c7482613c33565b602082019050919050565b60006020820190508181036000830152613c9881613c5c565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613cfb602983612c00565b9150613d0682613c9f565b604082019050919050565b60006020820190508181036000830152613d2a81613cee565b9050919050565b7f496e76616c696420616464726573730000000000000000000000000000000000600082015250565b6000613d67600f83612c00565b9150613d7282613d31565b602082019050919050565b60006020820190508181036000830152613d9681613d5a565b9050919050565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b6000613dd3601483612c00565b9150613dde82613d9d565b602082019050919050565b60006020820190508181036000830152613e0281613dc6565b9050919050565b600081905092915050565b60008154613e21816132b3565b613e2b8186613e09565b94506001821660008114613e465760018114613e5b57613e8e565b60ff1983168652811515820286019350613e8e565b613e64856139bf565b60005b83811015613e8657815481890152600182019150602081019050613e67565b838801955050505b50505092915050565b7f2f6c6576656c5f00000000000000000000000000000000000000000000000000600082015250565b6000613ecd600783613e09565b9150613ed882613e97565b600782019050919050565b6000613eee82612bf5565b613ef88185613e09565b9350613f08818560208601612c11565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613f4a600583613e09565b9150613f5582613f14565b600582019050919050565b6000613f6c8285613e14565b9150613f7782613ec0565b9150613f838284613ee3565b9150613f8e82613f3d565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613ff6602683612c00565b915061400182613f9a565b604082019050919050565b6000602082019050818103600083015261402581613fe9565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614088602583612c00565b91506140938261402c565b604082019050919050565b600060208201905081810360008301526140b78161407b565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061411a602483612c00565b9150614125826140be565b604082019050919050565b600060208201905081810360008301526141498161410d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614186602083612c00565b915061419182614150565b602082019050919050565b600060208201905081810360008301526141b581614179565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006141f2601083612c00565b91506141fd826141bc565b602082019050919050565b60006020820190508181036000830152614221816141e5565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061425e601983612c00565b915061426982614228565b602082019050919050565b6000602082019050818103600083015261428d81614251565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006142f0603283612c00565b91506142fb82614294565b604082019050919050565b6000602082019050818103600083015261431f816142e3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b60006143b1603583612c00565b91506143bc82614355565b604082019050919050565b600060208201905081810360008301526143e0816143a4565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b600061441d601483612c00565b9150614428826143e7565b602082019050919050565b6000602082019050818103600083015261444c81614410565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061447a82614453565b614484818561445e565b9350614494818560208601612c11565b61449d81612c3b565b840191505092915050565b60006080820190506144bd6000830187612d3c565b6144ca6020830186612d3c565b6144d76040830185612dd2565b81810360608301526144e9818461446f565b905095945050505050565b60008151905061450381612b66565b92915050565b60006020828403121561451f5761451e612b30565b5b600061452d848285016144f4565b91505092915050565b600061454182612ca7565b915061454c83612ca7565b925082820390508181111561456457614563613506565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006145cf602083612c00565b91506145da82614599565b602082019050919050565b600060208201905081810360008301526145fe816145c2565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061463b601c83612c00565b915061464682614605565b602082019050919050565b6000602082019050818103600083015261466a8161462e565b905091905056fea2646970667358221220f5c95be94ce41cb0a8dae858e91466f1d7a18b03831a8aa0895823ee81f167e564736f6c63430008130033

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

000000000000000000000000eeed99218ad74b2e7b7ed988ddf203964e3ac84500000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000043697066733a2f2f626166796265696471786173786778756e6a376b6b6a363569636e74777662787374736e726c726c3436676b757561616e33776f73626433376a692f0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : POWERAddress (address): 0xeeED99218ad74b2e7b7Ed988ddF203964e3ac845
Arg [1] : baseURI_ (string): ipfs://bafybeidqxasxgxunj7kkj65icntwvbxstsnrlrl46gkuuaan3wosbd37ji/

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000eeed99218ad74b2e7b7ed988ddf203964e3ac845
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [3] : 697066733a2f2f626166796265696471786173786778756e6a376b6b6a363569
Arg [4] : 636e74777662787374736e726c726c3436676b757561616e33776f7362643337
Arg [5] : 6a692f0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

67637:3362:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56132:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39089:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40601:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40119:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56772:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41301:301;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69243:376;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56440:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68804:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70929:67;;;:::i;:::-;;41673:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56962:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69627:702;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70337:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66445:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38799:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69026:209;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38530:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63949:103;;;:::i;:::-;;68544:252;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70858:63;;;:::i;:::-;;63308:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39258:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40844:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67857:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67807:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41895:279;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70557:293;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67736:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41070:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64207:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56132:224;56234:4;56273:35;56258:50;;;:11;:50;;;;:90;;;;56312:36;56336:11;56312:23;:36::i;:::-;56258:90;56251:97;;56132:224;;;:::o;39089:100::-;39143:13;39176:5;39169:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39089:100;:::o;40601:171::-;40677:7;40697:23;40712:7;40697:14;:23::i;:::-;40740:15;:24;40756:7;40740:24;;;;;;;;;;;;;;;;;;;;;40733:31;;40601:171;;;:::o;40119:416::-;40200:13;40216:23;40231:7;40216:14;:23::i;:::-;40200:39;;40264:5;40258:11;;:2;:11;;;40250:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;40358:5;40342:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;40367:37;40384:5;40391:12;:10;:12::i;:::-;40367:16;:37::i;:::-;40342:62;40320:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;40506:21;40515:2;40519:7;40506:8;:21::i;:::-;40189:346;40119:416;;:::o;56772:113::-;56833:7;56860:10;:17;;;;56853:24;;56772:113;:::o;41301:301::-;41462:41;41481:12;:10;:12::i;:::-;41495:7;41462:18;:41::i;:::-;41454:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;41566:28;41576:4;41582:2;41586:7;41566:9;:28::i;:::-;41301:301;;;:::o;69243:376::-;63194:13;:11;:13::i;:::-;66050:19:::1;:17;:19::i;:::-;69351:1:::2;69342:6;:10;69334:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;69399:15;69433:1;69417:13;:11;:13::i;:::-;:17;;;;:::i;:::-;69399:35;;69450:9;69445:128;69469:6;69465:1;:10;69445:128;;;69497:26;69507:2;69521:1;69511:7;:11;;;;:::i;:::-;69497:9;:26::i;:::-;69560:1;69538:6;:19;69555:1;69545:7;:11;;;;:::i;:::-;69538:19;;;;;;;;;;;:23;;;;69477:3;;;;;:::i;:::-;;;;69445:128;;;;69600:2;69590:21;;;69604:6;69590:21;;;;;;:::i;:::-;;;;;;;;69323:296;69243:376:::0;;:::o;56440:256::-;56537:7;56573:23;56590:5;56573:16;:23::i;:::-;56565:5;:31;56557:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;56662:12;:19;56675:5;56662:19;;;;;;;;;;;;;;;:26;56682:5;56662:26;;;;;;;;;;;;56655:33;;56440:256;;;;:::o;68804:214::-;63194:13;:11;:13::i;:::-;68899:1:::1;68884:11;:16;;68876:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;68955:11;68944:8;:22;;;;68982:28;68998:11;68982:28;;;;;;:::i;:::-;;;;;;;;68804:214:::0;:::o;70929:67::-;63194:13;:11;:13::i;:::-;70978:10:::1;:8;:10::i;:::-;70929:67::o:0;41673:151::-;41777:39;41794:4;41800:2;41804:7;41777:39;;;;;;;;;;;;:16;:39::i;:::-;41673:151;;;:::o;56962:233::-;57037:7;57073:30;:28;:30::i;:::-;57065:5;:38;57057:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;57170:10;57181:5;57170:17;;;;;;;;:::i;:::-;;;;;;;;;;57163:24;;56962:233;;;:::o;69627:702::-;66050:19;:17;:19::i;:::-;69757:10:::1;69731:36;;:22;69739:13;69731:7;:22::i;:::-;:36;;;69723:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;69844:8;;69820:6;:21;69827:13;69820:21;;;;;;;;;;;;:32;69812:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;69936:1;69896:42;;69904:19;;;;;;;;;;;69896:42;;::::0;69888:83:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;70035:10;69990:55;;:19;;;;;;;;;;;:27;;;70018:12;69990:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;;69982:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;70098:21;70122:6;:21;70129:13;70122:21;;;;;;;;;;;;70098:45;;70156:19;;;;;;;;;;;:24;;;70181:12;70156:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;70230:1;70205:6;:21;70212:13;70205:21;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;70257:10;70249:72;;;70269:13;70284;70299:6;:21;70306:13;70299:21;;;;;;;;;;;;70249:72;;;;;;;;:::i;:::-;;;;;;;;69712:617;69627:702:::0;;:::o;70337:104::-;63194:13;:11;:13::i;:::-;70423:10:::1;70413:7;:20;;;;;;:::i;:::-;;70337:104:::0;:::o;66445:86::-;66492:4;66516:7;;;;;;;;;;;66509:14;;66445:86;:::o;38799:223::-;38871:7;38891:13;38907:17;38916:7;38907:8;:17::i;:::-;38891:33;;38960:1;38943:19;;:5;:19;;;38935:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;39009:5;39002:12;;;38799:223;;;:::o;69026:209::-;63194:13;:11;:13::i;:::-;66050:19:::1;:17;:19::i;:::-;69096:15:::2;69130:1;69114:13;:11;:13::i;:::-;:17;;;;:::i;:::-;69096:35;;69142:22;69152:2;69156:7;69142:9;:22::i;:::-;69193:1;69175:6;:15;69182:7;69175:15;;;;;;;;;;;:19;;;;69215:2;69210:17;;;69219:7;69210:17;;;;;;:::i;:::-;;;;;;;;69085:150;69026:209:::0;:::o;38530:207::-;38602:7;38647:1;38630:19;;:5;:19;;;38622:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38713:9;:16;38723:5;38713:16;;;;;;;;;;;;;;;;38706:23;;38530:207;;;:::o;63949:103::-;63194:13;:11;:13::i;:::-;64014:30:::1;64041:1;64014:18;:30::i;:::-;63949:103::o:0;68544:252::-;63194:13;:11;:13::i;:::-;68655:1:::1;68633:24;;:10;:24;;::::0;68625:52:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;68723:10;68688:19;;:46;;;;;;;;;;;;;;;;;;68750:38;68777:10;68750:38;;;;;;:::i;:::-;;;;;;;;68544:252:::0;:::o;70858:63::-;63194:13;:11;:13::i;:::-;70905:8:::1;:6;:8::i;:::-;70858:63::o:0;63308:87::-;63354:7;63381:6;;;;;;;;;;;63374:13;;63308:87;:::o;39258:104::-;39314:13;39347:7;39340:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39258:104;:::o;40844:155::-;40939:52;40958:12;:10;:12::i;:::-;40972:8;40982;40939:18;:52::i;:::-;40844:155;;:::o;67857:39::-;;;;;;;;;;;;;:::o;67807:41::-;;;;;;;;;;;;;;;;;:::o;41895:279::-;42026:41;42045:12;:10;:12::i;:::-;42059:7;42026:18;:41::i;:::-;42018:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;42128:38;42142:4;42148:2;42152:7;42161:4;42128:13;:38::i;:::-;41895:279;;;;:::o;70557:293::-;70622:13;70656:16;70664:7;70656;:16::i;:::-;70648:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;70708:20;70731:6;:15;70738:7;70731:15;;;;;;;;;;;;70708:38;;70788:7;70808:23;:12;:21;:23::i;:::-;70771:70;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70757:85;;;70557:293;;;:::o;67736:28::-;;;;:::o;41070:164::-;41167:4;41191:18;:25;41210:5;41191:25;;;;;;;;;;;;;;;:35;41217:8;41191:35;;;;;;;;;;;;;;;;;;;;;;;;;41184:42;;41070:164;;;;:::o;64207:201::-;63194:13;:11;:13::i;:::-;64316:1:::1;64296:22;;:8;:22;;::::0;64288:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;64372:28;64391:8;64372:18;:28::i;:::-;64207:201:::0;:::o;38161:305::-;38263:4;38315:25;38300:40;;;:11;:40;;;;:105;;;;38372:33;38357:48;;;:11;:48;;;;38300:105;:158;;;;38422:36;38446:11;38422:23;:36::i;:::-;38300:158;38280:178;;38161:305;;;:::o;50164:135::-;50246:16;50254:7;50246;:16::i;:::-;50238:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;50164:135;:::o;18159:98::-;18212:7;18239:10;18232:17;;18159:98;:::o;49477:174::-;49579:2;49552:15;:24;49568:7;49552:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;49635:7;49631:2;49597:46;;49606:23;49621:7;49606:14;:23::i;:::-;49597:46;;;;;;;;;;;;49477:174;;:::o;44164:264::-;44257:4;44274:13;44290:23;44305:7;44290:14;:23::i;:::-;44274:39;;44343:5;44332:16;;:7;:16;;;:52;;;;44352:32;44369:5;44376:7;44352:16;:32::i;:::-;44332:52;:87;;;;44412:7;44388:31;;:20;44400:7;44388:11;:20::i;:::-;:31;;;44332:87;44324:96;;;44164:264;;;;:::o;48129:1229::-;48254:4;48227:31;;:23;48242:7;48227:14;:23::i;:::-;:31;;;48219:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;48333:1;48319:16;;:2;:16;;;48311:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;48389:42;48410:4;48416:2;48420:7;48429:1;48389:20;:42::i;:::-;48561:4;48534:31;;:23;48549:7;48534:14;:23::i;:::-;:31;;;48526:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;48679:15;:24;48695:7;48679:24;;;;;;;;;;;;48672:31;;;;;;;;;;;49174:1;49155:9;:15;49165:4;49155:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;49207:1;49190:9;:13;49200:2;49190:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;49249:2;49230:7;:16;49238:7;49230:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;49288:7;49284:2;49269:27;;49278:4;49269:27;;;;;;;;;;;;49309:41;49329:4;49335:2;49339:7;49348:1;49309:19;:41::i;:::-;48129:1229;;;:::o;63473:132::-;63548:12;:10;:12::i;:::-;63537:23;;:7;:5;:7::i;:::-;:23;;;63529:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63473:132::o;66604:108::-;66675:8;:6;:8::i;:::-;66674:9;66666:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;66604:108::o;44770:110::-;44846:26;44856:2;44860:7;44846:26;;;;;;;;;;;;:9;:26::i;:::-;44770:110;;:::o;67300:120::-;66309:16;:14;:16::i;:::-;67369:5:::1;67359:7;;:15;;;;;;;;;;;;;;;;;;67390:22;67399:12;:10;:12::i;:::-;67390:22;;;;;;:::i;:::-;;;;;;;;67300:120::o:0;43439:117::-;43505:7;43532;:16;43540:7;43532:16;;;;;;;;;;;;;;;;;;;;;43525:23;;43439:117;;;:::o;64568:191::-;64642:16;64661:6;;;;;;;;;;;64642:25;;64687:8;64678:6;;:17;;;;;;;;;;;;;;;;;;64742:8;64711:40;;64732:8;64711:40;;;;;;;;;;;;64631:128;64568:191;:::o;67041:118::-;66050:19;:17;:19::i;:::-;67111:4:::1;67101:7;;:14;;;;;;;;;;;;;;;;;;67131:20;67138:12;:10;:12::i;:::-;67131:20;;;;;;:::i;:::-;;;;;;;;67041:118::o:0;49794:281::-;49915:8;49906:17;;:5;:17;;;49898:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;50002:8;49964:18;:25;49983:5;49964:25;;;;;;;;;;;;;;;:35;49990:8;49964:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;50048:8;50026:41;;50041:5;50026:41;;;50058:8;50026:41;;;;;;:::i;:::-;;;;;;;;49794:281;;;:::o;43055:270::-;43168:28;43178:4;43184:2;43188:7;43168:9;:28::i;:::-;43215:47;43238:4;43244:2;43248:7;43257:4;43215:22;:47::i;:::-;43207:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;43055:270;;;;:::o;43869:128::-;43934:4;43987:1;43958:31;;:17;43967:7;43958:8;:17::i;:::-;:31;;;;43951:38;;43869:128;;;:::o;33311:716::-;33367:13;33418:14;33455:1;33435:17;33446:5;33435:10;:17::i;:::-;:21;33418:38;;33471:20;33505:6;33494:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33471:41;;33527:11;33656:6;33652:2;33648:15;33640:6;33636:28;33629:35;;33693:288;33700:4;33693:288;;;33725:5;;;;;;;;33867:8;33862:2;33855:5;33851:14;33846:30;33841:3;33833:44;33923:2;33914:11;;;;;;:::i;:::-;;;;;33957:1;33948:5;:10;33693:288;33944:21;33693:288;34002:6;33995:13;;;;;33311:716;;;:::o;36584:157::-;36669:4;36708:25;36693:40;;;:11;:40;;;;36686:47;;36584:157;;;:::o;57269:915::-;57446:61;57473:4;57479:2;57483:12;57497:9;57446:26;:61::i;:::-;57536:1;57524:9;:13;57520:222;;;57667:63;;;;;;;;;;:::i;:::-;;;;;;;;57520:222;57754:15;57772:12;57754:30;;57817:1;57801:18;;:4;:18;;;57797:187;;57836:40;57868:7;57836:31;:40::i;:::-;57797:187;;;57906:2;57898:10;;:4;:10;;;57894:90;;57925:47;57958:4;57964:7;57925:32;:47::i;:::-;57894:90;57797:187;58012:1;57998:16;;:2;:16;;;57994:183;;58031:45;58068:7;58031:36;:45::i;:::-;57994:183;;;58104:4;58098:10;;:2;:10;;;58094:83;;58125:40;58153:2;58157:7;58125:27;:40::i;:::-;58094:83;57994:183;57435:749;57269:915;;;;:::o;53286:115::-;;;;;:::o;45107:285::-;45202:18;45208:2;45212:7;45202:5;:18::i;:::-;45253:53;45284:1;45288:2;45292:7;45301:4;45253:22;:53::i;:::-;45231:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;45107:285;;;:::o;66789:108::-;66856:8;:6;:8::i;:::-;66848:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;66789:108::o;50863:853::-;51017:4;51038:15;:2;:13;;;:15::i;:::-;51034:675;;;51090:2;51074:36;;;51111:12;:10;:12::i;:::-;51125:4;51131:7;51140:4;51074:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51070:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51332:1;51315:6;:13;:18;51311:328;;51358:60;;;;;;;;;;:::i;:::-;;;;;;;;51311:328;51589:6;51583:13;51574:6;51570:2;51566:15;51559:38;51070:584;51206:41;;;51196:51;;;:6;:51;;;;51189:58;;;;;51034:675;51693:4;51686:11;;50863:853;;;;;;;:::o;28794:948::-;28847:7;28867:14;28884:1;28867:18;;28934:8;28925:5;:17;28921:106;;28972:8;28963:17;;;;;;:::i;:::-;;;;;29009:2;28999:12;;;;28921:106;29054:8;29045:5;:17;29041:106;;29092:8;29083:17;;;;;;:::i;:::-;;;;;29129:2;29119:12;;;;29041:106;29174:8;29165:5;:17;29161:106;;29212:8;29203:17;;;;;;:::i;:::-;;;;;29249:2;29239:12;;;;29161:106;29294:7;29285:5;:16;29281:103;;29331:7;29322:16;;;;;;:::i;:::-;;;;;29367:1;29357:11;;;;29281:103;29411:7;29402:5;:16;29398:103;;29448:7;29439:16;;;;;;:::i;:::-;;;;;29484:1;29474:11;;;;29398:103;29528:7;29519:5;:16;29515:103;;29565:7;29556:16;;;;;;:::i;:::-;;;;;29601:1;29591:11;;;;29515:103;29645:7;29636:5;:16;29632:68;;29683:1;29673:11;;;;29632:68;29728:6;29721:13;;;28794:948;;;:::o;52448:116::-;;;;;:::o;58907:164::-;59011:10;:17;;;;58984:15;:24;59000:7;58984:24;;;;;;;;;;;:44;;;;59039:10;59055:7;59039:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58907:164;:::o;59698:988::-;59964:22;60014:1;59989:22;60006:4;59989:16;:22::i;:::-;:26;;;;:::i;:::-;59964:51;;60026:18;60047:17;:26;60065:7;60047:26;;;;;;;;;;;;60026:47;;60194:14;60180:10;:28;60176:328;;60225:19;60247:12;:18;60260:4;60247:18;;;;;;;;;;;;;;;:34;60266:14;60247:34;;;;;;;;;;;;60225:56;;60331:11;60298:12;:18;60311:4;60298:18;;;;;;;;;;;;;;;:30;60317:10;60298:30;;;;;;;;;;;:44;;;;60448:10;60415:17;:30;60433:11;60415:30;;;;;;;;;;;:43;;;;60210:294;60176:328;60600:17;:26;60618:7;60600:26;;;;;;;;;;;60593:33;;;60644:12;:18;60657:4;60644:18;;;;;;;;;;;;;;;:34;60663:14;60644:34;;;;;;;;;;;60637:41;;;59779:907;;59698:988;;:::o;60981:1079::-;61234:22;61279:1;61259:10;:17;;;;:21;;;;:::i;:::-;61234:46;;61291:18;61312:15;:24;61328:7;61312:24;;;;;;;;;;;;61291:45;;61663:19;61685:10;61696:14;61685:26;;;;;;;;:::i;:::-;;;;;;;;;;61663:48;;61749:11;61724:10;61735;61724:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;61860:10;61829:15;:28;61845:11;61829:28;;;;;;;;;;;:41;;;;62001:15;:24;62017:7;62001:24;;;;;;;;;;;61994:31;;;62036:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;61052:1008;;;60981:1079;:::o;58485:221::-;58570:14;58587:20;58604:2;58587:16;:20::i;:::-;58570:37;;58645:7;58618:12;:16;58631:2;58618:16;;;;;;;;;;;;;;;:24;58635:6;58618:24;;;;;;;;;;;:34;;;;58692:6;58663:17;:26;58681:7;58663:26;;;;;;;;;;;:35;;;;58559:147;58485:221;;:::o;45728:942::-;45822:1;45808:16;;:2;:16;;;45800:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;45881:16;45889:7;45881;:16::i;:::-;45880:17;45872:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;45943:48;45972:1;45976:2;45980:7;45989:1;45943:20;:48::i;:::-;46090:16;46098:7;46090;:16::i;:::-;46089:17;46081:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;46505:1;46488:9;:13;46498:2;46488:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;46549:2;46530:7;:16;46538:7;46530:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;46594:7;46590:2;46569:33;;46586:1;46569:33;;;;;;;;;;;;46615:47;46643:1;46647:2;46651:7;46660:1;46615:19;:47::i;:::-;45728:942;;:::o;9315:326::-;9375:4;9632:1;9610:7;:19;;;:23;9603:30;;9315:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:474::-;5935:6;5943;5992:2;5980:9;5971:7;5967:23;5963:32;5960:119;;;5998:79;;:::i;:::-;5960:119;6118:1;6143:53;6188:7;6179:6;6168:9;6164:22;6143:53;:::i;:::-;6133:63;;6089:117;6245:2;6271:53;6316:7;6307:6;6296:9;6292:22;6271:53;:::i;:::-;6261:63;;6216:118;5867:474;;;;;:::o;6347:117::-;6456:1;6453;6446:12;6470:117;6579:1;6576;6569:12;6593:180;6641:77;6638:1;6631:88;6738:4;6735:1;6728:15;6762:4;6759:1;6752:15;6779:281;6862:27;6884:4;6862:27;:::i;:::-;6854:6;6850:40;6992:6;6980:10;6977:22;6956:18;6944:10;6941:34;6938:62;6935:88;;;7003:18;;:::i;:::-;6935:88;7043:10;7039:2;7032:22;6822:238;6779:281;;:::o;7066:129::-;7100:6;7127:20;;:::i;:::-;7117:30;;7156:33;7184:4;7176:6;7156:33;:::i;:::-;7066:129;;;:::o;7201:308::-;7263:4;7353:18;7345:6;7342:30;7339:56;;;7375:18;;:::i;:::-;7339:56;7413:29;7435:6;7413:29;:::i;:::-;7405:37;;7497:4;7491;7487:15;7479:23;;7201:308;;;:::o;7515:146::-;7612:6;7607:3;7602;7589:30;7653:1;7644:6;7639:3;7635:16;7628:27;7515:146;;;:::o;7667:425::-;7745:5;7770:66;7786:49;7828:6;7786:49;:::i;:::-;7770:66;:::i;:::-;7761:75;;7859:6;7852:5;7845:21;7897:4;7890:5;7886:16;7935:3;7926:6;7921:3;7917:16;7914:25;7911:112;;;7942:79;;:::i;:::-;7911:112;8032:54;8079:6;8074:3;8069;8032:54;:::i;:::-;7751:341;7667:425;;;;;:::o;8112:340::-;8168:5;8217:3;8210:4;8202:6;8198:17;8194:27;8184:122;;8225:79;;:::i;:::-;8184:122;8342:6;8329:20;8367:79;8442:3;8434:6;8427:4;8419:6;8415:17;8367:79;:::i;:::-;8358:88;;8174:278;8112:340;;;;:::o;8458:509::-;8527:6;8576:2;8564:9;8555:7;8551:23;8547:32;8544:119;;;8582:79;;:::i;:::-;8544:119;8730:1;8719:9;8715:17;8702:31;8760:18;8752:6;8749:30;8746:117;;;8782:79;;:::i;:::-;8746:117;8887:63;8942:7;8933:6;8922:9;8918:22;8887:63;:::i;:::-;8877:73;;8673:287;8458:509;;;;:::o;8973:329::-;9032:6;9081:2;9069:9;9060:7;9056:23;9052:32;9049:119;;;9087:79;;:::i;:::-;9049:119;9207:1;9232:53;9277:7;9268:6;9257:9;9253:22;9232:53;:::i;:::-;9222:63;;9178:117;8973:329;;;;:::o;9308:116::-;9378:21;9393:5;9378:21;:::i;:::-;9371:5;9368:32;9358:60;;9414:1;9411;9404:12;9358:60;9308:116;:::o;9430:133::-;9473:5;9511:6;9498:20;9489:29;;9527:30;9551:5;9527:30;:::i;:::-;9430:133;;;;:::o;9569:468::-;9634:6;9642;9691:2;9679:9;9670:7;9666:23;9662:32;9659:119;;;9697:79;;:::i;:::-;9659:119;9817:1;9842:53;9887:7;9878:6;9867:9;9863:22;9842:53;:::i;:::-;9832:63;;9788:117;9944:2;9970:50;10012:7;10003:6;9992:9;9988:22;9970:50;:::i;:::-;9960:60;;9915:115;9569:468;;;;;:::o;10043:60::-;10071:3;10092:5;10085:12;;10043:60;;;:::o;10109:142::-;10159:9;10192:53;10210:34;10219:24;10237:5;10219:24;:::i;:::-;10210:34;:::i;:::-;10192:53;:::i;:::-;10179:66;;10109:142;;;:::o;10257:126::-;10307:9;10340:37;10371:5;10340:37;:::i;:::-;10327:50;;10257:126;;;:::o;10389:147::-;10460:9;10493:37;10524:5;10493:37;:::i;:::-;10480:50;;10389:147;;;:::o;10542:173::-;10650:58;10702:5;10650:58;:::i;:::-;10645:3;10638:71;10542:173;;:::o;10721:264::-;10835:4;10873:2;10862:9;10858:18;10850:26;;10886:92;10975:1;10964:9;10960:17;10951:6;10886:92;:::i;:::-;10721:264;;;;:::o;10991:307::-;11052:4;11142:18;11134:6;11131:30;11128:56;;;11164:18;;:::i;:::-;11128:56;11202:29;11224:6;11202:29;:::i;:::-;11194:37;;11286:4;11280;11276:15;11268:23;;10991:307;;;:::o;11304:423::-;11381:5;11406:65;11422:48;11463:6;11422:48;:::i;:::-;11406:65;:::i;:::-;11397:74;;11494:6;11487:5;11480:21;11532:4;11525:5;11521:16;11570:3;11561:6;11556:3;11552:16;11549:25;11546:112;;;11577:79;;:::i;:::-;11546:112;11667:54;11714:6;11709:3;11704;11667:54;:::i;:::-;11387:340;11304:423;;;;;:::o;11746:338::-;11801:5;11850:3;11843:4;11835:6;11831:17;11827:27;11817:122;;11858:79;;:::i;:::-;11817:122;11975:6;11962:20;12000:78;12074:3;12066:6;12059:4;12051:6;12047:17;12000:78;:::i;:::-;11991:87;;11807:277;11746:338;;;;:::o;12090:943::-;12185:6;12193;12201;12209;12258:3;12246:9;12237:7;12233:23;12229:33;12226:120;;;12265:79;;:::i;:::-;12226:120;12385:1;12410:53;12455:7;12446:6;12435:9;12431:22;12410:53;:::i;:::-;12400:63;;12356:117;12512:2;12538:53;12583:7;12574:6;12563:9;12559:22;12538:53;:::i;:::-;12528:63;;12483:118;12640:2;12666:53;12711:7;12702:6;12691:9;12687:22;12666:53;:::i;:::-;12656:63;;12611:118;12796:2;12785:9;12781:18;12768:32;12827:18;12819:6;12816:30;12813:117;;;12849:79;;:::i;:::-;12813:117;12954:62;13008:7;12999:6;12988:9;12984:22;12954:62;:::i;:::-;12944:72;;12739:287;12090:943;;;;;;;:::o;13039:474::-;13107:6;13115;13164:2;13152:9;13143:7;13139:23;13135:32;13132:119;;;13170:79;;:::i;:::-;13132:119;13290:1;13315:53;13360:7;13351:6;13340:9;13336:22;13315:53;:::i;:::-;13305:63;;13261:117;13417:2;13443:53;13488:7;13479:6;13468:9;13464:22;13443:53;:::i;:::-;13433:63;;13388:118;13039:474;;;;;:::o;13519:180::-;13567:77;13564:1;13557:88;13664:4;13661:1;13654:15;13688:4;13685:1;13678:15;13705:320;13749:6;13786:1;13780:4;13776:12;13766:22;;13833:1;13827:4;13823:12;13854:18;13844:81;;13910:4;13902:6;13898:17;13888:27;;13844:81;13972:2;13964:6;13961:14;13941:18;13938:38;13935:84;;13991:18;;:::i;:::-;13935:84;13756:269;13705:320;;;:::o;14031:220::-;14171:34;14167:1;14159:6;14155:14;14148:58;14240:3;14235:2;14227:6;14223:15;14216:28;14031:220;:::o;14257:366::-;14399:3;14420:67;14484:2;14479:3;14420:67;:::i;:::-;14413:74;;14496:93;14585:3;14496:93;:::i;:::-;14614:2;14609:3;14605:12;14598:19;;14257:366;;;:::o;14629:419::-;14795:4;14833:2;14822:9;14818:18;14810:26;;14882:9;14876:4;14872:20;14868:1;14857:9;14853:17;14846:47;14910:131;15036:4;14910:131;:::i;:::-;14902:139;;14629:419;;;:::o;15054:248::-;15194:34;15190:1;15182:6;15178:14;15171:58;15263:31;15258:2;15250:6;15246:15;15239:56;15054:248;:::o;15308:366::-;15450:3;15471:67;15535:2;15530:3;15471:67;:::i;:::-;15464:74;;15547:93;15636:3;15547:93;:::i;:::-;15665:2;15660:3;15656:12;15649:19;;15308:366;;;:::o;15680:419::-;15846:4;15884:2;15873:9;15869:18;15861:26;;15933:9;15927:4;15923:20;15919:1;15908:9;15904:17;15897:47;15961:131;16087:4;15961:131;:::i;:::-;15953:139;;15680:419;;;:::o;16105:232::-;16245:34;16241:1;16233:6;16229:14;16222:58;16314:15;16309:2;16301:6;16297:15;16290:40;16105:232;:::o;16343:366::-;16485:3;16506:67;16570:2;16565:3;16506:67;:::i;:::-;16499:74;;16582:93;16671:3;16582:93;:::i;:::-;16700:2;16695:3;16691:12;16684:19;;16343:366;;;:::o;16715:419::-;16881:4;16919:2;16908:9;16904:18;16896:26;;16968:9;16962:4;16958:20;16954:1;16943:9;16939:17;16932:47;16996:131;17122:4;16996:131;:::i;:::-;16988:139;;16715:419;;;:::o;17140:179::-;17280:31;17276:1;17268:6;17264:14;17257:55;17140:179;:::o;17325:366::-;17467:3;17488:67;17552:2;17547:3;17488:67;:::i;:::-;17481:74;;17564:93;17653:3;17564:93;:::i;:::-;17682:2;17677:3;17673:12;17666:19;;17325:366;;;:::o;17697:419::-;17863:4;17901:2;17890:9;17886:18;17878:26;;17950:9;17944:4;17940:20;17936:1;17925:9;17921:17;17914:47;17978:131;18104:4;17978:131;:::i;:::-;17970:139;;17697:419;;;:::o;18122:180::-;18170:77;18167:1;18160:88;18267:4;18264:1;18257:15;18291:4;18288:1;18281:15;18308:191;18348:3;18367:20;18385:1;18367:20;:::i;:::-;18362:25;;18401:20;18419:1;18401:20;:::i;:::-;18396:25;;18444:1;18441;18437:9;18430:16;;18465:3;18462:1;18459:10;18456:36;;;18472:18;;:::i;:::-;18456:36;18308:191;;;;:::o;18505:233::-;18544:3;18567:24;18585:5;18567:24;:::i;:::-;18558:33;;18613:66;18606:5;18603:77;18600:103;;18683:18;;:::i;:::-;18600:103;18730:1;18723:5;18719:13;18712:20;;18505:233;;;:::o;18744:230::-;18884:34;18880:1;18872:6;18868:14;18861:58;18953:13;18948:2;18940:6;18936:15;18929:38;18744:230;:::o;18980:366::-;19122:3;19143:67;19207:2;19202:3;19143:67;:::i;:::-;19136:74;;19219:93;19308:3;19219:93;:::i;:::-;19337:2;19332:3;19328:12;19321:19;;18980:366;;;:::o;19352:419::-;19518:4;19556:2;19545:9;19541:18;19533:26;;19605:9;19599:4;19595:20;19591:1;19580:9;19576:17;19569:47;19633:131;19759:4;19633:131;:::i;:::-;19625:139;;19352:419;;;:::o;19777:178::-;19917:30;19913:1;19905:6;19901:14;19894:54;19777:178;:::o;19961:366::-;20103:3;20124:67;20188:2;20183:3;20124:67;:::i;:::-;20117:74;;20200:93;20289:3;20200:93;:::i;:::-;20318:2;20313:3;20309:12;20302:19;;19961:366;;;:::o;20333:419::-;20499:4;20537:2;20526:9;20522:18;20514:26;;20586:9;20580:4;20576:20;20572:1;20561:9;20557:17;20550:47;20614:131;20740:4;20614:131;:::i;:::-;20606:139;;20333:419;;;:::o;20758:231::-;20898:34;20894:1;20886:6;20882:14;20875:58;20967:14;20962:2;20954:6;20950:15;20943:39;20758:231;:::o;20995:366::-;21137:3;21158:67;21222:2;21217:3;21158:67;:::i;:::-;21151:74;;21234:93;21323:3;21234:93;:::i;:::-;21352:2;21347:3;21343:12;21336:19;;20995:366;;;:::o;21367:419::-;21533:4;21571:2;21560:9;21556:18;21548:26;;21620:9;21614:4;21610:20;21606:1;21595:9;21591:17;21584:47;21648:131;21774:4;21648:131;:::i;:::-;21640:139;;21367:419;;;:::o;21792:180::-;21840:77;21837:1;21830:88;21937:4;21934:1;21927:15;21961:4;21958:1;21951:15;21978:179;22118:31;22114:1;22106:6;22102:14;22095:55;21978:179;:::o;22163:366::-;22305:3;22326:67;22390:2;22385:3;22326:67;:::i;:::-;22319:74;;22402:93;22491:3;22402:93;:::i;:::-;22520:2;22515:3;22511:12;22504:19;;22163:366;;;:::o;22535:419::-;22701:4;22739:2;22728:9;22724:18;22716:26;;22788:9;22782:4;22778:20;22774:1;22763:9;22759:17;22752:47;22816:131;22942:4;22816:131;:::i;:::-;22808:139;;22535:419;;;:::o;22960:170::-;23100:22;23096:1;23088:6;23084:14;23077:46;22960:170;:::o;23136:366::-;23278:3;23299:67;23363:2;23358:3;23299:67;:::i;:::-;23292:74;;23375:93;23464:3;23375:93;:::i;:::-;23493:2;23488:3;23484:12;23477:19;;23136:366;;;:::o;23508:419::-;23674:4;23712:2;23701:9;23697:18;23689:26;;23761:9;23755:4;23751:20;23747:1;23736:9;23732:17;23725:47;23789:131;23915:4;23789:131;:::i;:::-;23781:139;;23508:419;;;:::o;23933:178::-;24073:30;24069:1;24061:6;24057:14;24050:54;23933:178;:::o;24117:366::-;24259:3;24280:67;24344:2;24339:3;24280:67;:::i;:::-;24273:74;;24356:93;24445:3;24356:93;:::i;:::-;24474:2;24469:3;24465:12;24458:19;;24117:366;;;:::o;24489:419::-;24655:4;24693:2;24682:9;24678:18;24670:26;;24742:9;24736:4;24732:20;24728:1;24717:9;24713:17;24706:47;24770:131;24896:4;24770:131;:::i;:::-;24762:139;;24489:419;;;:::o;24914:143::-;24971:5;25002:6;24996:13;24987:22;;25018:33;25045:5;25018:33;:::i;:::-;24914:143;;;;:::o;25063:351::-;25133:6;25182:2;25170:9;25161:7;25157:23;25153:32;25150:119;;;25188:79;;:::i;:::-;25150:119;25308:1;25333:64;25389:7;25380:6;25369:9;25365:22;25333:64;:::i;:::-;25323:74;;25279:128;25063:351;;;;:::o;25420:222::-;25560:34;25556:1;25548:6;25544:14;25537:58;25629:5;25624:2;25616:6;25612:15;25605:30;25420:222;:::o;25648:366::-;25790:3;25811:67;25875:2;25870:3;25811:67;:::i;:::-;25804:74;;25887:93;25976:3;25887:93;:::i;:::-;26005:2;26000:3;25996:12;25989:19;;25648:366;;;:::o;26020:419::-;26186:4;26224:2;26213:9;26209:18;26201:26;;26273:9;26267:4;26263:20;26259:1;26248:9;26244:17;26237:47;26301:131;26427:4;26301:131;:::i;:::-;26293:139;;26020:419;;;:::o;26445:442::-;26594:4;26632:2;26621:9;26617:18;26609:26;;26645:71;26713:1;26702:9;26698:17;26689:6;26645:71;:::i;:::-;26726:72;26794:2;26783:9;26779:18;26770:6;26726:72;:::i;:::-;26808;26876:2;26865:9;26861:18;26852:6;26808:72;:::i;:::-;26445:442;;;;;;:::o;26893:141::-;26942:4;26965:3;26957:11;;26988:3;26985:1;26978:14;27022:4;27019:1;27009:18;27001:26;;26893:141;;;:::o;27040:93::-;27077:6;27124:2;27119;27112:5;27108:14;27104:23;27094:33;;27040:93;;;:::o;27139:107::-;27183:8;27233:5;27227:4;27223:16;27202:37;;27139:107;;;;:::o;27252:393::-;27321:6;27371:1;27359:10;27355:18;27394:97;27424:66;27413:9;27394:97;:::i;:::-;27512:39;27542:8;27531:9;27512:39;:::i;:::-;27500:51;;27584:4;27580:9;27573:5;27569:21;27560:30;;27633:4;27623:8;27619:19;27612:5;27609:30;27599:40;;27328:317;;27252:393;;;;;:::o;27651:142::-;27701:9;27734:53;27752:34;27761:24;27779:5;27761:24;:::i;:::-;27752:34;:::i;:::-;27734:53;:::i;:::-;27721:66;;27651:142;;;:::o;27799:75::-;27842:3;27863:5;27856:12;;27799:75;;;:::o;27880:269::-;27990:39;28021:7;27990:39;:::i;:::-;28051:91;28100:41;28124:16;28100:41;:::i;:::-;28092:6;28085:4;28079:11;28051:91;:::i;:::-;28045:4;28038:105;27956:193;27880:269;;;:::o;28155:73::-;28200:3;28155:73;:::o;28234:189::-;28311:32;;:::i;:::-;28352:65;28410:6;28402;28396:4;28352:65;:::i;:::-;28287:136;28234:189;;:::o;28429:186::-;28489:120;28506:3;28499:5;28496:14;28489:120;;;28560:39;28597:1;28590:5;28560:39;:::i;:::-;28533:1;28526:5;28522:13;28513:22;;28489:120;;;28429:186;;:::o;28621:543::-;28722:2;28717:3;28714:11;28711:446;;;28756:38;28788:5;28756:38;:::i;:::-;28840:29;28858:10;28840:29;:::i;:::-;28830:8;28826:44;29023:2;29011:10;29008:18;29005:49;;;29044:8;29029:23;;29005:49;29067:80;29123:22;29141:3;29123:22;:::i;:::-;29113:8;29109:37;29096:11;29067:80;:::i;:::-;28726:431;;28711:446;28621:543;;;:::o;29170:117::-;29224:8;29274:5;29268:4;29264:16;29243:37;;29170:117;;;;:::o;29293:169::-;29337:6;29370:51;29418:1;29414:6;29406:5;29403:1;29399:13;29370:51;:::i;:::-;29366:56;29451:4;29445;29441:15;29431:25;;29344:118;29293:169;;;;:::o;29467:295::-;29543:4;29689:29;29714:3;29708:4;29689:29;:::i;:::-;29681:37;;29751:3;29748:1;29744:11;29738:4;29735:21;29727:29;;29467:295;;;;:::o;29767:1395::-;29884:37;29917:3;29884:37;:::i;:::-;29986:18;29978:6;29975:30;29972:56;;;30008:18;;:::i;:::-;29972:56;30052:38;30084:4;30078:11;30052:38;:::i;:::-;30137:67;30197:6;30189;30183:4;30137:67;:::i;:::-;30231:1;30255:4;30242:17;;30287:2;30279:6;30276:14;30304:1;30299:618;;;;30961:1;30978:6;30975:77;;;31027:9;31022:3;31018:19;31012:26;31003:35;;30975:77;31078:67;31138:6;31131:5;31078:67;:::i;:::-;31072:4;31065:81;30934:222;30269:887;;30299:618;30351:4;30347:9;30339:6;30335:22;30385:37;30417:4;30385:37;:::i;:::-;30444:1;30458:208;30472:7;30469:1;30466:14;30458:208;;;30551:9;30546:3;30542:19;30536:26;30528:6;30521:42;30602:1;30594:6;30590:14;30580:24;;30649:2;30638:9;30634:18;30621:31;;30495:4;30492:1;30488:12;30483:17;;30458:208;;;30694:6;30685:7;30682:19;30679:179;;;30752:9;30747:3;30743:19;30737:26;30795:48;30837:4;30829:6;30825:17;30814:9;30795:48;:::i;:::-;30787:6;30780:64;30702:156;30679:179;30904:1;30900;30892:6;30888:14;30884:22;30878:4;30871:36;30306:611;;;30269:887;;29859:1303;;;29767:1395;;:::o;31168:174::-;31308:26;31304:1;31296:6;31292:14;31285:50;31168:174;:::o;31348:366::-;31490:3;31511:67;31575:2;31570:3;31511:67;:::i;:::-;31504:74;;31587:93;31676:3;31587:93;:::i;:::-;31705:2;31700:3;31696:12;31689:19;;31348:366;;;:::o;31720:419::-;31886:4;31924:2;31913:9;31909:18;31901:26;;31973:9;31967:4;31963:20;31959:1;31948:9;31944:17;31937:47;32001:131;32127:4;32001:131;:::i;:::-;31993:139;;31720:419;;;:::o;32145:228::-;32285:34;32281:1;32273:6;32269:14;32262:58;32354:11;32349:2;32341:6;32337:15;32330:36;32145:228;:::o;32379:366::-;32521:3;32542:67;32606:2;32601:3;32542:67;:::i;:::-;32535:74;;32618:93;32707:3;32618:93;:::i;:::-;32736:2;32731:3;32727:12;32720:19;;32379:366;;;:::o;32751:419::-;32917:4;32955:2;32944:9;32940:18;32932:26;;33004:9;32998:4;32994:20;32990:1;32979:9;32975:17;32968:47;33032:131;33158:4;33032:131;:::i;:::-;33024:139;;32751:419;;;:::o;33176:165::-;33316:17;33312:1;33304:6;33300:14;33293:41;33176:165;:::o;33347:366::-;33489:3;33510:67;33574:2;33569:3;33510:67;:::i;:::-;33503:74;;33586:93;33675:3;33586:93;:::i;:::-;33704:2;33699:3;33695:12;33688:19;;33347:366;;;:::o;33719:419::-;33885:4;33923:2;33912:9;33908:18;33900:26;;33972:9;33966:4;33962:20;33958:1;33947:9;33943:17;33936:47;34000:131;34126:4;34000:131;:::i;:::-;33992:139;;33719:419;;;:::o;34144:170::-;34284:22;34280:1;34272:6;34268:14;34261:46;34144:170;:::o;34320:366::-;34462:3;34483:67;34547:2;34542:3;34483:67;:::i;:::-;34476:74;;34559:93;34648:3;34559:93;:::i;:::-;34677:2;34672:3;34668:12;34661:19;;34320:366;;;:::o;34692:419::-;34858:4;34896:2;34885:9;34881:18;34873:26;;34945:9;34939:4;34935:20;34931:1;34920:9;34916:17;34909:47;34973:131;35099:4;34973:131;:::i;:::-;34965:139;;34692:419;;;:::o;35117:148::-;35219:11;35256:3;35241:18;;35117:148;;;;:::o;35295:874::-;35398:3;35435:5;35429:12;35464:36;35490:9;35464:36;:::i;:::-;35516:89;35598:6;35593:3;35516:89;:::i;:::-;35509:96;;35636:1;35625:9;35621:17;35652:1;35647:166;;;;35827:1;35822:341;;;;35614:549;;35647:166;35731:4;35727:9;35716;35712:25;35707:3;35700:38;35793:6;35786:14;35779:22;35771:6;35767:35;35762:3;35758:45;35751:52;;35647:166;;35822:341;35889:38;35921:5;35889:38;:::i;:::-;35949:1;35963:154;35977:6;35974:1;35971:13;35963:154;;;36051:7;36045:14;36041:1;36036:3;36032:11;36025:35;36101:1;36092:7;36088:15;36077:26;;35999:4;35996:1;35992:12;35987:17;;35963:154;;;36146:6;36141:3;36137:16;36130:23;;35829:334;;35614:549;;35402:767;;35295:874;;;;:::o;36175:157::-;36315:9;36311:1;36303:6;36299:14;36292:33;36175:157;:::o;36338:400::-;36498:3;36519:84;36601:1;36596:3;36519:84;:::i;:::-;36512:91;;36612:93;36701:3;36612:93;:::i;:::-;36730:1;36725:3;36721:11;36714:18;;36338:400;;;:::o;36744:390::-;36850:3;36878:39;36911:5;36878:39;:::i;:::-;36933:89;37015:6;37010:3;36933:89;:::i;:::-;36926:96;;37031:65;37089:6;37084:3;37077:4;37070:5;37066:16;37031:65;:::i;:::-;37121:6;37116:3;37112:16;37105:23;;36854:280;36744:390;;;;:::o;37140:155::-;37280:7;37276:1;37268:6;37264:14;37257:31;37140:155;:::o;37301:400::-;37461:3;37482:84;37564:1;37559:3;37482:84;:::i;:::-;37475:91;;37575:93;37664:3;37575:93;:::i;:::-;37693:1;37688:3;37684:11;37677:18;;37301:400;;;:::o;37707:961::-;38086:3;38108:92;38196:3;38187:6;38108:92;:::i;:::-;38101:99;;38217:148;38361:3;38217:148;:::i;:::-;38210:155;;38382:95;38473:3;38464:6;38382:95;:::i;:::-;38375:102;;38494:148;38638:3;38494:148;:::i;:::-;38487:155;;38659:3;38652:10;;37707:961;;;;;:::o;38674:225::-;38814:34;38810:1;38802:6;38798:14;38791:58;38883:8;38878:2;38870:6;38866:15;38859:33;38674:225;:::o;38905:366::-;39047:3;39068:67;39132:2;39127:3;39068:67;:::i;:::-;39061:74;;39144:93;39233:3;39144:93;:::i;:::-;39262:2;39257:3;39253:12;39246:19;;38905:366;;;:::o;39277:419::-;39443:4;39481:2;39470:9;39466:18;39458:26;;39530:9;39524:4;39520:20;39516:1;39505:9;39501:17;39494:47;39558:131;39684:4;39558:131;:::i;:::-;39550:139;;39277:419;;;:::o;39702:224::-;39842:34;39838:1;39830:6;39826:14;39819:58;39911:7;39906:2;39898:6;39894:15;39887:32;39702:224;:::o;39932:366::-;40074:3;40095:67;40159:2;40154:3;40095:67;:::i;:::-;40088:74;;40171:93;40260:3;40171:93;:::i;:::-;40289:2;40284:3;40280:12;40273:19;;39932:366;;;:::o;40304:419::-;40470:4;40508:2;40497:9;40493:18;40485:26;;40557:9;40551:4;40547:20;40543:1;40532:9;40528:17;40521:47;40585:131;40711:4;40585:131;:::i;:::-;40577:139;;40304:419;;;:::o;40729:223::-;40869:34;40865:1;40857:6;40853:14;40846:58;40938:6;40933:2;40925:6;40921:15;40914:31;40729:223;:::o;40958:366::-;41100:3;41121:67;41185:2;41180:3;41121:67;:::i;:::-;41114:74;;41197:93;41286:3;41197:93;:::i;:::-;41315:2;41310:3;41306:12;41299:19;;40958:366;;;:::o;41330:419::-;41496:4;41534:2;41523:9;41519:18;41511:26;;41583:9;41577:4;41573:20;41569:1;41558:9;41554:17;41547:47;41611:131;41737:4;41611:131;:::i;:::-;41603:139;;41330:419;;;:::o;41755:182::-;41895:34;41891:1;41883:6;41879:14;41872:58;41755:182;:::o;41943:366::-;42085:3;42106:67;42170:2;42165:3;42106:67;:::i;:::-;42099:74;;42182:93;42271:3;42182:93;:::i;:::-;42300:2;42295:3;42291:12;42284:19;;41943:366;;;:::o;42315:419::-;42481:4;42519:2;42508:9;42504:18;42496:26;;42568:9;42562:4;42558:20;42554:1;42543:9;42539:17;42532:47;42596:131;42722:4;42596:131;:::i;:::-;42588:139;;42315:419;;;:::o;42740:166::-;42880:18;42876:1;42868:6;42864:14;42857:42;42740:166;:::o;42912:366::-;43054:3;43075:67;43139:2;43134:3;43075:67;:::i;:::-;43068:74;;43151:93;43240:3;43151:93;:::i;:::-;43269:2;43264:3;43260:12;43253:19;;42912:366;;;:::o;43284:419::-;43450:4;43488:2;43477:9;43473:18;43465:26;;43537:9;43531:4;43527:20;43523:1;43512:9;43508:17;43501:47;43565:131;43691:4;43565:131;:::i;:::-;43557:139;;43284:419;;;:::o;43709:175::-;43849:27;43845:1;43837:6;43833:14;43826:51;43709:175;:::o;43890:366::-;44032:3;44053:67;44117:2;44112:3;44053:67;:::i;:::-;44046:74;;44129:93;44218:3;44129:93;:::i;:::-;44247:2;44242:3;44238:12;44231:19;;43890:366;;;:::o;44262:419::-;44428:4;44466:2;44455:9;44451:18;44443:26;;44515:9;44509:4;44505:20;44501:1;44490:9;44486:17;44479:47;44543:131;44669:4;44543:131;:::i;:::-;44535:139;;44262:419;;;:::o;44687:237::-;44827:34;44823:1;44815:6;44811:14;44804:58;44896:20;44891:2;44883:6;44879:15;44872:45;44687:237;:::o;44930:366::-;45072:3;45093:67;45157:2;45152:3;45093:67;:::i;:::-;45086:74;;45169:93;45258:3;45169:93;:::i;:::-;45287:2;45282:3;45278:12;45271:19;;44930:366;;;:::o;45302:419::-;45468:4;45506:2;45495:9;45491:18;45483:26;;45555:9;45549:4;45545:20;45541:1;45530:9;45526:17;45519:47;45583:131;45709:4;45583:131;:::i;:::-;45575:139;;45302:419;;;:::o;45727:180::-;45775:77;45772:1;45765:88;45872:4;45869:1;45862:15;45896:4;45893:1;45886:15;45913:240;46053:34;46049:1;46041:6;46037:14;46030:58;46122:23;46117:2;46109:6;46105:15;46098:48;45913:240;:::o;46159:366::-;46301:3;46322:67;46386:2;46381:3;46322:67;:::i;:::-;46315:74;;46398:93;46487:3;46398:93;:::i;:::-;46516:2;46511:3;46507:12;46500:19;;46159:366;;;:::o;46531:419::-;46697:4;46735:2;46724:9;46720:18;46712:26;;46784:9;46778:4;46774:20;46770:1;46759:9;46755:17;46748:47;46812:131;46938:4;46812:131;:::i;:::-;46804:139;;46531:419;;;:::o;46956:170::-;47096:22;47092:1;47084:6;47080:14;47073:46;46956:170;:::o;47132:366::-;47274:3;47295:67;47359:2;47354:3;47295:67;:::i;:::-;47288:74;;47371:93;47460:3;47371:93;:::i;:::-;47489:2;47484:3;47480:12;47473:19;;47132:366;;;:::o;47504:419::-;47670:4;47708:2;47697:9;47693:18;47685:26;;47757:9;47751:4;47747:20;47743:1;47732:9;47728:17;47721:47;47785:131;47911:4;47785:131;:::i;:::-;47777:139;;47504:419;;;:::o;47929:98::-;47980:6;48014:5;48008:12;47998:22;;47929:98;;;:::o;48033:168::-;48116:11;48150:6;48145:3;48138:19;48190:4;48185:3;48181:14;48166:29;;48033:168;;;;:::o;48207:373::-;48293:3;48321:38;48353:5;48321:38;:::i;:::-;48375:70;48438:6;48433:3;48375:70;:::i;:::-;48368:77;;48454:65;48512:6;48507:3;48500:4;48493:5;48489:16;48454:65;:::i;:::-;48544:29;48566:6;48544:29;:::i;:::-;48539:3;48535:39;48528:46;;48297:283;48207:373;;;;:::o;48586:640::-;48781:4;48819:3;48808:9;48804:19;48796:27;;48833:71;48901:1;48890:9;48886:17;48877:6;48833:71;:::i;:::-;48914:72;48982:2;48971:9;48967:18;48958:6;48914:72;:::i;:::-;48996;49064:2;49053:9;49049:18;49040:6;48996:72;:::i;:::-;49115:9;49109:4;49105:20;49100:2;49089:9;49085:18;49078:48;49143:76;49214:4;49205:6;49143:76;:::i;:::-;49135:84;;48586:640;;;;;;;:::o;49232:141::-;49288:5;49319:6;49313:13;49304:22;;49335:32;49361:5;49335:32;:::i;:::-;49232:141;;;;:::o;49379:349::-;49448:6;49497:2;49485:9;49476:7;49472:23;49468:32;49465:119;;;49503:79;;:::i;:::-;49465:119;49623:1;49648:63;49703:7;49694:6;49683:9;49679:22;49648:63;:::i;:::-;49638:73;;49594:127;49379:349;;;;:::o;49734:194::-;49774:4;49794:20;49812:1;49794:20;:::i;:::-;49789:25;;49828:20;49846:1;49828:20;:::i;:::-;49823:25;;49872:1;49869;49865:9;49857:17;;49896:1;49890:4;49887:11;49884:37;;;49901:18;;:::i;:::-;49884:37;49734:194;;;;:::o;49934:180::-;49982:77;49979:1;49972:88;50079:4;50076:1;50069:15;50103:4;50100:1;50093:15;50120:182;50260:34;50256:1;50248:6;50244:14;50237:58;50120:182;:::o;50308:366::-;50450:3;50471:67;50535:2;50530:3;50471:67;:::i;:::-;50464:74;;50547:93;50636:3;50547:93;:::i;:::-;50665:2;50660:3;50656:12;50649:19;;50308:366;;;:::o;50680:419::-;50846:4;50884:2;50873:9;50869:18;50861:26;;50933:9;50927:4;50923:20;50919:1;50908:9;50904:17;50897:47;50961:131;51087:4;50961:131;:::i;:::-;50953:139;;50680:419;;;:::o;51105:178::-;51245:30;51241:1;51233:6;51229:14;51222:54;51105:178;:::o;51289:366::-;51431:3;51452:67;51516:2;51511:3;51452:67;:::i;:::-;51445:74;;51528:93;51617:3;51528:93;:::i;:::-;51646:2;51641:3;51637:12;51630:19;;51289:366;;;:::o;51661:419::-;51827:4;51865:2;51854:9;51850:18;51842:26;;51914:9;51908:4;51904:20;51900:1;51889:9;51885:17;51878:47;51942:131;52068:4;51942:131;:::i;:::-;51934:139;;51661:419;;;:::o

Swarm Source

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