ETH Price: $2,600.15 (-2.26%)
Gas: 1 Gwei

Token

Mia (MIA)
 

Overview

Max Total Supply

1,655 MIA

Holders

1,528

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
lotern.eth
Balance
1 MIA
0x3a7b3d08393f59134b756d95b04d390e5bd95cca
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Wanna get on an adventure in MeStar? Follow Mia and immerse in this Blocky Metaverse!

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MIAToken

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// SPDX-License-Identifier: MIT

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

        _owners[tokenId] = to;

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

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

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

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

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

        // Clear approvals
        delete _tokenApprovals[tokenId];

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId, 1);

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

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

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

        emit Transfer(from, to, tokenId);

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

        uint256 tokenId = firstTokenId;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.0;

/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev See {ERC721-_burn}. This override additionally checks to see if a
     * token-specific URI was set for the token, and if so, it deletes the token URI from
     * the storage mapping.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;


/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
        _burn(tokenId);
    }
}

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

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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: MIANFT.sol

pragma solidity ^0.8.9;
contract MIAToken is ERC721, ERC721Enumerable, ERC721URIStorage, Pausable, Ownable, ERC721Burnable {
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounter;

    uint256 MAX_SUPPLY = 2000;

    constructor() ERC721("Mia", "MIA") {}

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

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

    function mintById(address to, string memory uri,uint256 id) public onlyOwner{
        require(id <= MAX_SUPPLY, "mint max error!");
        _safeMint(to, id);
        _setTokenURI(id, uri);
    }

    function safeMint(address to, string memory uri) public onlyOwner {
        uint256 tokenId = _tokenIdCounter.current();
        require(_tokenIdCounter.current() <= MAX_SUPPLY, "mint max error!");
        _tokenIdCounter.increment();
        _safeMint(to, tokenId);
        _setTokenURI(tokenId, uri);
    }

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


    function _burn(uint256 tokenId) internal onlyOwner override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":[{"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":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"mintById","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":"to","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"name":"safeMint","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":"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"}]

60806040526107d0600d553480156200001757600080fd5b506040518060400160405280600381526020017f4d696100000000000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4d49410000000000000000000000000000000000000000000000000000000000815250816000908162000095919062000433565b508060019081620000a7919062000433565b5050506000600b60006101000a81548160ff021916908315150217905550620000e5620000d9620000eb60201b60201c565b620000f360201b60201c565b6200051a565b600033905090565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200023b57607f821691505b602082108103620002515762000250620001f3565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002bb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200027c565b620002c786836200027c565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003146200030e6200030884620002df565b620002e9565b620002df565b9050919050565b6000819050919050565b6200033083620002f3565b620003486200033f826200031b565b84845462000289565b825550505050565b600090565b6200035f62000350565b6200036c81848462000325565b505050565b5b8181101562000394576200038860008262000355565b60018101905062000372565b5050565b601f821115620003e357620003ad8162000257565b620003b8846200026c565b81016020851015620003c8578190505b620003e0620003d7856200026c565b83018262000371565b50505b505050565b600082821c905092915050565b60006200040860001984600802620003e8565b1980831691505092915050565b6000620004238383620003f5565b9150826002028217905092915050565b6200043e82620001b9565b67ffffffffffffffff8111156200045a5762000459620001c4565b5b62000466825462000222565b6200047382828562000398565b600060209050601f831160018114620004ab576000841562000496578287015190505b620004a2858262000415565b86555062000512565b601f198416620004bb8662000257565b60005b82811015620004e557848901518255600182019150602085019450602081019050620004be565b8683101562000505578489015162000501601f891682620003f5565b8355505b6001600288020188555050505b505050505050565b613fd9806200052a6000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80636352211e116100de578063a22cb46511610097578063d204c45e11610071578063d204c45e14610424578063e985e9c514610440578063f2fde38b14610470578063fd8839981461048c57610173565b8063a22cb465146103bc578063b88d4fde146103d8578063c87b56dd146103f457610173565b80636352211e1461030c57806370a082311461033c578063715018a61461036c5780638456cb59146103765780638da5cb5b1461038057806395d89b411461039e57610173565b80632f745c59116101305780632f745c591461024c5780633f4ba83a1461027c57806342842e0e1461028657806342966c68146102a25780634f6ccce7146102be5780635c975abb146102ee57610173565b806301ffc9a71461017857806306fdde03146101a8578063081812fc146101c6578063095ea7b3146101f657806318160ddd1461021257806323b872dd14610230575b600080fd5b610192600480360381019061018d919061296c565b6104a8565b60405161019f91906129b4565b60405180910390f35b6101b06104ba565b6040516101bd9190612a5f565b60405180910390f35b6101e060048036038101906101db9190612ab7565b61054c565b6040516101ed9190612b25565b60405180910390f35b610210600480360381019061020b9190612b6c565b610592565b005b61021a6106a9565b6040516102279190612bbb565b60405180910390f35b61024a60048036038101906102459190612bd6565b6106b6565b005b61026660048036038101906102619190612b6c565b610716565b6040516102739190612bbb565b60405180910390f35b6102846107bb565b005b6102a0600480360381019061029b9190612bd6565b6107cd565b005b6102bc60048036038101906102b79190612ab7565b6107ed565b005b6102d860048036038101906102d39190612ab7565b610849565b6040516102e59190612bbb565b60405180910390f35b6102f66108ba565b60405161030391906129b4565b60405180910390f35b61032660048036038101906103219190612ab7565b6108d1565b6040516103339190612b25565b60405180910390f35b61035660048036038101906103519190612c29565b610957565b6040516103639190612bbb565b60405180910390f35b610374610a0e565b005b61037e610a22565b005b610388610a34565b6040516103959190612b25565b60405180910390f35b6103a6610a5e565b6040516103b39190612a5f565b60405180910390f35b6103d660048036038101906103d19190612c82565b610af0565b005b6103f260048036038101906103ed9190612df7565b610b06565b005b61040e60048036038101906104099190612ab7565b610b68565b60405161041b9190612a5f565b60405180910390f35b61043e60048036038101906104399190612f1b565b610b7a565b005b61045a60048036038101906104559190612f77565b610c01565b60405161046791906129b4565b60405180910390f35b61048a60048036038101906104859190612c29565b610c95565b005b6104a660048036038101906104a19190612fb7565b610d18565b005b60006104b382610d7e565b9050919050565b6060600080546104c990613055565b80601f01602080910402602001604051908101604052809291908181526020018280546104f590613055565b80156105425780601f1061051757610100808354040283529160200191610542565b820191906000526020600020905b81548152906001019060200180831161052557829003601f168201915b5050505050905090565b600061055782610df8565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061059d826108d1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361060d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610604906130f8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661062c610e43565b73ffffffffffffffffffffffffffffffffffffffff16148061065b575061065a81610655610e43565b610c01565b5b61069a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106919061318a565b60405180910390fd5b6106a48383610e4b565b505050565b6000600880549050905090565b6106c76106c1610e43565b82610f04565b610706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fd9061321c565b60405180910390fd5b610711838383610f99565b505050565b600061072183610957565b8210610762576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610759906132ae565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6107c3611292565b6107cb611310565b565b6107e883838360405180602001604052806000815250610b06565b505050565b6107fe6107f8610e43565b82610f04565b61083d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108349061321c565b60405180910390fd5b61084681611373565b50565b60006108536106a9565b8210610894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088b90613340565b60405180910390fd5b600882815481106108a8576108a7613360565b5b90600052602060002001549050919050565b6000600b60009054906101000a900460ff16905090565b6000806108dd83611387565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361094e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610945906133db565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109be9061346d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a16611292565b610a2060006113c4565b565b610a2a611292565b610a3261148a565b565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610a6d90613055565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9990613055565b8015610ae65780601f10610abb57610100808354040283529160200191610ae6565b820191906000526020600020905b815481529060010190602001808311610ac957829003601f168201915b5050505050905090565b610b02610afb610e43565b83836114ed565b5050565b610b17610b11610e43565b83610f04565b610b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4d9061321c565b60405180910390fd5b610b6284848484611659565b50505050565b6060610b73826116b5565b9050919050565b610b82611292565b6000610b8e600c6117c7565b9050600d54610b9d600c6117c7565b1115610bde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd5906134d9565b60405180910390fd5b610be8600c6117d5565b610bf283826117eb565b610bfc8183611809565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610c9d611292565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d039061356b565b60405180910390fd5b610d15816113c4565b50565b610d20611292565b600d54811115610d65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5c906134d9565b60405180910390fd5b610d6f83826117eb565b610d798183611809565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610df15750610df082611876565b5b9050919050565b610e0181611958565b610e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e37906133db565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610ebe836108d1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610f10836108d1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610f525750610f518185610c01565b5b80610f9057508373ffffffffffffffffffffffffffffffffffffffff16610f788461054c565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610fb9826108d1565b73ffffffffffffffffffffffffffffffffffffffff161461100f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611006906135fd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361107e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110759061368f565b60405180910390fd5b61108b8383836001611999565b8273ffffffffffffffffffffffffffffffffffffffff166110ab826108d1565b73ffffffffffffffffffffffffffffffffffffffff1614611101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f8906135fd565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461128d83838360016119b3565b505050565b61129a610e43565b73ffffffffffffffffffffffffffffffffffffffff166112b8610a34565b73ffffffffffffffffffffffffffffffffffffffff161461130e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611305906136fb565b60405180910390fd5b565b6113186119b9565b6000600b60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61135c610e43565b6040516113699190612b25565b60405180910390a1565b61137b611292565b61138481611a02565b50565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611492611a55565b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586114d6610e43565b6040516114e39190612b25565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361155b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155290613767565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161164c91906129b4565b60405180910390a3505050565b611664848484610f99565b61167084848484611a9f565b6116af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a6906137f9565b60405180910390fd5b50505050565b60606116c082610df8565b6000600a600084815260200190815260200160002080546116e090613055565b80601f016020809104026020016040519081016040528092919081815260200182805461170c90613055565b80156117595780601f1061172e57610100808354040283529160200191611759565b820191906000526020600020905b81548152906001019060200180831161173c57829003601f168201915b50505050509050600061176a611c26565b9050600081510361177f5781925050506117c2565b6000825111156117b457808260405160200161179c929190613855565b604051602081830303815290604052925050506117c2565b6117bd84611c3d565b925050505b919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b611805828260405180602001604052806000815250611ca5565b5050565b61181282611958565b611851576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611848906138eb565b60405180910390fd5b80600a600084815260200190815260200160002090816118719190613ab7565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061194157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611951575061195082611d00565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff1661197a83611387565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6119a1611a55565b6119ad84848484611d6a565b50505050565b50505050565b6119c16108ba565b611a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f790613bd5565b60405180910390fd5b565b611a0b81611ec8565b6000600a60008381526020019081526020016000208054611a2b90613055565b905014611a5257600a60008281526020019081526020016000206000611a5191906128a3565b5b50565b611a5d6108ba565b15611a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9490613c41565b60405180910390fd5b565b6000611ac08473ffffffffffffffffffffffffffffffffffffffff16612016565b15611c19578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ae9610e43565b8786866040518563ffffffff1660e01b8152600401611b0b9493929190613cb6565b6020604051808303816000875af1925050508015611b4757506040513d601f19601f82011682018060405250810190611b449190613d17565b60015b611bc9573d8060008114611b77576040519150601f19603f3d011682016040523d82523d6000602084013e611b7c565b606091505b506000815103611bc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb8906137f9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611c1e565b600190505b949350505050565b606060405180602001604052806000815250905090565b6060611c4882610df8565b6000611c52611c26565b90506000815111611c725760405180602001604052806000815250611c9d565b80611c7c84612039565b604051602001611c8d929190613855565b6040516020818303038152906040525b915050919050565b611caf8383612107565b611cbc6000848484611a9f565b611cfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf2906137f9565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611d7684848484612324565b6001811115611dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db190613db6565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611e0157611dfc8161244a565b611e40565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614611e3f57611e3e8582612493565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611e8257611e7d81612600565b611ec1565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611ec057611ebf84826126d1565b5b5b5050505050565b6000611ed3826108d1565b9050611ee3816000846001611999565b611eec826108d1565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120128160008460016119b3565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60606000600161204884612750565b01905060008167ffffffffffffffff81111561206757612066612ccc565b5b6040519080825280601f01601f1916602001820160405280156120995781602001600182028036833780820191505090505b509050600082602001820190505b6001156120fc578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816120f0576120ef613dd6565b5b049450600085036120a7575b819350505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216d90613e51565b60405180910390fd5b61217f81611958565b156121bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b690613ebd565b60405180910390fd5b6121cd600083836001611999565b6121d681611958565b15612216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220d90613ebd565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123206000838360016119b3565b5050565b600181111561244457600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146123b85780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123b09190613f0c565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124435780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461243b9190613f40565b925050819055505b5b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016124a084610957565b6124aa9190613f0c565b905060006007600084815260200190815260200160002054905081811461258f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506126149190613f0c565b905060006009600084815260200190815260200160002054905060006008838154811061264457612643613360565b5b90600052602060002001549050806008838154811061266657612665613360565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806126b5576126b4613f74565b5b6001900381819060005260206000200160009055905550505050565b60006126dc83610957565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106127ae577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816127a4576127a3613dd6565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106127eb576d04ee2d6d415b85acef810000000083816127e1576127e0613dd6565b5b0492506020810190505b662386f26fc10000831061281a57662386f26fc1000083816128105761280f613dd6565b5b0492506010810190505b6305f5e1008310612843576305f5e100838161283957612838613dd6565b5b0492506008810190505b612710831061286857612710838161285e5761285d613dd6565b5b0492506004810190505b6064831061288b576064838161288157612880613dd6565b5b0492506002810190505b600a831061289a576001810190505b80915050919050565b5080546128af90613055565b6000825580601f106128c157506128e0565b601f0160209004906000526020600020908101906128df91906128e3565b5b50565b5b808211156128fc5760008160009055506001016128e4565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61294981612914565b811461295457600080fd5b50565b60008135905061296681612940565b92915050565b6000602082840312156129825761298161290a565b5b600061299084828501612957565b91505092915050565b60008115159050919050565b6129ae81612999565b82525050565b60006020820190506129c960008301846129a5565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a095780820151818401526020810190506129ee565b60008484015250505050565b6000601f19601f8301169050919050565b6000612a31826129cf565b612a3b81856129da565b9350612a4b8185602086016129eb565b612a5481612a15565b840191505092915050565b60006020820190508181036000830152612a798184612a26565b905092915050565b6000819050919050565b612a9481612a81565b8114612a9f57600080fd5b50565b600081359050612ab181612a8b565b92915050565b600060208284031215612acd57612acc61290a565b5b6000612adb84828501612aa2565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b0f82612ae4565b9050919050565b612b1f81612b04565b82525050565b6000602082019050612b3a6000830184612b16565b92915050565b612b4981612b04565b8114612b5457600080fd5b50565b600081359050612b6681612b40565b92915050565b60008060408385031215612b8357612b8261290a565b5b6000612b9185828601612b57565b9250506020612ba285828601612aa2565b9150509250929050565b612bb581612a81565b82525050565b6000602082019050612bd06000830184612bac565b92915050565b600080600060608486031215612bef57612bee61290a565b5b6000612bfd86828701612b57565b9350506020612c0e86828701612b57565b9250506040612c1f86828701612aa2565b9150509250925092565b600060208284031215612c3f57612c3e61290a565b5b6000612c4d84828501612b57565b91505092915050565b612c5f81612999565b8114612c6a57600080fd5b50565b600081359050612c7c81612c56565b92915050565b60008060408385031215612c9957612c9861290a565b5b6000612ca785828601612b57565b9250506020612cb885828601612c6d565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612d0482612a15565b810181811067ffffffffffffffff82111715612d2357612d22612ccc565b5b80604052505050565b6000612d36612900565b9050612d428282612cfb565b919050565b600067ffffffffffffffff821115612d6257612d61612ccc565b5b612d6b82612a15565b9050602081019050919050565b82818337600083830152505050565b6000612d9a612d9584612d47565b612d2c565b905082815260208101848484011115612db657612db5612cc7565b5b612dc1848285612d78565b509392505050565b600082601f830112612dde57612ddd612cc2565b5b8135612dee848260208601612d87565b91505092915050565b60008060008060808587031215612e1157612e1061290a565b5b6000612e1f87828801612b57565b9450506020612e3087828801612b57565b9350506040612e4187828801612aa2565b925050606085013567ffffffffffffffff811115612e6257612e6161290f565b5b612e6e87828801612dc9565b91505092959194509250565b600067ffffffffffffffff821115612e9557612e94612ccc565b5b612e9e82612a15565b9050602081019050919050565b6000612ebe612eb984612e7a565b612d2c565b905082815260208101848484011115612eda57612ed9612cc7565b5b612ee5848285612d78565b509392505050565b600082601f830112612f0257612f01612cc2565b5b8135612f12848260208601612eab565b91505092915050565b60008060408385031215612f3257612f3161290a565b5b6000612f4085828601612b57565b925050602083013567ffffffffffffffff811115612f6157612f6061290f565b5b612f6d85828601612eed565b9150509250929050565b60008060408385031215612f8e57612f8d61290a565b5b6000612f9c85828601612b57565b9250506020612fad85828601612b57565b9150509250929050565b600080600060608486031215612fd057612fcf61290a565b5b6000612fde86828701612b57565b935050602084013567ffffffffffffffff811115612fff57612ffe61290f565b5b61300b86828701612eed565b925050604061301c86828701612aa2565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061306d57607f821691505b6020821081036130805761307f613026565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006130e26021836129da565b91506130ed82613086565b604082019050919050565b60006020820190508181036000830152613111816130d5565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613174603d836129da565b915061317f82613118565b604082019050919050565b600060208201905081810360008301526131a381613167565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613206602d836129da565b9150613211826131aa565b604082019050919050565b60006020820190508181036000830152613235816131f9565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613298602b836129da565b91506132a38261323c565b604082019050919050565b600060208201905081810360008301526132c78161328b565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061332a602c836129da565b9150613335826132ce565b604082019050919050565b600060208201905081810360008301526133598161331d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006133c56018836129da565b91506133d08261338f565b602082019050919050565b600060208201905081810360008301526133f4816133b8565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006134576029836129da565b9150613462826133fb565b604082019050919050565b600060208201905081810360008301526134868161344a565b9050919050565b7f6d696e74206d6178206572726f72210000000000000000000000000000000000600082015250565b60006134c3600f836129da565b91506134ce8261348d565b602082019050919050565b600060208201905081810360008301526134f2816134b6565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006135556026836129da565b9150613560826134f9565b604082019050919050565b6000602082019050818103600083015261358481613548565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006135e76025836129da565b91506135f28261358b565b604082019050919050565b60006020820190508181036000830152613616816135da565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006136796024836129da565b91506136848261361d565b604082019050919050565b600060208201905081810360008301526136a88161366c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136e56020836129da565b91506136f0826136af565b602082019050919050565b60006020820190508181036000830152613714816136d8565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006137516019836129da565b915061375c8261371b565b602082019050919050565b6000602082019050818103600083015261378081613744565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006137e36032836129da565b91506137ee82613787565b604082019050919050565b60006020820190508181036000830152613812816137d6565b9050919050565b600081905092915050565b600061382f826129cf565b6138398185613819565b93506138498185602086016129eb565b80840191505092915050565b60006138618285613824565b915061386d8284613824565b91508190509392505050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b60006138d5602e836129da565b91506138e082613879565b604082019050919050565b60006020820190508181036000830152613904816138c8565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261396d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613930565b6139778683613930565b95508019841693508086168417925050509392505050565b6000819050919050565b60006139b46139af6139aa84612a81565b61398f565b612a81565b9050919050565b6000819050919050565b6139ce83613999565b6139e26139da826139bb565b84845461393d565b825550505050565b600090565b6139f76139ea565b613a028184846139c5565b505050565b5b81811015613a2657613a1b6000826139ef565b600181019050613a08565b5050565b601f821115613a6b57613a3c8161390b565b613a4584613920565b81016020851015613a54578190505b613a68613a6085613920565b830182613a07565b50505b505050565b600082821c905092915050565b6000613a8e60001984600802613a70565b1980831691505092915050565b6000613aa78383613a7d565b9150826002028217905092915050565b613ac0826129cf565b67ffffffffffffffff811115613ad957613ad8612ccc565b5b613ae38254613055565b613aee828285613a2a565b600060209050601f831160018114613b215760008415613b0f578287015190505b613b198582613a9b565b865550613b81565b601f198416613b2f8661390b565b60005b82811015613b5757848901518255600182019150602085019450602081019050613b32565b86831015613b745784890151613b70601f891682613a7d565b8355505b6001600288020188555050505b505050505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613bbf6014836129da565b9150613bca82613b89565b602082019050919050565b60006020820190508181036000830152613bee81613bb2565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000613c2b6010836129da565b9150613c3682613bf5565b602082019050919050565b60006020820190508181036000830152613c5a81613c1e565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613c8882613c61565b613c928185613c6c565b9350613ca28185602086016129eb565b613cab81612a15565b840191505092915050565b6000608082019050613ccb6000830187612b16565b613cd86020830186612b16565b613ce56040830185612bac565b8181036060830152613cf78184613c7d565b905095945050505050565b600081519050613d1181612940565b92915050565b600060208284031215613d2d57613d2c61290a565b5b6000613d3b84828501613d02565b91505092915050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000613da06035836129da565b9150613dab82613d44565b604082019050919050565b60006020820190508181036000830152613dcf81613d93565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613e3b6020836129da565b9150613e4682613e05565b602082019050919050565b60006020820190508181036000830152613e6a81613e2e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613ea7601c836129da565b9150613eb282613e71565b602082019050919050565b60006020820190508181036000830152613ed681613e9a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613f1782612a81565b9150613f2283612a81565b9250828203905081811115613f3a57613f39613edd565b5b92915050565b6000613f4b82612a81565b9150613f5683612a81565b9250828201905080821115613f6e57613f6d613edd565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212208b6784801d375aa52b45ab5634844c88116cbea0fab15160d33d378c05f39c7864736f6c63430008120033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101735760003560e01c80636352211e116100de578063a22cb46511610097578063d204c45e11610071578063d204c45e14610424578063e985e9c514610440578063f2fde38b14610470578063fd8839981461048c57610173565b8063a22cb465146103bc578063b88d4fde146103d8578063c87b56dd146103f457610173565b80636352211e1461030c57806370a082311461033c578063715018a61461036c5780638456cb59146103765780638da5cb5b1461038057806395d89b411461039e57610173565b80632f745c59116101305780632f745c591461024c5780633f4ba83a1461027c57806342842e0e1461028657806342966c68146102a25780634f6ccce7146102be5780635c975abb146102ee57610173565b806301ffc9a71461017857806306fdde03146101a8578063081812fc146101c6578063095ea7b3146101f657806318160ddd1461021257806323b872dd14610230575b600080fd5b610192600480360381019061018d919061296c565b6104a8565b60405161019f91906129b4565b60405180910390f35b6101b06104ba565b6040516101bd9190612a5f565b60405180910390f35b6101e060048036038101906101db9190612ab7565b61054c565b6040516101ed9190612b25565b60405180910390f35b610210600480360381019061020b9190612b6c565b610592565b005b61021a6106a9565b6040516102279190612bbb565b60405180910390f35b61024a60048036038101906102459190612bd6565b6106b6565b005b61026660048036038101906102619190612b6c565b610716565b6040516102739190612bbb565b60405180910390f35b6102846107bb565b005b6102a0600480360381019061029b9190612bd6565b6107cd565b005b6102bc60048036038101906102b79190612ab7565b6107ed565b005b6102d860048036038101906102d39190612ab7565b610849565b6040516102e59190612bbb565b60405180910390f35b6102f66108ba565b60405161030391906129b4565b60405180910390f35b61032660048036038101906103219190612ab7565b6108d1565b6040516103339190612b25565b60405180910390f35b61035660048036038101906103519190612c29565b610957565b6040516103639190612bbb565b60405180910390f35b610374610a0e565b005b61037e610a22565b005b610388610a34565b6040516103959190612b25565b60405180910390f35b6103a6610a5e565b6040516103b39190612a5f565b60405180910390f35b6103d660048036038101906103d19190612c82565b610af0565b005b6103f260048036038101906103ed9190612df7565b610b06565b005b61040e60048036038101906104099190612ab7565b610b68565b60405161041b9190612a5f565b60405180910390f35b61043e60048036038101906104399190612f1b565b610b7a565b005b61045a60048036038101906104559190612f77565b610c01565b60405161046791906129b4565b60405180910390f35b61048a60048036038101906104859190612c29565b610c95565b005b6104a660048036038101906104a19190612fb7565b610d18565b005b60006104b382610d7e565b9050919050565b6060600080546104c990613055565b80601f01602080910402602001604051908101604052809291908181526020018280546104f590613055565b80156105425780601f1061051757610100808354040283529160200191610542565b820191906000526020600020905b81548152906001019060200180831161052557829003601f168201915b5050505050905090565b600061055782610df8565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061059d826108d1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361060d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610604906130f8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661062c610e43565b73ffffffffffffffffffffffffffffffffffffffff16148061065b575061065a81610655610e43565b610c01565b5b61069a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106919061318a565b60405180910390fd5b6106a48383610e4b565b505050565b6000600880549050905090565b6106c76106c1610e43565b82610f04565b610706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fd9061321c565b60405180910390fd5b610711838383610f99565b505050565b600061072183610957565b8210610762576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610759906132ae565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6107c3611292565b6107cb611310565b565b6107e883838360405180602001604052806000815250610b06565b505050565b6107fe6107f8610e43565b82610f04565b61083d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108349061321c565b60405180910390fd5b61084681611373565b50565b60006108536106a9565b8210610894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088b90613340565b60405180910390fd5b600882815481106108a8576108a7613360565b5b90600052602060002001549050919050565b6000600b60009054906101000a900460ff16905090565b6000806108dd83611387565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361094e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610945906133db565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109be9061346d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a16611292565b610a2060006113c4565b565b610a2a611292565b610a3261148a565b565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610a6d90613055565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9990613055565b8015610ae65780601f10610abb57610100808354040283529160200191610ae6565b820191906000526020600020905b815481529060010190602001808311610ac957829003601f168201915b5050505050905090565b610b02610afb610e43565b83836114ed565b5050565b610b17610b11610e43565b83610f04565b610b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4d9061321c565b60405180910390fd5b610b6284848484611659565b50505050565b6060610b73826116b5565b9050919050565b610b82611292565b6000610b8e600c6117c7565b9050600d54610b9d600c6117c7565b1115610bde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd5906134d9565b60405180910390fd5b610be8600c6117d5565b610bf283826117eb565b610bfc8183611809565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610c9d611292565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d039061356b565b60405180910390fd5b610d15816113c4565b50565b610d20611292565b600d54811115610d65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5c906134d9565b60405180910390fd5b610d6f83826117eb565b610d798183611809565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610df15750610df082611876565b5b9050919050565b610e0181611958565b610e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e37906133db565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610ebe836108d1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610f10836108d1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610f525750610f518185610c01565b5b80610f9057508373ffffffffffffffffffffffffffffffffffffffff16610f788461054c565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610fb9826108d1565b73ffffffffffffffffffffffffffffffffffffffff161461100f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611006906135fd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361107e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110759061368f565b60405180910390fd5b61108b8383836001611999565b8273ffffffffffffffffffffffffffffffffffffffff166110ab826108d1565b73ffffffffffffffffffffffffffffffffffffffff1614611101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f8906135fd565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461128d83838360016119b3565b505050565b61129a610e43565b73ffffffffffffffffffffffffffffffffffffffff166112b8610a34565b73ffffffffffffffffffffffffffffffffffffffff161461130e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611305906136fb565b60405180910390fd5b565b6113186119b9565b6000600b60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61135c610e43565b6040516113699190612b25565b60405180910390a1565b61137b611292565b61138481611a02565b50565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611492611a55565b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586114d6610e43565b6040516114e39190612b25565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361155b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155290613767565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161164c91906129b4565b60405180910390a3505050565b611664848484610f99565b61167084848484611a9f565b6116af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a6906137f9565b60405180910390fd5b50505050565b60606116c082610df8565b6000600a600084815260200190815260200160002080546116e090613055565b80601f016020809104026020016040519081016040528092919081815260200182805461170c90613055565b80156117595780601f1061172e57610100808354040283529160200191611759565b820191906000526020600020905b81548152906001019060200180831161173c57829003601f168201915b50505050509050600061176a611c26565b9050600081510361177f5781925050506117c2565b6000825111156117b457808260405160200161179c929190613855565b604051602081830303815290604052925050506117c2565b6117bd84611c3d565b925050505b919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b611805828260405180602001604052806000815250611ca5565b5050565b61181282611958565b611851576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611848906138eb565b60405180910390fd5b80600a600084815260200190815260200160002090816118719190613ab7565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061194157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611951575061195082611d00565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff1661197a83611387565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6119a1611a55565b6119ad84848484611d6a565b50505050565b50505050565b6119c16108ba565b611a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f790613bd5565b60405180910390fd5b565b611a0b81611ec8565b6000600a60008381526020019081526020016000208054611a2b90613055565b905014611a5257600a60008281526020019081526020016000206000611a5191906128a3565b5b50565b611a5d6108ba565b15611a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9490613c41565b60405180910390fd5b565b6000611ac08473ffffffffffffffffffffffffffffffffffffffff16612016565b15611c19578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ae9610e43565b8786866040518563ffffffff1660e01b8152600401611b0b9493929190613cb6565b6020604051808303816000875af1925050508015611b4757506040513d601f19601f82011682018060405250810190611b449190613d17565b60015b611bc9573d8060008114611b77576040519150601f19603f3d011682016040523d82523d6000602084013e611b7c565b606091505b506000815103611bc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb8906137f9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611c1e565b600190505b949350505050565b606060405180602001604052806000815250905090565b6060611c4882610df8565b6000611c52611c26565b90506000815111611c725760405180602001604052806000815250611c9d565b80611c7c84612039565b604051602001611c8d929190613855565b6040516020818303038152906040525b915050919050565b611caf8383612107565b611cbc6000848484611a9f565b611cfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf2906137f9565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611d7684848484612324565b6001811115611dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db190613db6565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611e0157611dfc8161244a565b611e40565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614611e3f57611e3e8582612493565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611e8257611e7d81612600565b611ec1565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611ec057611ebf84826126d1565b5b5b5050505050565b6000611ed3826108d1565b9050611ee3816000846001611999565b611eec826108d1565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120128160008460016119b3565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60606000600161204884612750565b01905060008167ffffffffffffffff81111561206757612066612ccc565b5b6040519080825280601f01601f1916602001820160405280156120995781602001600182028036833780820191505090505b509050600082602001820190505b6001156120fc578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816120f0576120ef613dd6565b5b049450600085036120a7575b819350505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216d90613e51565b60405180910390fd5b61217f81611958565b156121bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b690613ebd565b60405180910390fd5b6121cd600083836001611999565b6121d681611958565b15612216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220d90613ebd565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123206000838360016119b3565b5050565b600181111561244457600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146123b85780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123b09190613f0c565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124435780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461243b9190613f40565b925050819055505b5b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016124a084610957565b6124aa9190613f0c565b905060006007600084815260200190815260200160002054905081811461258f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506126149190613f0c565b905060006009600084815260200190815260200160002054905060006008838154811061264457612643613360565b5b90600052602060002001549050806008838154811061266657612665613360565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806126b5576126b4613f74565b5b6001900381819060005260206000200160009055905550505050565b60006126dc83610957565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106127ae577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816127a4576127a3613dd6565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106127eb576d04ee2d6d415b85acef810000000083816127e1576127e0613dd6565b5b0492506020810190505b662386f26fc10000831061281a57662386f26fc1000083816128105761280f613dd6565b5b0492506010810190505b6305f5e1008310612843576305f5e100838161283957612838613dd6565b5b0492506008810190505b612710831061286857612710838161285e5761285d613dd6565b5b0492506004810190505b6064831061288b576064838161288157612880613dd6565b5b0492506002810190505b600a831061289a576001810190505b80915050919050565b5080546128af90613055565b6000825580601f106128c157506128e0565b601f0160209004906000526020600020908101906128df91906128e3565b5b50565b5b808211156128fc5760008160009055506001016128e4565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61294981612914565b811461295457600080fd5b50565b60008135905061296681612940565b92915050565b6000602082840312156129825761298161290a565b5b600061299084828501612957565b91505092915050565b60008115159050919050565b6129ae81612999565b82525050565b60006020820190506129c960008301846129a5565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a095780820151818401526020810190506129ee565b60008484015250505050565b6000601f19601f8301169050919050565b6000612a31826129cf565b612a3b81856129da565b9350612a4b8185602086016129eb565b612a5481612a15565b840191505092915050565b60006020820190508181036000830152612a798184612a26565b905092915050565b6000819050919050565b612a9481612a81565b8114612a9f57600080fd5b50565b600081359050612ab181612a8b565b92915050565b600060208284031215612acd57612acc61290a565b5b6000612adb84828501612aa2565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b0f82612ae4565b9050919050565b612b1f81612b04565b82525050565b6000602082019050612b3a6000830184612b16565b92915050565b612b4981612b04565b8114612b5457600080fd5b50565b600081359050612b6681612b40565b92915050565b60008060408385031215612b8357612b8261290a565b5b6000612b9185828601612b57565b9250506020612ba285828601612aa2565b9150509250929050565b612bb581612a81565b82525050565b6000602082019050612bd06000830184612bac565b92915050565b600080600060608486031215612bef57612bee61290a565b5b6000612bfd86828701612b57565b9350506020612c0e86828701612b57565b9250506040612c1f86828701612aa2565b9150509250925092565b600060208284031215612c3f57612c3e61290a565b5b6000612c4d84828501612b57565b91505092915050565b612c5f81612999565b8114612c6a57600080fd5b50565b600081359050612c7c81612c56565b92915050565b60008060408385031215612c9957612c9861290a565b5b6000612ca785828601612b57565b9250506020612cb885828601612c6d565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612d0482612a15565b810181811067ffffffffffffffff82111715612d2357612d22612ccc565b5b80604052505050565b6000612d36612900565b9050612d428282612cfb565b919050565b600067ffffffffffffffff821115612d6257612d61612ccc565b5b612d6b82612a15565b9050602081019050919050565b82818337600083830152505050565b6000612d9a612d9584612d47565b612d2c565b905082815260208101848484011115612db657612db5612cc7565b5b612dc1848285612d78565b509392505050565b600082601f830112612dde57612ddd612cc2565b5b8135612dee848260208601612d87565b91505092915050565b60008060008060808587031215612e1157612e1061290a565b5b6000612e1f87828801612b57565b9450506020612e3087828801612b57565b9350506040612e4187828801612aa2565b925050606085013567ffffffffffffffff811115612e6257612e6161290f565b5b612e6e87828801612dc9565b91505092959194509250565b600067ffffffffffffffff821115612e9557612e94612ccc565b5b612e9e82612a15565b9050602081019050919050565b6000612ebe612eb984612e7a565b612d2c565b905082815260208101848484011115612eda57612ed9612cc7565b5b612ee5848285612d78565b509392505050565b600082601f830112612f0257612f01612cc2565b5b8135612f12848260208601612eab565b91505092915050565b60008060408385031215612f3257612f3161290a565b5b6000612f4085828601612b57565b925050602083013567ffffffffffffffff811115612f6157612f6061290f565b5b612f6d85828601612eed565b9150509250929050565b60008060408385031215612f8e57612f8d61290a565b5b6000612f9c85828601612b57565b9250506020612fad85828601612b57565b9150509250929050565b600080600060608486031215612fd057612fcf61290a565b5b6000612fde86828701612b57565b935050602084013567ffffffffffffffff811115612fff57612ffe61290f565b5b61300b86828701612eed565b925050604061301c86828701612aa2565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061306d57607f821691505b6020821081036130805761307f613026565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006130e26021836129da565b91506130ed82613086565b604082019050919050565b60006020820190508181036000830152613111816130d5565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613174603d836129da565b915061317f82613118565b604082019050919050565b600060208201905081810360008301526131a381613167565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613206602d836129da565b9150613211826131aa565b604082019050919050565b60006020820190508181036000830152613235816131f9565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613298602b836129da565b91506132a38261323c565b604082019050919050565b600060208201905081810360008301526132c78161328b565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061332a602c836129da565b9150613335826132ce565b604082019050919050565b600060208201905081810360008301526133598161331d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006133c56018836129da565b91506133d08261338f565b602082019050919050565b600060208201905081810360008301526133f4816133b8565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006134576029836129da565b9150613462826133fb565b604082019050919050565b600060208201905081810360008301526134868161344a565b9050919050565b7f6d696e74206d6178206572726f72210000000000000000000000000000000000600082015250565b60006134c3600f836129da565b91506134ce8261348d565b602082019050919050565b600060208201905081810360008301526134f2816134b6565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006135556026836129da565b9150613560826134f9565b604082019050919050565b6000602082019050818103600083015261358481613548565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006135e76025836129da565b91506135f28261358b565b604082019050919050565b60006020820190508181036000830152613616816135da565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006136796024836129da565b91506136848261361d565b604082019050919050565b600060208201905081810360008301526136a88161366c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136e56020836129da565b91506136f0826136af565b602082019050919050565b60006020820190508181036000830152613714816136d8565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006137516019836129da565b915061375c8261371b565b602082019050919050565b6000602082019050818103600083015261378081613744565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006137e36032836129da565b91506137ee82613787565b604082019050919050565b60006020820190508181036000830152613812816137d6565b9050919050565b600081905092915050565b600061382f826129cf565b6138398185613819565b93506138498185602086016129eb565b80840191505092915050565b60006138618285613824565b915061386d8284613824565b91508190509392505050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b60006138d5602e836129da565b91506138e082613879565b604082019050919050565b60006020820190508181036000830152613904816138c8565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261396d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613930565b6139778683613930565b95508019841693508086168417925050509392505050565b6000819050919050565b60006139b46139af6139aa84612a81565b61398f565b612a81565b9050919050565b6000819050919050565b6139ce83613999565b6139e26139da826139bb565b84845461393d565b825550505050565b600090565b6139f76139ea565b613a028184846139c5565b505050565b5b81811015613a2657613a1b6000826139ef565b600181019050613a08565b5050565b601f821115613a6b57613a3c8161390b565b613a4584613920565b81016020851015613a54578190505b613a68613a6085613920565b830182613a07565b50505b505050565b600082821c905092915050565b6000613a8e60001984600802613a70565b1980831691505092915050565b6000613aa78383613a7d565b9150826002028217905092915050565b613ac0826129cf565b67ffffffffffffffff811115613ad957613ad8612ccc565b5b613ae38254613055565b613aee828285613a2a565b600060209050601f831160018114613b215760008415613b0f578287015190505b613b198582613a9b565b865550613b81565b601f198416613b2f8661390b565b60005b82811015613b5757848901518255600182019150602085019450602081019050613b32565b86831015613b745784890151613b70601f891682613a7d565b8355505b6001600288020188555050505b505050505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613bbf6014836129da565b9150613bca82613b89565b602082019050919050565b60006020820190508181036000830152613bee81613bb2565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000613c2b6010836129da565b9150613c3682613bf5565b602082019050919050565b60006020820190508181036000830152613c5a81613c1e565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613c8882613c61565b613c928185613c6c565b9350613ca28185602086016129eb565b613cab81612a15565b840191505092915050565b6000608082019050613ccb6000830187612b16565b613cd86020830186612b16565b613ce56040830185612bac565b8181036060830152613cf78184613c7d565b905095945050505050565b600081519050613d1181612940565b92915050565b600060208284031215613d2d57613d2c61290a565b5b6000613d3b84828501613d02565b91505092915050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000613da06035836129da565b9150613dab82613d44565b604082019050919050565b60006020820190508181036000830152613dcf81613d93565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613e3b6020836129da565b9150613e4682613e05565b602082019050919050565b60006020820190508181036000830152613e6a81613e2e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613ea7601c836129da565b9150613eb282613e71565b602082019050919050565b60006020820190508181036000830152613ed681613e9a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613f1782612a81565b9150613f2283612a81565b9250828203905081811115613f3a57613f39613edd565b5b92915050565b6000613f4b82612a81565b9150613f5683612a81565b9250828201905080821115613f6e57613f6d613edd565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212208b6784801d375aa52b45ab5634844c88116cbea0fab15160d33d378c05f39c7864736f6c63430008120033

Deployed Bytecode Sourcemap

69318:1768:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70871:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36775:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38287:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37805:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54425:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38987:335;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54093:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69665:65;;;:::i;:::-;;39393:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67558:242;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54615:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63346:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36485:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36216:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66207:103;;;:::i;:::-;;69596:61;;;:::i;:::-;;65559:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36944:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38530:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39649:322;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70667:196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69945:314;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38756:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66465:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69738:199;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70871:212;71010:4;71039:36;71063:11;71039:23;:36::i;:::-;71032:43;;70871:212;;;:::o;36775:100::-;36829:13;36862:5;36855:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36775:100;:::o;38287:171::-;38363:7;38383:23;38398:7;38383:14;:23::i;:::-;38426:15;:24;38442:7;38426:24;;;;;;;;;;;;;;;;;;;;;38419:31;;38287:171;;;:::o;37805:416::-;37886:13;37902:23;37917:7;37902:14;:23::i;:::-;37886:39;;37950:5;37944:11;;:2;:11;;;37936:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;38044:5;38028:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;38053:37;38070:5;38077:12;:10;:12::i;:::-;38053:16;:37::i;:::-;38028:62;38006:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;38192:21;38201:2;38205:7;38192:8;:21::i;:::-;37875:346;37805:416;;:::o;54425:113::-;54486:7;54513:10;:17;;;;54506:24;;54425:113;:::o;38987:335::-;39182:41;39201:12;:10;:12::i;:::-;39215:7;39182:18;:41::i;:::-;39174:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;39286:28;39296:4;39302:2;39306:7;39286:9;:28::i;:::-;38987:335;;;:::o;54093:256::-;54190:7;54226:23;54243:5;54226:16;:23::i;:::-;54218:5;:31;54210:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;54315:12;:19;54328:5;54315:19;;;;;;;;;;;;;;;:26;54335:5;54315:26;;;;;;;;;;;;54308:33;;54093:256;;;;:::o;69665:65::-;65445:13;:11;:13::i;:::-;69712:10:::1;:8;:10::i;:::-;69665:65::o:0;39393:185::-;39531:39;39548:4;39554:2;39558:7;39531:39;;;;;;;;;;;;:16;:39::i;:::-;39393:185;;;:::o;67558:242::-;67676:41;67695:12;:10;:12::i;:::-;67709:7;67676:18;:41::i;:::-;67668:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;67778:14;67784:7;67778:5;:14::i;:::-;67558:242;:::o;54615:233::-;54690:7;54726:30;:28;:30::i;:::-;54718:5;:38;54710:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;54823:10;54834:5;54823:17;;;;;;;;:::i;:::-;;;;;;;;;;54816:24;;54615:233;;;:::o;63346:86::-;63393:4;63417:7;;;;;;;;;;;63410:14;;63346:86;:::o;36485:223::-;36557:7;36577:13;36593:17;36602:7;36593:8;:17::i;:::-;36577:33;;36646:1;36629:19;;:5;:19;;;36621:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;36695:5;36688:12;;;36485:223;;;:::o;36216:207::-;36288:7;36333:1;36316:19;;:5;:19;;;36308:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36399:9;:16;36409:5;36399:16;;;;;;;;;;;;;;;;36392:23;;36216:207;;;:::o;66207:103::-;65445:13;:11;:13::i;:::-;66272:30:::1;66299:1;66272:18;:30::i;:::-;66207:103::o:0;69596:61::-;65445:13;:11;:13::i;:::-;69641:8:::1;:6;:8::i;:::-;69596:61::o:0;65559:87::-;65605:7;65632:6;;;;;;;;;;;65625:13;;65559:87;:::o;36944:104::-;37000:13;37033:7;37026:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36944:104;:::o;38530:155::-;38625:52;38644:12;:10;:12::i;:::-;38658:8;38668;38625:18;:52::i;:::-;38530:155;;:::o;39649:322::-;39823:41;39842:12;:10;:12::i;:::-;39856:7;39823:18;:41::i;:::-;39815:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;39925:38;39939:4;39945:2;39949:7;39958:4;39925:13;:38::i;:::-;39649:322;;;;:::o;70667:196::-;70794:13;70832:23;70847:7;70832:14;:23::i;:::-;70825:30;;70667:196;;;:::o;69945:314::-;65445:13;:11;:13::i;:::-;70022:15:::1;70040:25;:15;:23;:25::i;:::-;70022:43;;70113:10;;70084:25;:15;:23;:25::i;:::-;:39;;70076:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;70154:27;:15;:25;:27::i;:::-;70192:22;70202:2;70206:7;70192:9;:22::i;:::-;70225:26;70238:7;70247:3;70225:12;:26::i;:::-;70011:248;69945:314:::0;;:::o;38756:164::-;38853:4;38877:18;:25;38896:5;38877:25;;;;;;;;;;;;;;;:35;38903:8;38877:35;;;;;;;;;;;;;;;;;;;;;;;;;38870:42;;38756:164;;;;:::o;66465:201::-;65445:13;:11;:13::i;:::-;66574:1:::1;66554:22;;:8;:22;;::::0;66546:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;66630:28;66649:8;66630:18;:28::i;:::-;66465:201:::0;:::o;69738:199::-;65445:13;:11;:13::i;:::-;69839:10:::1;;69833:2;:16;;69825:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;69880:17;69890:2;69894;69880:9;:17::i;:::-;69908:21;69921:2;69925:3;69908:12;:21::i;:::-;69738:199:::0;;;:::o;53785:224::-;53887:4;53926:35;53911:50;;;:11;:50;;;;:90;;;;53965:36;53989:11;53965:23;:36::i;:::-;53911:90;53904:97;;53785:224;;;:::o;48106:135::-;48188:16;48196:7;48188;:16::i;:::-;48180:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;48106:135;:::o;18012:98::-;18065:7;18092:10;18085:17;;18012:98;:::o;47385:174::-;47487:2;47460:15;:24;47476:7;47460:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;47543:7;47539:2;47505:46;;47514:23;47529:7;47514:14;:23::i;:::-;47505:46;;;;;;;;;;;;47385:174;;:::o;42004:264::-;42097:4;42114:13;42130:23;42145:7;42130:14;:23::i;:::-;42114:39;;42183:5;42172:16;;:7;:16;;;:52;;;;42192:32;42209:5;42216:7;42192:16;:32::i;:::-;42172:52;:87;;;;42252:7;42228:31;;:20;42240:7;42228:11;:20::i;:::-;:31;;;42172:87;42164:96;;;42004:264;;;;:::o;46003:1263::-;46162:4;46135:31;;:23;46150:7;46135:14;:23::i;:::-;:31;;;46127:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;46241:1;46227:16;;:2;:16;;;46219:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;46297:42;46318:4;46324:2;46328:7;46337:1;46297:20;:42::i;:::-;46469:4;46442:31;;:23;46457:7;46442:14;:23::i;:::-;:31;;;46434:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;46587:15;:24;46603:7;46587:24;;;;;;;;;;;;46580:31;;;;;;;;;;;47082:1;47063:9;:15;47073:4;47063:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;47115:1;47098:9;:13;47108:2;47098:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;47157:2;47138:7;:16;47146:7;47138:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;47196:7;47192:2;47177:27;;47186:4;47177:27;;;;;;;;;;;;47217:41;47237:4;47243:2;47247:7;47256:1;47217:19;:41::i;:::-;46003:1263;;;:::o;65724:132::-;65799:12;:10;:12::i;:::-;65788:23;;:7;:5;:7::i;:::-;:23;;;65780:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65724:132::o;64201:120::-;63210:16;:14;:16::i;:::-;64270:5:::1;64260:7;;:15;;;;;;;;;;;;;;;;;;64291:22;64300:12;:10;:12::i;:::-;64291:22;;;;;;:::i;:::-;;;;;;;;64201:120::o:0;70534:125::-;65445:13;:11;:13::i;:::-;70631:20:::1;70643:7;70631:11;:20::i;:::-;70534:125:::0;:::o;41279:117::-;41345:7;41372;:16;41380:7;41372:16;;;;;;;;;;;;;;;;;;;;;41365:23;;41279:117;;;:::o;66826:191::-;66900:16;66919:6;;;;;;;;;;;66900:25;;66945:8;66936:6;;:17;;;;;;;;;;;;;;;;;;67000:8;66969:40;;66990:8;66969:40;;;;;;;;;;;;66889:128;66826:191;:::o;63942:118::-;62951:19;:17;:19::i;:::-;64012:4:::1;64002:7;;:14;;;;;;;;;;;;;;;;;;64032:20;64039:12;:10;:12::i;:::-;64032:20;;;;;;:::i;:::-;;;;;;;;63942:118::o:0;47702:315::-;47857:8;47848:17;;:5;:17;;;47840:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;47944:8;47906:18;:25;47925:5;47906:25;;;;;;;;;;;;;;;:35;47932:8;47906:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;47990:8;47968:41;;47983:5;47968:41;;;48000:8;47968:41;;;;;;:::i;:::-;;;;;;;;47702:315;;;:::o;40852:313::-;41008:28;41018:4;41024:2;41028:7;41008:9;:28::i;:::-;41055:47;41078:4;41084:2;41088:7;41097:4;41055:22;:47::i;:::-;41047:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;40852:313;;;;:::o;60242:624::-;60315:13;60341:23;60356:7;60341:14;:23::i;:::-;60377;60403:10;:19;60414:7;60403:19;;;;;;;;;;;60377:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60433:18;60454:10;:8;:10::i;:::-;60433:31;;60562:1;60546:4;60540:18;:23;60536:72;;60587:9;60580:16;;;;;;60536:72;60738:1;60718:9;60712:23;:27;60708:108;;;60787:4;60793:9;60770:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60756:48;;;;;;60708:108;60835:23;60850:7;60835:14;:23::i;:::-;60828:30;;;;60242:624;;;;:::o;68677:114::-;68742:7;68769;:14;;;68762:21;;68677:114;;;:::o;68799:127::-;68906:1;68888:7;:14;;;:19;;;;;;;;;;;68799:127;:::o;42610:110::-;42686:26;42696:2;42700:7;42686:26;;;;;;;;;;;;:9;:26::i;:::-;42610:110;;:::o;61022:217::-;61122:16;61130:7;61122;:16::i;:::-;61114:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;61222:9;61200:10;:19;61211:7;61200:19;;;;;;;;;;;:31;;;;;;:::i;:::-;;61022:217;;:::o;35847:305::-;35949:4;36001:25;35986:40;;;:11;:40;;;;:105;;;;36058:33;36043:48;;;:11;:48;;;;35986:105;:158;;;;36108:36;36132:11;36108:23;:36::i;:::-;35986:158;35966:178;;35847:305;;;:::o;41709:128::-;41774:4;41827:1;41798:31;;:17;41807:7;41798:8;:17::i;:::-;:31;;;;41791:38;;41709:128;;;:::o;70267:257::-;62951:19;:17;:19::i;:::-;70460:56:::1;70487:4;70493:2;70497:7;70506:9;70460:26;:56::i;:::-;70267:257:::0;;;;:::o;51522:158::-;;;;;:::o;63690:108::-;63757:8;:6;:8::i;:::-;63749:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;63690:108::o;61464:206::-;61533:20;61545:7;61533:11;:20::i;:::-;61607:1;61576:10;:19;61587:7;61576:19;;;;;;;;;;;61570:33;;;;;:::i;:::-;;;:38;61566:97;;61632:10;:19;61643:7;61632:19;;;;;;;;;;;;61625:26;;;;:::i;:::-;61566:97;61464:206;:::o;63505:108::-;63576:8;:6;:8::i;:::-;63575:9;63567:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;63505:108::o;48805:853::-;48959:4;48980:15;:2;:13;;;:15::i;:::-;48976:675;;;49032:2;49016:36;;;49053:12;:10;:12::i;:::-;49067:4;49073:7;49082:4;49016:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;49012:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49274:1;49257:6;:13;:18;49253:328;;49300:60;;;;;;;;;;:::i;:::-;;;;;;;;49253:328;49531:6;49525:13;49516:6;49512:2;49508:15;49501:38;49012:584;49148:41;;;49138:51;;;:6;:51;;;;49131:58;;;;;48976:675;49635:4;49628:11;;48805:853;;;;;;;:::o;37649:94::-;37700:13;37726:9;;;;;;;;;;;;;;37649:94;:::o;37119:281::-;37192:13;37218:23;37233:7;37218:14;:23::i;:::-;37254:21;37278:10;:8;:10::i;:::-;37254:34;;37330:1;37312:7;37306:21;:25;:86;;;;;;;;;;;;;;;;;37358:7;37367:18;:7;:16;:18::i;:::-;37341:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37306:86;37299:93;;;37119:281;;;:::o;42947:319::-;43076:18;43082:2;43086:7;43076:5;:18::i;:::-;43127:53;43158:1;43162:2;43166:7;43175:4;43127:22;:53::i;:::-;43105:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;42947:319;;;:::o;34280:157::-;34365:4;34404:25;34389:40;;;:11;:40;;;;34382:47;;34280:157;;;:::o;54922:915::-;55099:61;55126:4;55132:2;55136:12;55150:9;55099:26;:61::i;:::-;55189:1;55177:9;:13;55173:222;;;55320:63;;;;;;;;;;:::i;:::-;;;;;;;;55173:222;55407:15;55425:12;55407:30;;55470:1;55454:18;;:4;:18;;;55450:187;;55489:40;55521:7;55489:31;:40::i;:::-;55450:187;;;55559:2;55551:10;;:4;:10;;;55547:90;;55578:47;55611:4;55617:7;55578:32;:47::i;:::-;55547:90;55450:187;55665:1;55651:16;;:2;:16;;;55647:183;;55684:45;55721:7;55684:36;:45::i;:::-;55647:183;;;55757:4;55751:10;;:2;:10;;;55747:83;;55778:40;55806:2;55810:7;55778:27;:40::i;:::-;55747:83;55647:183;55088:749;54922:915;;;;:::o;44883:783::-;44943:13;44959:23;44974:7;44959:14;:23::i;:::-;44943:39;;44995:51;45016:5;45031:1;45035:7;45044:1;44995:20;:51::i;:::-;45159:23;45174:7;45159:14;:23::i;:::-;45151:31;;45230:15;:24;45246:7;45230:24;;;;;;;;;;;;45223:31;;;;;;;;;;;45495:1;45475:9;:16;45485:5;45475:16;;;;;;;;;;;;;;;;:21;;;;;;;;;;;45525:7;:16;45533:7;45525:16;;;;;;;;;;;;45518:23;;;;;;;;;;;45587:7;45583:1;45559:36;;45568:5;45559:36;;;;;;;;;;;;45608:50;45628:5;45643:1;45647:7;45656:1;45608:19;:50::i;:::-;44932:734;44883:783;:::o;9140:326::-;9200:4;9457:1;9435:7;:19;;;:23;9428:30;;9140:326;;;:::o;31525:716::-;31581:13;31632:14;31669:1;31649:17;31660:5;31649:10;:17::i;:::-;:21;31632:38;;31685:20;31719:6;31708:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31685:41;;31741:11;31870:6;31866:2;31862:15;31854:6;31850:28;31843:35;;31907:288;31914:4;31907:288;;;31939:5;;;;;;;;32081:8;32076:2;32069:5;32065:14;32060:30;32055:3;32047:44;32137:2;32128:11;;;;;;:::i;:::-;;;;;32171:1;32162:5;:10;31907:288;32158:21;31907:288;32216:6;32209:13;;;;;31525:716;;;:::o;43602:942::-;43696:1;43682:16;;:2;:16;;;43674:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;43755:16;43763:7;43755;:16::i;:::-;43754:17;43746:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;43817:48;43846:1;43850:2;43854:7;43863:1;43817:20;:48::i;:::-;43964:16;43972:7;43964;:16::i;:::-;43963:17;43955:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;44379:1;44362:9;:13;44372:2;44362:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;44423:2;44404:7;:16;44412:7;44404:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;44468:7;44464:2;44443:33;;44460:1;44443:33;;;;;;;;;;;;44489:47;44517:1;44521:2;44525:7;44534:1;44489:19;:47::i;:::-;43602:942;;:::o;50390:410::-;50580:1;50568:9;:13;50564:229;;;50618:1;50602:18;;:4;:18;;;50598:87;;50660:9;50641;:15;50651:4;50641:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;50598:87;50717:1;50703:16;;:2;:16;;;50699:83;;50757:9;50740;:13;50750:2;50740:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;50699:83;50564:229;50390:410;;;;:::o;56560:164::-;56664:10;:17;;;;56637:15;:24;56653:7;56637:24;;;;;;;;;;;:44;;;;56692:10;56708:7;56692:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56560:164;:::o;57351:988::-;57617:22;57667:1;57642:22;57659:4;57642:16;:22::i;:::-;:26;;;;:::i;:::-;57617:51;;57679:18;57700:17;:26;57718:7;57700:26;;;;;;;;;;;;57679:47;;57847:14;57833:10;:28;57829:328;;57878:19;57900:12;:18;57913:4;57900:18;;;;;;;;;;;;;;;:34;57919:14;57900:34;;;;;;;;;;;;57878:56;;57984:11;57951:12;:18;57964:4;57951:18;;;;;;;;;;;;;;;:30;57970:10;57951:30;;;;;;;;;;;:44;;;;58101:10;58068:17;:30;58086:11;58068:30;;;;;;;;;;;:43;;;;57863:294;57829:328;58253:17;:26;58271:7;58253:26;;;;;;;;;;;58246:33;;;58297:12;:18;58310:4;58297:18;;;;;;;;;;;;;;;:34;58316:14;58297:34;;;;;;;;;;;58290:41;;;57432:907;;57351:988;;:::o;58634:1079::-;58887:22;58932:1;58912:10;:17;;;;:21;;;;:::i;:::-;58887:46;;58944:18;58965:15;:24;58981:7;58965:24;;;;;;;;;;;;58944:45;;59316:19;59338:10;59349:14;59338:26;;;;;;;;:::i;:::-;;;;;;;;;;59316:48;;59402:11;59377:10;59388;59377:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;59513:10;59482:15;:28;59498:11;59482:28;;;;;;;;;;;:41;;;;59654:15;:24;59670:7;59654:24;;;;;;;;;;;59647:31;;;59689:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;58705:1008;;;58634:1079;:::o;56138:221::-;56223:14;56240:20;56257:2;56240:16;:20::i;:::-;56223:37;;56298:7;56271:12;:16;56284:2;56271:16;;;;;;;;;;;;;;;:24;56288:6;56271:24;;;;;;;;;;;:34;;;;56345:6;56316:17;:26;56334:7;56316:26;;;;;;;;;;;:35;;;;56212:147;56138:221;;:::o;28395:922::-;28448:7;28468:14;28485:1;28468:18;;28535:6;28526:5;:15;28522:102;;28571:6;28562:15;;;;;;:::i;:::-;;;;;28606:2;28596:12;;;;28522:102;28651:6;28642:5;:15;28638:102;;28687:6;28678:15;;;;;;:::i;:::-;;;;;28722:2;28712:12;;;;28638:102;28767:6;28758:5;:15;28754:102;;28803:6;28794:15;;;;;;:::i;:::-;;;;;28838:2;28828:12;;;;28754:102;28883:5;28874;:14;28870:99;;28918:5;28909:14;;;;;;:::i;:::-;;;;;28952:1;28942:11;;;;28870:99;28996:5;28987;:14;28983:99;;29031:5;29022:14;;;;;;:::i;:::-;;;;;29065:1;29055:11;;;;28983:99;29109:5;29100;:14;29096:99;;29144:5;29135:14;;;;;;:::i;:::-;;;;;29178:1;29168:11;;;;29096:99;29222:5;29213;:14;29209:66;;29258:1;29248:11;;;;29209:66;29303:6;29296:13;;;28395:922;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::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:329::-;5926:6;5975:2;5963:9;5954:7;5950:23;5946:32;5943:119;;;5981:79;;:::i;:::-;5943:119;6101:1;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6072:117;5867:329;;;;:::o;6202:116::-;6272:21;6287:5;6272:21;:::i;:::-;6265:5;6262:32;6252:60;;6308:1;6305;6298:12;6252:60;6202:116;:::o;6324:133::-;6367:5;6405:6;6392:20;6383:29;;6421:30;6445:5;6421:30;:::i;:::-;6324:133;;;;:::o;6463:468::-;6528:6;6536;6585:2;6573:9;6564:7;6560:23;6556:32;6553:119;;;6591:79;;:::i;:::-;6553:119;6711:1;6736:53;6781:7;6772:6;6761:9;6757:22;6736:53;:::i;:::-;6726:63;;6682:117;6838:2;6864:50;6906:7;6897:6;6886:9;6882:22;6864:50;:::i;:::-;6854:60;;6809:115;6463:468;;;;;:::o;6937:117::-;7046:1;7043;7036:12;7060:117;7169:1;7166;7159:12;7183:180;7231:77;7228:1;7221:88;7328:4;7325:1;7318:15;7352:4;7349:1;7342:15;7369:281;7452:27;7474:4;7452:27;:::i;:::-;7444:6;7440:40;7582:6;7570:10;7567:22;7546:18;7534:10;7531:34;7528:62;7525:88;;;7593:18;;:::i;:::-;7525:88;7633:10;7629:2;7622:22;7412:238;7369:281;;:::o;7656:129::-;7690:6;7717:20;;:::i;:::-;7707:30;;7746:33;7774:4;7766:6;7746:33;:::i;:::-;7656:129;;;:::o;7791:307::-;7852:4;7942:18;7934:6;7931:30;7928:56;;;7964:18;;:::i;:::-;7928:56;8002:29;8024:6;8002:29;:::i;:::-;7994:37;;8086:4;8080;8076:15;8068:23;;7791:307;;;:::o;8104:146::-;8201:6;8196:3;8191;8178:30;8242:1;8233:6;8228:3;8224:16;8217:27;8104:146;;;:::o;8256:423::-;8333:5;8358:65;8374:48;8415:6;8374:48;:::i;:::-;8358:65;:::i;:::-;8349:74;;8446:6;8439:5;8432:21;8484:4;8477:5;8473:16;8522:3;8513:6;8508:3;8504:16;8501:25;8498:112;;;8529:79;;:::i;:::-;8498:112;8619:54;8666:6;8661:3;8656;8619:54;:::i;:::-;8339:340;8256:423;;;;;:::o;8698:338::-;8753:5;8802:3;8795:4;8787:6;8783:17;8779:27;8769:122;;8810:79;;:::i;:::-;8769:122;8927:6;8914:20;8952:78;9026:3;9018:6;9011:4;9003:6;8999:17;8952:78;:::i;:::-;8943:87;;8759:277;8698:338;;;;:::o;9042:943::-;9137:6;9145;9153;9161;9210:3;9198:9;9189:7;9185:23;9181:33;9178:120;;;9217:79;;:::i;:::-;9178:120;9337:1;9362:53;9407:7;9398:6;9387:9;9383:22;9362:53;:::i;:::-;9352:63;;9308:117;9464:2;9490:53;9535:7;9526:6;9515:9;9511:22;9490:53;:::i;:::-;9480:63;;9435:118;9592:2;9618:53;9663:7;9654:6;9643:9;9639:22;9618:53;:::i;:::-;9608:63;;9563:118;9748:2;9737:9;9733:18;9720:32;9779:18;9771:6;9768:30;9765:117;;;9801:79;;:::i;:::-;9765:117;9906:62;9960:7;9951:6;9940:9;9936:22;9906:62;:::i;:::-;9896:72;;9691:287;9042:943;;;;;;;:::o;9991:308::-;10053:4;10143:18;10135:6;10132:30;10129:56;;;10165:18;;:::i;:::-;10129:56;10203:29;10225:6;10203:29;:::i;:::-;10195:37;;10287:4;10281;10277:15;10269:23;;9991:308;;;:::o;10305:425::-;10383:5;10408:66;10424:49;10466:6;10424:49;:::i;:::-;10408:66;:::i;:::-;10399:75;;10497:6;10490:5;10483:21;10535:4;10528:5;10524:16;10573:3;10564:6;10559:3;10555:16;10552:25;10549:112;;;10580:79;;:::i;:::-;10549:112;10670:54;10717:6;10712:3;10707;10670:54;:::i;:::-;10389:341;10305:425;;;;;:::o;10750:340::-;10806:5;10855:3;10848:4;10840:6;10836:17;10832:27;10822:122;;10863:79;;:::i;:::-;10822:122;10980:6;10967:20;11005:79;11080:3;11072:6;11065:4;11057:6;11053:17;11005:79;:::i;:::-;10996:88;;10812:278;10750:340;;;;:::o;11096:654::-;11174:6;11182;11231:2;11219:9;11210:7;11206:23;11202:32;11199:119;;;11237:79;;:::i;:::-;11199:119;11357:1;11382:53;11427:7;11418:6;11407:9;11403:22;11382:53;:::i;:::-;11372:63;;11328:117;11512:2;11501:9;11497:18;11484:32;11543:18;11535:6;11532:30;11529:117;;;11565:79;;:::i;:::-;11529:117;11670:63;11725:7;11716:6;11705:9;11701:22;11670:63;:::i;:::-;11660:73;;11455:288;11096:654;;;;;:::o;11756:474::-;11824:6;11832;11881:2;11869:9;11860:7;11856:23;11852:32;11849:119;;;11887:79;;:::i;:::-;11849:119;12007:1;12032:53;12077:7;12068:6;12057:9;12053:22;12032:53;:::i;:::-;12022:63;;11978:117;12134:2;12160:53;12205:7;12196:6;12185:9;12181:22;12160:53;:::i;:::-;12150:63;;12105:118;11756:474;;;;;:::o;12236:799::-;12323:6;12331;12339;12388:2;12376:9;12367:7;12363:23;12359:32;12356:119;;;12394:79;;:::i;:::-;12356:119;12514:1;12539:53;12584:7;12575:6;12564:9;12560:22;12539:53;:::i;:::-;12529:63;;12485:117;12669:2;12658:9;12654:18;12641:32;12700:18;12692:6;12689:30;12686:117;;;12722:79;;:::i;:::-;12686:117;12827:63;12882:7;12873:6;12862:9;12858:22;12827:63;:::i;:::-;12817:73;;12612:288;12939:2;12965:53;13010:7;13001:6;12990:9;12986:22;12965:53;:::i;:::-;12955:63;;12910:118;12236:799;;;;;:::o;13041:180::-;13089:77;13086:1;13079:88;13186:4;13183:1;13176:15;13210:4;13207:1;13200:15;13227:320;13271:6;13308:1;13302:4;13298:12;13288:22;;13355:1;13349:4;13345:12;13376:18;13366:81;;13432:4;13424:6;13420:17;13410:27;;13366:81;13494:2;13486:6;13483:14;13463:18;13460:38;13457:84;;13513:18;;:::i;:::-;13457:84;13278:269;13227:320;;;:::o;13553:220::-;13693:34;13689:1;13681:6;13677:14;13670:58;13762:3;13757:2;13749:6;13745:15;13738:28;13553:220;:::o;13779:366::-;13921:3;13942:67;14006:2;14001:3;13942:67;:::i;:::-;13935:74;;14018:93;14107:3;14018:93;:::i;:::-;14136:2;14131:3;14127:12;14120:19;;13779:366;;;:::o;14151:419::-;14317:4;14355:2;14344:9;14340:18;14332:26;;14404:9;14398:4;14394:20;14390:1;14379:9;14375:17;14368:47;14432:131;14558:4;14432:131;:::i;:::-;14424:139;;14151:419;;;:::o;14576:248::-;14716:34;14712:1;14704:6;14700:14;14693:58;14785:31;14780:2;14772:6;14768:15;14761:56;14576:248;:::o;14830:366::-;14972:3;14993:67;15057:2;15052:3;14993:67;:::i;:::-;14986:74;;15069:93;15158:3;15069:93;:::i;:::-;15187:2;15182:3;15178:12;15171:19;;14830:366;;;:::o;15202:419::-;15368:4;15406:2;15395:9;15391:18;15383:26;;15455:9;15449:4;15445:20;15441:1;15430:9;15426:17;15419:47;15483:131;15609:4;15483:131;:::i;:::-;15475:139;;15202:419;;;:::o;15627:232::-;15767:34;15763:1;15755:6;15751:14;15744:58;15836:15;15831:2;15823:6;15819:15;15812:40;15627:232;:::o;15865:366::-;16007:3;16028:67;16092:2;16087:3;16028:67;:::i;:::-;16021:74;;16104:93;16193:3;16104:93;:::i;:::-;16222:2;16217:3;16213:12;16206:19;;15865:366;;;:::o;16237:419::-;16403:4;16441:2;16430:9;16426:18;16418:26;;16490:9;16484:4;16480:20;16476:1;16465:9;16461:17;16454:47;16518:131;16644:4;16518:131;:::i;:::-;16510:139;;16237:419;;;:::o;16662:230::-;16802:34;16798:1;16790:6;16786:14;16779:58;16871:13;16866:2;16858:6;16854:15;16847:38;16662:230;:::o;16898:366::-;17040:3;17061:67;17125:2;17120:3;17061:67;:::i;:::-;17054:74;;17137:93;17226:3;17137:93;:::i;:::-;17255:2;17250:3;17246:12;17239:19;;16898:366;;;:::o;17270:419::-;17436:4;17474:2;17463:9;17459:18;17451:26;;17523:9;17517:4;17513:20;17509:1;17498:9;17494:17;17487:47;17551:131;17677:4;17551:131;:::i;:::-;17543:139;;17270:419;;;:::o;17695:231::-;17835:34;17831:1;17823:6;17819:14;17812:58;17904:14;17899:2;17891:6;17887:15;17880:39;17695:231;:::o;17932:366::-;18074:3;18095:67;18159:2;18154:3;18095:67;:::i;:::-;18088:74;;18171:93;18260:3;18171:93;:::i;:::-;18289:2;18284:3;18280:12;18273:19;;17932:366;;;:::o;18304:419::-;18470:4;18508:2;18497:9;18493:18;18485:26;;18557:9;18551:4;18547:20;18543:1;18532:9;18528:17;18521:47;18585:131;18711:4;18585:131;:::i;:::-;18577:139;;18304:419;;;:::o;18729:180::-;18777:77;18774:1;18767:88;18874:4;18871:1;18864:15;18898:4;18895:1;18888:15;18915:174;19055:26;19051:1;19043:6;19039:14;19032:50;18915:174;:::o;19095:366::-;19237:3;19258:67;19322:2;19317:3;19258:67;:::i;:::-;19251:74;;19334:93;19423:3;19334:93;:::i;:::-;19452:2;19447:3;19443:12;19436:19;;19095:366;;;:::o;19467:419::-;19633:4;19671:2;19660:9;19656:18;19648:26;;19720:9;19714:4;19710:20;19706:1;19695:9;19691:17;19684:47;19748:131;19874:4;19748:131;:::i;:::-;19740:139;;19467:419;;;:::o;19892:228::-;20032:34;20028:1;20020:6;20016:14;20009:58;20101:11;20096:2;20088:6;20084:15;20077:36;19892:228;:::o;20126:366::-;20268:3;20289:67;20353:2;20348:3;20289:67;:::i;:::-;20282:74;;20365:93;20454:3;20365:93;:::i;:::-;20483:2;20478:3;20474:12;20467:19;;20126:366;;;:::o;20498:419::-;20664:4;20702:2;20691:9;20687:18;20679:26;;20751:9;20745:4;20741:20;20737:1;20726:9;20722:17;20715:47;20779:131;20905:4;20779:131;:::i;:::-;20771:139;;20498:419;;;:::o;20923:165::-;21063:17;21059:1;21051:6;21047:14;21040:41;20923:165;:::o;21094:366::-;21236:3;21257:67;21321:2;21316:3;21257:67;:::i;:::-;21250:74;;21333:93;21422:3;21333:93;:::i;:::-;21451:2;21446:3;21442:12;21435:19;;21094:366;;;:::o;21466:419::-;21632:4;21670:2;21659:9;21655:18;21647:26;;21719:9;21713:4;21709:20;21705:1;21694:9;21690:17;21683:47;21747:131;21873:4;21747:131;:::i;:::-;21739:139;;21466:419;;;:::o;21891:225::-;22031:34;22027:1;22019:6;22015:14;22008:58;22100:8;22095:2;22087:6;22083:15;22076:33;21891:225;:::o;22122:366::-;22264:3;22285:67;22349:2;22344:3;22285:67;:::i;:::-;22278:74;;22361:93;22450:3;22361:93;:::i;:::-;22479:2;22474:3;22470:12;22463:19;;22122:366;;;:::o;22494:419::-;22660:4;22698:2;22687:9;22683:18;22675:26;;22747:9;22741:4;22737:20;22733:1;22722:9;22718:17;22711:47;22775:131;22901:4;22775:131;:::i;:::-;22767:139;;22494:419;;;:::o;22919:224::-;23059:34;23055:1;23047:6;23043:14;23036:58;23128:7;23123:2;23115:6;23111:15;23104:32;22919:224;:::o;23149:366::-;23291:3;23312:67;23376:2;23371:3;23312:67;:::i;:::-;23305:74;;23388:93;23477:3;23388:93;:::i;:::-;23506:2;23501:3;23497:12;23490:19;;23149:366;;;:::o;23521:419::-;23687:4;23725:2;23714:9;23710:18;23702:26;;23774:9;23768:4;23764:20;23760:1;23749:9;23745:17;23738:47;23802:131;23928:4;23802:131;:::i;:::-;23794:139;;23521:419;;;:::o;23946:223::-;24086:34;24082:1;24074:6;24070:14;24063:58;24155:6;24150:2;24142:6;24138:15;24131:31;23946:223;:::o;24175:366::-;24317:3;24338:67;24402:2;24397:3;24338:67;:::i;:::-;24331:74;;24414:93;24503:3;24414:93;:::i;:::-;24532:2;24527:3;24523:12;24516:19;;24175:366;;;:::o;24547:419::-;24713:4;24751:2;24740:9;24736:18;24728:26;;24800:9;24794:4;24790:20;24786:1;24775:9;24771:17;24764:47;24828:131;24954:4;24828:131;:::i;:::-;24820:139;;24547:419;;;:::o;24972:182::-;25112:34;25108:1;25100:6;25096:14;25089:58;24972:182;:::o;25160:366::-;25302:3;25323:67;25387:2;25382:3;25323:67;:::i;:::-;25316:74;;25399:93;25488:3;25399:93;:::i;:::-;25517:2;25512:3;25508:12;25501:19;;25160:366;;;:::o;25532:419::-;25698:4;25736:2;25725:9;25721:18;25713:26;;25785:9;25779:4;25775:20;25771:1;25760:9;25756:17;25749:47;25813:131;25939:4;25813:131;:::i;:::-;25805:139;;25532:419;;;:::o;25957:175::-;26097:27;26093:1;26085:6;26081:14;26074:51;25957:175;:::o;26138:366::-;26280:3;26301:67;26365:2;26360:3;26301:67;:::i;:::-;26294:74;;26377:93;26466:3;26377:93;:::i;:::-;26495:2;26490:3;26486:12;26479:19;;26138:366;;;:::o;26510:419::-;26676:4;26714:2;26703:9;26699:18;26691:26;;26763:9;26757:4;26753:20;26749:1;26738:9;26734:17;26727:47;26791:131;26917:4;26791:131;:::i;:::-;26783:139;;26510:419;;;:::o;26935:237::-;27075:34;27071:1;27063:6;27059:14;27052:58;27144:20;27139:2;27131:6;27127:15;27120:45;26935:237;:::o;27178:366::-;27320:3;27341:67;27405:2;27400:3;27341:67;:::i;:::-;27334:74;;27417:93;27506:3;27417:93;:::i;:::-;27535:2;27530:3;27526:12;27519:19;;27178:366;;;:::o;27550:419::-;27716:4;27754:2;27743:9;27739:18;27731:26;;27803:9;27797:4;27793:20;27789:1;27778:9;27774:17;27767:47;27831:131;27957:4;27831:131;:::i;:::-;27823:139;;27550:419;;;:::o;27975:148::-;28077:11;28114:3;28099:18;;27975:148;;;;:::o;28129:390::-;28235:3;28263:39;28296:5;28263:39;:::i;:::-;28318:89;28400:6;28395:3;28318:89;:::i;:::-;28311:96;;28416:65;28474:6;28469:3;28462:4;28455:5;28451:16;28416:65;:::i;:::-;28506:6;28501:3;28497:16;28490:23;;28239:280;28129:390;;;;:::o;28525:435::-;28705:3;28727:95;28818:3;28809:6;28727:95;:::i;:::-;28720:102;;28839:95;28930:3;28921:6;28839:95;:::i;:::-;28832:102;;28951:3;28944:10;;28525:435;;;;;:::o;28966:233::-;29106:34;29102:1;29094:6;29090:14;29083:58;29175:16;29170:2;29162:6;29158:15;29151:41;28966:233;:::o;29205:366::-;29347:3;29368:67;29432:2;29427:3;29368:67;:::i;:::-;29361:74;;29444:93;29533:3;29444:93;:::i;:::-;29562:2;29557:3;29553:12;29546:19;;29205:366;;;:::o;29577:419::-;29743:4;29781:2;29770:9;29766:18;29758:26;;29830:9;29824:4;29820:20;29816:1;29805:9;29801:17;29794:47;29858:131;29984:4;29858:131;:::i;:::-;29850:139;;29577:419;;;:::o;30002:141::-;30051:4;30074:3;30066:11;;30097:3;30094:1;30087:14;30131:4;30128:1;30118:18;30110:26;;30002:141;;;:::o;30149:93::-;30186:6;30233:2;30228;30221:5;30217:14;30213:23;30203:33;;30149:93;;;:::o;30248:107::-;30292:8;30342:5;30336:4;30332:16;30311:37;;30248:107;;;;:::o;30361:393::-;30430:6;30480:1;30468:10;30464:18;30503:97;30533:66;30522:9;30503:97;:::i;:::-;30621:39;30651:8;30640:9;30621:39;:::i;:::-;30609:51;;30693:4;30689:9;30682:5;30678:21;30669:30;;30742:4;30732:8;30728:19;30721:5;30718:30;30708:40;;30437:317;;30361:393;;;;;:::o;30760:60::-;30788:3;30809:5;30802:12;;30760:60;;;:::o;30826:142::-;30876:9;30909:53;30927:34;30936:24;30954:5;30936:24;:::i;:::-;30927:34;:::i;:::-;30909:53;:::i;:::-;30896:66;;30826:142;;;:::o;30974:75::-;31017:3;31038:5;31031:12;;30974:75;;;:::o;31055:269::-;31165:39;31196:7;31165:39;:::i;:::-;31226:91;31275:41;31299:16;31275:41;:::i;:::-;31267:6;31260:4;31254:11;31226:91;:::i;:::-;31220:4;31213:105;31131:193;31055:269;;;:::o;31330:73::-;31375:3;31330:73;:::o;31409:189::-;31486:32;;:::i;:::-;31527:65;31585:6;31577;31571:4;31527:65;:::i;:::-;31462:136;31409:189;;:::o;31604:186::-;31664:120;31681:3;31674:5;31671:14;31664:120;;;31735:39;31772:1;31765:5;31735:39;:::i;:::-;31708:1;31701:5;31697:13;31688:22;;31664:120;;;31604:186;;:::o;31796:543::-;31897:2;31892:3;31889:11;31886:446;;;31931:38;31963:5;31931:38;:::i;:::-;32015:29;32033:10;32015:29;:::i;:::-;32005:8;32001:44;32198:2;32186:10;32183:18;32180:49;;;32219:8;32204:23;;32180:49;32242:80;32298:22;32316:3;32298:22;:::i;:::-;32288:8;32284:37;32271:11;32242:80;:::i;:::-;31901:431;;31886:446;31796:543;;;:::o;32345:117::-;32399:8;32449:5;32443:4;32439:16;32418:37;;32345:117;;;;:::o;32468:169::-;32512:6;32545:51;32593:1;32589:6;32581:5;32578:1;32574:13;32545:51;:::i;:::-;32541:56;32626:4;32620;32616:15;32606:25;;32519:118;32468:169;;;;:::o;32642:295::-;32718:4;32864:29;32889:3;32883:4;32864:29;:::i;:::-;32856:37;;32926:3;32923:1;32919:11;32913:4;32910:21;32902:29;;32642:295;;;;:::o;32942:1395::-;33059:37;33092:3;33059:37;:::i;:::-;33161:18;33153:6;33150:30;33147:56;;;33183:18;;:::i;:::-;33147:56;33227:38;33259:4;33253:11;33227:38;:::i;:::-;33312:67;33372:6;33364;33358:4;33312:67;:::i;:::-;33406:1;33430:4;33417:17;;33462:2;33454:6;33451:14;33479:1;33474:618;;;;34136:1;34153:6;34150:77;;;34202:9;34197:3;34193:19;34187:26;34178:35;;34150:77;34253:67;34313:6;34306:5;34253:67;:::i;:::-;34247:4;34240:81;34109:222;33444:887;;33474:618;33526:4;33522:9;33514:6;33510:22;33560:37;33592:4;33560:37;:::i;:::-;33619:1;33633:208;33647:7;33644:1;33641:14;33633:208;;;33726:9;33721:3;33717:19;33711:26;33703:6;33696:42;33777:1;33769:6;33765:14;33755:24;;33824:2;33813:9;33809:18;33796:31;;33670:4;33667:1;33663:12;33658:17;;33633:208;;;33869:6;33860:7;33857:19;33854:179;;;33927:9;33922:3;33918:19;33912:26;33970:48;34012:4;34004:6;34000:17;33989:9;33970:48;:::i;:::-;33962:6;33955:64;33877:156;33854:179;34079:1;34075;34067:6;34063:14;34059:22;34053:4;34046:36;33481:611;;;33444:887;;33034:1303;;;32942:1395;;:::o;34343:170::-;34483:22;34479:1;34471:6;34467:14;34460:46;34343:170;:::o;34519:366::-;34661:3;34682:67;34746:2;34741:3;34682:67;:::i;:::-;34675:74;;34758:93;34847:3;34758:93;:::i;:::-;34876:2;34871:3;34867:12;34860:19;;34519:366;;;:::o;34891:419::-;35057:4;35095:2;35084:9;35080:18;35072:26;;35144:9;35138:4;35134:20;35130:1;35119:9;35115:17;35108:47;35172:131;35298:4;35172:131;:::i;:::-;35164:139;;34891:419;;;:::o;35316:166::-;35456:18;35452:1;35444:6;35440:14;35433:42;35316:166;:::o;35488:366::-;35630:3;35651:67;35715:2;35710:3;35651:67;:::i;:::-;35644:74;;35727:93;35816:3;35727:93;:::i;:::-;35845:2;35840:3;35836:12;35829:19;;35488:366;;;:::o;35860:419::-;36026:4;36064:2;36053:9;36049:18;36041:26;;36113:9;36107:4;36103:20;36099:1;36088:9;36084:17;36077:47;36141:131;36267:4;36141:131;:::i;:::-;36133:139;;35860:419;;;:::o;36285:98::-;36336:6;36370:5;36364:12;36354:22;;36285:98;;;:::o;36389:168::-;36472:11;36506:6;36501:3;36494:19;36546:4;36541:3;36537:14;36522:29;;36389:168;;;;:::o;36563:373::-;36649:3;36677:38;36709:5;36677:38;:::i;:::-;36731:70;36794:6;36789:3;36731:70;:::i;:::-;36724:77;;36810:65;36868:6;36863:3;36856:4;36849:5;36845:16;36810:65;:::i;:::-;36900:29;36922:6;36900:29;:::i;:::-;36895:3;36891:39;36884:46;;36653:283;36563:373;;;;:::o;36942:640::-;37137:4;37175:3;37164:9;37160:19;37152:27;;37189:71;37257:1;37246:9;37242:17;37233:6;37189:71;:::i;:::-;37270:72;37338:2;37327:9;37323:18;37314:6;37270:72;:::i;:::-;37352;37420:2;37409:9;37405:18;37396:6;37352:72;:::i;:::-;37471:9;37465:4;37461:20;37456:2;37445:9;37441:18;37434:48;37499:76;37570:4;37561:6;37499:76;:::i;:::-;37491:84;;36942:640;;;;;;;:::o;37588:141::-;37644:5;37675:6;37669:13;37660:22;;37691:32;37717:5;37691:32;:::i;:::-;37588:141;;;;:::o;37735:349::-;37804:6;37853:2;37841:9;37832:7;37828:23;37824:32;37821:119;;;37859:79;;:::i;:::-;37821:119;37979:1;38004:63;38059:7;38050:6;38039:9;38035:22;38004:63;:::i;:::-;37994:73;;37950:127;37735:349;;;;:::o;38090:240::-;38230:34;38226:1;38218:6;38214:14;38207:58;38299:23;38294:2;38286:6;38282:15;38275:48;38090:240;:::o;38336:366::-;38478:3;38499:67;38563:2;38558:3;38499:67;:::i;:::-;38492:74;;38575:93;38664:3;38575:93;:::i;:::-;38693:2;38688:3;38684:12;38677:19;;38336:366;;;:::o;38708:419::-;38874:4;38912:2;38901:9;38897:18;38889:26;;38961:9;38955:4;38951:20;38947:1;38936:9;38932:17;38925:47;38989:131;39115:4;38989:131;:::i;:::-;38981:139;;38708:419;;;:::o;39133:180::-;39181:77;39178:1;39171:88;39278:4;39275:1;39268:15;39302:4;39299:1;39292:15;39319:182;39459:34;39455:1;39447:6;39443:14;39436:58;39319:182;:::o;39507:366::-;39649:3;39670:67;39734:2;39729:3;39670:67;:::i;:::-;39663:74;;39746:93;39835:3;39746:93;:::i;:::-;39864:2;39859:3;39855:12;39848:19;;39507:366;;;:::o;39879:419::-;40045:4;40083:2;40072:9;40068:18;40060:26;;40132:9;40126:4;40122:20;40118:1;40107:9;40103:17;40096:47;40160:131;40286:4;40160:131;:::i;:::-;40152:139;;39879:419;;;:::o;40304:178::-;40444:30;40440:1;40432:6;40428:14;40421:54;40304:178;:::o;40488:366::-;40630:3;40651:67;40715:2;40710:3;40651:67;:::i;:::-;40644:74;;40727:93;40816:3;40727:93;:::i;:::-;40845:2;40840:3;40836:12;40829:19;;40488:366;;;:::o;40860:419::-;41026:4;41064:2;41053:9;41049:18;41041:26;;41113:9;41107:4;41103:20;41099:1;41088:9;41084:17;41077:47;41141:131;41267:4;41141:131;:::i;:::-;41133:139;;40860:419;;;:::o;41285:180::-;41333:77;41330:1;41323:88;41430:4;41427:1;41420:15;41454:4;41451:1;41444:15;41471:194;41511:4;41531:20;41549:1;41531:20;:::i;:::-;41526:25;;41565:20;41583:1;41565:20;:::i;:::-;41560:25;;41609:1;41606;41602:9;41594:17;;41633:1;41627:4;41624:11;41621:37;;;41638:18;;:::i;:::-;41621:37;41471:194;;;;:::o;41671:191::-;41711:3;41730:20;41748:1;41730:20;:::i;:::-;41725:25;;41764:20;41782:1;41764:20;:::i;:::-;41759:25;;41807:1;41804;41800:9;41793:16;;41828:3;41825:1;41822:10;41819:36;;;41835:18;;:::i;:::-;41819:36;41671:191;;;;:::o;41868:180::-;41916:77;41913:1;41906:88;42013:4;42010:1;42003:15;42037:4;42034:1;42027:15

Swarm Source

ipfs://8b6784801d375aa52b45ab5634844c88116cbea0fab15160d33d378c05f39c78
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.