ETH Price: $3,610.11 (+1.33%)
 

Overview

Max Total Supply

20 Ethworms

Holders

10

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 Ethworms
0x31e9e74043f07ddca69701c0ea7d0d905d1e27ed
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Ethworms

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-30
*/

/**
 *Submitted for verification at Etherscan.io on 2022-06-20
*/

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/access/[email protected]


// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        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/utils/math/[email protected]


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


// File @openzeppelin/contracts/utils/introspection/[email protected]


// 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/[email protected]


// OpenZeppelin Contracts (last updated v4.6.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 be 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: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * 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/security/[email protected]


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


// 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/[email protected]


// 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/[email protected]


// OpenZeppelin Contracts (last updated v4.5.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 functionCall(target, data, "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");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(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) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(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) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason 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 {
            // 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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File @openzeppelin/contracts/utils/[email protected]


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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

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


// File @openzeppelin/contracts/utils/introspection/[email protected]


// 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 contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.0;
/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Does not support burning tokens to address(0).
 *
 * Assumes that an owner cannot have more than the 2**128 - 1 (max value of uint128) of supply
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    function totalSupply() public view returns (uint256) {
        return currentIndex;
    }

    /**
     * @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 override returns (uint256) {
        require(owner != address(0), 'ERC721A: balance query for the zero address');
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

    unchecked {
        for (uint256 curr = tokenId; curr >= 0; curr--) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (ownership.addr != address(0)) {
                return ownership;
            }
        }
    }

        revert('ERC721A: unable to determine the owner of token');
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    /**
     * @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) {
        require(_exists(tokenId), 'ERC721Metadata: URI query for nonexistent token');

        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 overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

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

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            'ERC721A: approve caller is not owner nor approved for all'
        );

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        require(_exists(tokenId), 'ERC721A: approved query for nonexistent token');

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), 'ERC721A: approve to caller');

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 override {
        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: transfer to non ERC721Receiver implementer'
        );
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        require(quantity != 0, 'ERC721A: quantity must be greater than 0');

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
    unchecked {
        _addressData[to].balance += uint128(quantity);
        _addressData[to].numberMinted += uint128(quantity);

        _ownerships[startTokenId].addr = to;
        _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

        uint256 updatedIndex = startTokenId;

        for (uint256 i; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            if (safe) {
                require(
                    _checkOnERC721Received(address(0), to, updatedIndex, _data),
                    'ERC721A: transfer to non ERC721Receiver implementer'
                );
            }

            updatedIndex++;
        }

        currentIndex = updatedIndex;
    }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
        getApproved(tokenId) == _msgSender() ||
        isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, prevOwnership.addr);

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
    unchecked {
        _addressData[from].balance -= 1;
        _addressData[to].balance += 1;

        _ownerships[tokenId].addr = to;
        _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId].addr = prevOwnership.addr;
                _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
            }
        }
    }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert('ERC721A: transfer to non ERC721Receiver implementer');
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

pragma solidity ^0.8.0;
contract Ethworms is Ownable, ERC721A, ReentrancyGuard {
    using SafeMath for uint256;
   
    bool private _isActive = false;

    uint256 public constant MAX_SUPPLY = 2222;

    uint256 public maxCountPerAccount = 2; 
    
    uint256 public price = 0 ether;

    string private _tokenBaseURI = "";

    mapping(address => uint256) public minted;

    modifier onlyActive() {
        require(_isActive && totalSupply() < MAX_SUPPLY, 'not active');
        _;
    }

    constructor() ERC721A("Ethworms", "Ethworms") {
    }

    function mint(uint256 numberOfTokens) external payable onlyActive nonReentrant() {
        require(numberOfTokens > 0, "zero count");
        require(numberOfTokens <= MAX_SUPPLY.sub(totalSupply()), "not enough nfts");
        require(numberOfTokens.add(minted[msg.sender]) <= maxCountPerAccount, "already max minted");
        
        minted[msg.sender] = minted[msg.sender].add(numberOfTokens);

        _safeMint(msg.sender, numberOfTokens);
    }

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

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

    
    /////////////////////////////////////////////////////////////
    //////////////////   Admin Functions ////////////////////////
    /////////////////////////////////////////////////////////////
    function startSale() external onlyOwner {
        _isActive = true;
    }

    function endSale() external onlyOwner {
        _isActive = false;
    }

    function setPrice(uint256 _price) external onlyOwner {
        price = _price;
    }

    function setMaxMintPerAddr(uint256 _count) external onlyOwner {
        maxCountPerAccount = _count;
    }

    function setTokenBaseURI(string memory URI) external onlyOwner {
        _tokenBaseURI = URI;
    }

    function withdraw() external onlyOwner nonReentrant {
        uint256 balance = address(this).balance;
        Address.sendValue(payable(owner()), balance);
    }

    receive() external payable {}
}

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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxCountPerAccount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setMaxMintPerAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setTokenBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startSale","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000600960006101000a81548160ff0219169083151502179055506002600a556000600b5560405180602001604052806000815250600c908051906020019062000050929190620001f9565b503480156200005e57600080fd5b506040518060400160405280600881526020017f457468776f726d730000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f457468776f726d73000000000000000000000000000000000000000000000000815250620000eb620000df6200012d60201b60201c565b6200013560201b60201c565b816002908051906020019062000103929190620001f9565b5080600390805190602001906200011c929190620001f9565b50505060016008819055506200030e565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200020790620002a9565b90600052602060002090601f0160209004810192826200022b576000855562000277565b82601f106200024657805160ff191683800117855562000277565b8280016001018555821562000277579182015b828111156200027657825182559160200191906001019062000259565b5b5090506200028691906200028a565b5090565b5b80821115620002a55760008160009055506001016200028b565b5090565b60006002820490506001821680620002c257607f821691505b60208210811415620002d957620002d8620002df565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613f66806200031e6000396000f3fe6080604052600436106101bb5760003560e01c8063715018a6116100ec578063a22cb4651161008a578063b88d4fde11610064578063b88d4fde146105bc578063c87b56dd146105e5578063e985e9c514610622578063f2fde38b1461065f576101c2565b8063a22cb46514610551578063b0d1643d1461057a578063b66a0e5d146105a5576101c2565b806391b7f5ed116100c657806391b7f5ed146104b657806395d89b41146104df578063a035b1fe1461050a578063a0712d6814610535576101c2565b8063715018a61461044b5780638da5cb5b146104625780638ef79e911461048d576101c2565b806323b872dd116101595780633ccfd60b116101335780633ccfd60b1461039157806342842e0e146103a85780636352211e146103d157806370a082311461040e576101c2565b806323b872dd1461032657806332cb6b0c1461034f578063380d831b1461037a576101c2565b8063095ea7b311610195578063095ea7b31461026c5780631300c0141461029557806318160ddd146102be5780631e7269c5146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f576101c2565b366101c257005b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612bf5565b610688565b6040516101fb919061317d565b60405180910390f35b34801561021057600080fd5b5061021961076a565b6040516102269190613198565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612c98565b6107fc565b6040516102639190613116565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612bb5565b610881565b005b3480156102a157600080fd5b506102bc60048036038101906102b79190612c98565b61099a565b005b3480156102ca57600080fd5b506102d3610a20565b6040516102e0919061349a565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612a32565b610a2a565b60405161031d919061349a565b60405180910390f35b34801561033257600080fd5b5061034d60048036038101906103489190612a9f565b610a42565b005b34801561035b57600080fd5b50610364610a52565b604051610371919061349a565b60405180910390f35b34801561038657600080fd5b5061038f610a58565b005b34801561039d57600080fd5b506103a6610af1565b005b3480156103b457600080fd5b506103cf60048036038101906103ca9190612a9f565b610bdc565b005b3480156103dd57600080fd5b506103f860048036038101906103f39190612c98565b610bfc565b6040516104059190613116565b60405180910390f35b34801561041a57600080fd5b5061043560048036038101906104309190612a32565b610c12565b604051610442919061349a565b60405180910390f35b34801561045757600080fd5b50610460610cfb565b005b34801561046e57600080fd5b50610477610d83565b6040516104849190613116565b60405180910390f35b34801561049957600080fd5b506104b460048036038101906104af9190612c4f565b610dac565b005b3480156104c257600080fd5b506104dd60048036038101906104d89190612c98565b610e42565b005b3480156104eb57600080fd5b506104f4610ec8565b6040516105019190613198565b60405180910390f35b34801561051657600080fd5b5061051f610f5a565b60405161052c919061349a565b60405180910390f35b61054f600480360381019061054a9190612c98565b610f60565b005b34801561055d57600080fd5b5061057860048036038101906105739190612b75565b6111f2565b005b34801561058657600080fd5b5061058f611373565b60405161059c919061349a565b60405180910390f35b3480156105b157600080fd5b506105ba611379565b005b3480156105c857600080fd5b506105e360048036038101906105de9190612af2565b611412565b005b3480156105f157600080fd5b5061060c60048036038101906106079190612c98565b61146e565b6040516106199190613198565b60405180910390f35b34801561062e57600080fd5b5061064960048036038101906106449190612a5f565b611480565b604051610656919061317d565b60405180910390f35b34801561066b57600080fd5b5061068660048036038101906106819190612a32565b611514565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061075357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061076357506107628261160c565b5b9050919050565b606060028054610779906136fb565b80601f01602080910402602001604051908101604052809291908181526020018280546107a5906136fb565b80156107f25780601f106107c7576101008083540402835291602001916107f2565b820191906000526020600020905b8154815290600101906020018083116107d557829003601f168201915b5050505050905090565b600061080782611676565b610846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083d9061347a565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061088c82610bfc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f49061339a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661091c611684565b73ffffffffffffffffffffffffffffffffffffffff16148061094b575061094a81610945611684565b611480565b5b61098a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610981906132ba565b60405180910390fd5b61099583838361168c565b505050565b6109a2611684565b73ffffffffffffffffffffffffffffffffffffffff166109c0610d83565b73ffffffffffffffffffffffffffffffffffffffff1614610a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0d9061331a565b60405180910390fd5b80600a8190555050565b6000600154905090565b600d6020528060005260406000206000915090505481565b610a4d83838361173e565b505050565b6108ae81565b610a60611684565b73ffffffffffffffffffffffffffffffffffffffff16610a7e610d83565b73ffffffffffffffffffffffffffffffffffffffff1614610ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acb9061331a565b60405180910390fd5b6000600960006101000a81548160ff021916908315150217905550565b610af9611684565b73ffffffffffffffffffffffffffffffffffffffff16610b17610d83565b73ffffffffffffffffffffffffffffffffffffffff1614610b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b649061331a565b60405180910390fd5b60026008541415610bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610baa9061343a565b60405180910390fd5b60026008819055506000479050610bd1610bcb610d83565b82611c7e565b506001600881905550565b610bf783838360405180602001604052806000815250611412565b505050565b6000610c0782611d72565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7a906132da565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b610d03611684565b73ffffffffffffffffffffffffffffffffffffffff16610d21610d83565b73ffffffffffffffffffffffffffffffffffffffff1614610d77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6e9061331a565b60405180910390fd5b610d816000611f0c565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610db4611684565b73ffffffffffffffffffffffffffffffffffffffff16610dd2610d83565b73ffffffffffffffffffffffffffffffffffffffff1614610e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f9061331a565b60405180910390fd5b80600c9080519060200190610e3e92919061280c565b5050565b610e4a611684565b73ffffffffffffffffffffffffffffffffffffffff16610e68610d83565b73ffffffffffffffffffffffffffffffffffffffff1614610ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb59061331a565b60405180910390fd5b80600b8190555050565b606060038054610ed7906136fb565b80601f0160208091040260200160405190810160405280929190818152602001828054610f03906136fb565b8015610f505780601f10610f2557610100808354040283529160200191610f50565b820191906000526020600020905b815481529060010190602001808311610f3357829003601f168201915b5050505050905090565b600b5481565b600960009054906101000a900460ff168015610f8457506108ae610f82610a20565b105b610fc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fba906131fa565b60405180910390fd5b60026008541415611009576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110009061343a565b60405180910390fd5b600260088190555060008111611054576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104b906133da565b60405180910390fd5b61107061105f610a20565b6108ae611fd090919063ffffffff16565b8111156110b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a99061329a565b60405180910390fd5b600a54611107600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483611fe690919063ffffffff16565b1115611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113f9061323a565b60405180910390fd5b61119a81600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fe690919063ffffffff16565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506111e73382611ffc565b600160088190555050565b6111fa611684565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125f9061335a565b60405180910390fd5b8060076000611275611684565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611322611684565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611367919061317d565b60405180910390a35050565b600a5481565b611381611684565b73ffffffffffffffffffffffffffffffffffffffff1661139f610d83565b73ffffffffffffffffffffffffffffffffffffffff16146113f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ec9061331a565b60405180910390fd5b6001600960006101000a81548160ff021916908315150217905550565b61141d84848461173e565b6114298484848461201a565b611468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145f906133ba565b60405180910390fd5b50505050565b6060611479826121b1565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61151c611684565b73ffffffffffffffffffffffffffffffffffffffff1661153a610d83565b73ffffffffffffffffffffffffffffffffffffffff1614611590576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115879061331a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f7906131ba565b60405180910390fd5b61160981611f0c565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061174982611d72565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611770611684565b73ffffffffffffffffffffffffffffffffffffffff1614806117cc5750611795611684565b73ffffffffffffffffffffffffffffffffffffffff166117b4846107fc565b73ffffffffffffffffffffffffffffffffffffffff16145b806117e857506117e782600001516117e2611684565b611480565b5b90508061182a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118219061337a565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461189c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611893906132fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561190c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119039061321a565b60405180910390fd5b6119198585856001612259565b611929600084846000015161168c565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611c0e57611b6d81611676565b15611c0d5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c77858585600161225f565b5050505050565b80471015611cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb89061327a565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611ce790613101565b60006040518083038185875af1925050503d8060008114611d24576040519150601f19603f3d011682016040523d82523d6000602084013e611d29565b606091505b5050905080611d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d649061325a565b60405180910390fd5b505050565b611d7a612892565b611d8382611676565b611dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db9906131da565b60405180910390fd5b60008290505b60008110611ecb576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611ebc578092505050611f07565b50808060019003915050611dc8565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efe9061345a565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183611fde9190613611565b905092915050565b60008183611ff4919061358a565b905092915050565b612016828260405180602001604052806000815250612265565b5050565b600061203b8473ffffffffffffffffffffffffffffffffffffffff16612277565b156121a4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612064611684565b8786866040518563ffffffff1660e01b81526004016120869493929190613131565b602060405180830381600087803b1580156120a057600080fd5b505af19250505080156120d157506040513d601f19601f820116820180604052508101906120ce9190612c22565b60015b612154573d8060008114612101576040519150601f19603f3d011682016040523d82523d6000602084013e612106565b606091505b5060008151141561214c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612143906133ba565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506121a9565b600190505b949350505050565b60606121bc82611676565b6121fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f29061333a565b60405180910390fd5b600061220561229a565b90506000815114156122265760405180602001604052806000815250612251565b806122308461232c565b6040516020016122419291906130dd565b6040516020818303038152906040525b915050919050565b50505050565b50505050565b612272838383600161248d565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060600c80546122a9906136fb565b80601f01602080910402602001604051908101604052809291908181526020018280546122d5906136fb565b80156123225780601f106122f757610100808354040283529160200191612322565b820191906000526020600020905b81548152906001019060200180831161230557829003601f168201915b5050505050905090565b60606000821415612374576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612488565b600082905060005b600082146123a657808061238f9061375e565b915050600a8261239f91906135e0565b915061237c565b60008167ffffffffffffffff8111156123c2576123c1613894565b5b6040519080825280601f01601f1916602001820160405280156123f45781602001600182028036833780820191505090505b5090505b600085146124815760018261240d9190613611565b9150600a8561241c91906137a7565b6030612428919061358a565b60f81b81838151811061243e5761243d613865565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561247a91906135e0565b94506123f8565b8093505050505b919050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fb906133fa565b60405180910390fd5b6000841415612548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253f9061341a565b60405180910390fd5b6125556000868387612259565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156127ef57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483156127da5761279a600088848861201a565b6127d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d0906133ba565b60405180910390fd5b5b81806001019250508080600101915050612723565b508060018190555050612805600086838761225f565b5050505050565b828054612818906136fb565b90600052602060002090601f01602090048101928261283a5760008555612881565b82601f1061285357805160ff1916838001178555612881565b82800160010185558215612881579182015b82811115612880578251825591602001919060010190612865565b5b50905061288e91906128cc565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156128e55760008160009055506001016128cd565b5090565b60006128fc6128f7846134da565b6134b5565b905082815260208101848484011115612918576129176138c8565b5b6129238482856136b9565b509392505050565b600061293e6129398461350b565b6134b5565b90508281526020810184848401111561295a576129596138c8565b5b6129658482856136b9565b509392505050565b60008135905061297c81613ed4565b92915050565b60008135905061299181613eeb565b92915050565b6000813590506129a681613f02565b92915050565b6000815190506129bb81613f02565b92915050565b600082601f8301126129d6576129d56138c3565b5b81356129e68482602086016128e9565b91505092915050565b600082601f830112612a0457612a036138c3565b5b8135612a1484826020860161292b565b91505092915050565b600081359050612a2c81613f19565b92915050565b600060208284031215612a4857612a476138d2565b5b6000612a568482850161296d565b91505092915050565b60008060408385031215612a7657612a756138d2565b5b6000612a848582860161296d565b9250506020612a958582860161296d565b9150509250929050565b600080600060608486031215612ab857612ab76138d2565b5b6000612ac68682870161296d565b9350506020612ad78682870161296d565b9250506040612ae886828701612a1d565b9150509250925092565b60008060008060808587031215612b0c57612b0b6138d2565b5b6000612b1a8782880161296d565b9450506020612b2b8782880161296d565b9350506040612b3c87828801612a1d565b925050606085013567ffffffffffffffff811115612b5d57612b5c6138cd565b5b612b69878288016129c1565b91505092959194509250565b60008060408385031215612b8c57612b8b6138d2565b5b6000612b9a8582860161296d565b9250506020612bab85828601612982565b9150509250929050565b60008060408385031215612bcc57612bcb6138d2565b5b6000612bda8582860161296d565b9250506020612beb85828601612a1d565b9150509250929050565b600060208284031215612c0b57612c0a6138d2565b5b6000612c1984828501612997565b91505092915050565b600060208284031215612c3857612c376138d2565b5b6000612c46848285016129ac565b91505092915050565b600060208284031215612c6557612c646138d2565b5b600082013567ffffffffffffffff811115612c8357612c826138cd565b5b612c8f848285016129ef565b91505092915050565b600060208284031215612cae57612cad6138d2565b5b6000612cbc84828501612a1d565b91505092915050565b612cce81613645565b82525050565b612cdd81613657565b82525050565b6000612cee8261353c565b612cf88185613552565b9350612d088185602086016136c8565b612d11816138d7565b840191505092915050565b6000612d2782613547565b612d31818561356e565b9350612d418185602086016136c8565b612d4a816138d7565b840191505092915050565b6000612d6082613547565b612d6a818561357f565b9350612d7a8185602086016136c8565b80840191505092915050565b6000612d9360268361356e565b9150612d9e826138e8565b604082019050919050565b6000612db6602a8361356e565b9150612dc182613937565b604082019050919050565b6000612dd9600a8361356e565b9150612de482613986565b602082019050919050565b6000612dfc60258361356e565b9150612e07826139af565b604082019050919050565b6000612e1f60128361356e565b9150612e2a826139fe565b602082019050919050565b6000612e42603a8361356e565b9150612e4d82613a27565b604082019050919050565b6000612e65601d8361356e565b9150612e7082613a76565b602082019050919050565b6000612e88600f8361356e565b9150612e9382613a9f565b602082019050919050565b6000612eab60398361356e565b9150612eb682613ac8565b604082019050919050565b6000612ece602b8361356e565b9150612ed982613b17565b604082019050919050565b6000612ef160268361356e565b9150612efc82613b66565b604082019050919050565b6000612f1460208361356e565b9150612f1f82613bb5565b602082019050919050565b6000612f37602f8361356e565b9150612f4282613bde565b604082019050919050565b6000612f5a601a8361356e565b9150612f6582613c2d565b602082019050919050565b6000612f7d60328361356e565b9150612f8882613c56565b604082019050919050565b6000612fa060228361356e565b9150612fab82613ca5565b604082019050919050565b6000612fc3600083613563565b9150612fce82613cf4565b600082019050919050565b6000612fe660338361356e565b9150612ff182613cf7565b604082019050919050565b6000613009600a8361356e565b915061301482613d46565b602082019050919050565b600061302c60218361356e565b915061303782613d6f565b604082019050919050565b600061304f60288361356e565b915061305a82613dbe565b604082019050919050565b6000613072601f8361356e565b915061307d82613e0d565b602082019050919050565b6000613095602f8361356e565b91506130a082613e36565b604082019050919050565b60006130b8602d8361356e565b91506130c382613e85565b604082019050919050565b6130d7816136af565b82525050565b60006130e98285612d55565b91506130f58284612d55565b91508190509392505050565b600061310c82612fb6565b9150819050919050565b600060208201905061312b6000830184612cc5565b92915050565b60006080820190506131466000830187612cc5565b6131536020830186612cc5565b61316060408301856130ce565b81810360608301526131728184612ce3565b905095945050505050565b60006020820190506131926000830184612cd4565b92915050565b600060208201905081810360008301526131b28184612d1c565b905092915050565b600060208201905081810360008301526131d381612d86565b9050919050565b600060208201905081810360008301526131f381612da9565b9050919050565b6000602082019050818103600083015261321381612dcc565b9050919050565b6000602082019050818103600083015261323381612def565b9050919050565b6000602082019050818103600083015261325381612e12565b9050919050565b6000602082019050818103600083015261327381612e35565b9050919050565b6000602082019050818103600083015261329381612e58565b9050919050565b600060208201905081810360008301526132b381612e7b565b9050919050565b600060208201905081810360008301526132d381612e9e565b9050919050565b600060208201905081810360008301526132f381612ec1565b9050919050565b6000602082019050818103600083015261331381612ee4565b9050919050565b6000602082019050818103600083015261333381612f07565b9050919050565b6000602082019050818103600083015261335381612f2a565b9050919050565b6000602082019050818103600083015261337381612f4d565b9050919050565b6000602082019050818103600083015261339381612f70565b9050919050565b600060208201905081810360008301526133b381612f93565b9050919050565b600060208201905081810360008301526133d381612fd9565b9050919050565b600060208201905081810360008301526133f381612ffc565b9050919050565b600060208201905081810360008301526134138161301f565b9050919050565b6000602082019050818103600083015261343381613042565b9050919050565b6000602082019050818103600083015261345381613065565b9050919050565b6000602082019050818103600083015261347381613088565b9050919050565b60006020820190508181036000830152613493816130ab565b9050919050565b60006020820190506134af60008301846130ce565b92915050565b60006134bf6134d0565b90506134cb828261372d565b919050565b6000604051905090565b600067ffffffffffffffff8211156134f5576134f4613894565b5b6134fe826138d7565b9050602081019050919050565b600067ffffffffffffffff82111561352657613525613894565b5b61352f826138d7565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613595826136af565b91506135a0836136af565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156135d5576135d46137d8565b5b828201905092915050565b60006135eb826136af565b91506135f6836136af565b92508261360657613605613807565b5b828204905092915050565b600061361c826136af565b9150613627836136af565b92508282101561363a576136396137d8565b5b828203905092915050565b60006136508261368f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156136e65780820151818401526020810190506136cb565b838111156136f5576000848401525b50505050565b6000600282049050600182168061371357607f821691505b6020821081141561372757613726613836565b5b50919050565b613736826138d7565b810181811067ffffffffffffffff8211171561375557613754613894565b5b80604052505050565b6000613769826136af565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561379c5761379b6137d8565b5b600182019050919050565b60006137b2826136af565b91506137bd836136af565b9250826137cd576137cc613807565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f6e6f742061637469766500000000000000000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f616c7265616479206d6178206d696e7465640000000000000000000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f6e6f7420656e6f756768206e6674730000000000000000000000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f7a65726f20636f756e7400000000000000000000000000000000000000000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b613edd81613645565b8114613ee857600080fd5b50565b613ef481613657565b8114613eff57600080fd5b50565b613f0b81613663565b8114613f1657600080fd5b50565b613f22816136af565b8114613f2d57600080fd5b5056fea2646970667358221220ef2831aaf0b2819ef1a30ecad03162c76750e019fe5f38b0aadb2a18bab3276964736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101bb5760003560e01c8063715018a6116100ec578063a22cb4651161008a578063b88d4fde11610064578063b88d4fde146105bc578063c87b56dd146105e5578063e985e9c514610622578063f2fde38b1461065f576101c2565b8063a22cb46514610551578063b0d1643d1461057a578063b66a0e5d146105a5576101c2565b806391b7f5ed116100c657806391b7f5ed146104b657806395d89b41146104df578063a035b1fe1461050a578063a0712d6814610535576101c2565b8063715018a61461044b5780638da5cb5b146104625780638ef79e911461048d576101c2565b806323b872dd116101595780633ccfd60b116101335780633ccfd60b1461039157806342842e0e146103a85780636352211e146103d157806370a082311461040e576101c2565b806323b872dd1461032657806332cb6b0c1461034f578063380d831b1461037a576101c2565b8063095ea7b311610195578063095ea7b31461026c5780631300c0141461029557806318160ddd146102be5780631e7269c5146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f576101c2565b366101c257005b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612bf5565b610688565b6040516101fb919061317d565b60405180910390f35b34801561021057600080fd5b5061021961076a565b6040516102269190613198565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612c98565b6107fc565b6040516102639190613116565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612bb5565b610881565b005b3480156102a157600080fd5b506102bc60048036038101906102b79190612c98565b61099a565b005b3480156102ca57600080fd5b506102d3610a20565b6040516102e0919061349a565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612a32565b610a2a565b60405161031d919061349a565b60405180910390f35b34801561033257600080fd5b5061034d60048036038101906103489190612a9f565b610a42565b005b34801561035b57600080fd5b50610364610a52565b604051610371919061349a565b60405180910390f35b34801561038657600080fd5b5061038f610a58565b005b34801561039d57600080fd5b506103a6610af1565b005b3480156103b457600080fd5b506103cf60048036038101906103ca9190612a9f565b610bdc565b005b3480156103dd57600080fd5b506103f860048036038101906103f39190612c98565b610bfc565b6040516104059190613116565b60405180910390f35b34801561041a57600080fd5b5061043560048036038101906104309190612a32565b610c12565b604051610442919061349a565b60405180910390f35b34801561045757600080fd5b50610460610cfb565b005b34801561046e57600080fd5b50610477610d83565b6040516104849190613116565b60405180910390f35b34801561049957600080fd5b506104b460048036038101906104af9190612c4f565b610dac565b005b3480156104c257600080fd5b506104dd60048036038101906104d89190612c98565b610e42565b005b3480156104eb57600080fd5b506104f4610ec8565b6040516105019190613198565b60405180910390f35b34801561051657600080fd5b5061051f610f5a565b60405161052c919061349a565b60405180910390f35b61054f600480360381019061054a9190612c98565b610f60565b005b34801561055d57600080fd5b5061057860048036038101906105739190612b75565b6111f2565b005b34801561058657600080fd5b5061058f611373565b60405161059c919061349a565b60405180910390f35b3480156105b157600080fd5b506105ba611379565b005b3480156105c857600080fd5b506105e360048036038101906105de9190612af2565b611412565b005b3480156105f157600080fd5b5061060c60048036038101906106079190612c98565b61146e565b6040516106199190613198565b60405180910390f35b34801561062e57600080fd5b5061064960048036038101906106449190612a5f565b611480565b604051610656919061317d565b60405180910390f35b34801561066b57600080fd5b5061068660048036038101906106819190612a32565b611514565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061075357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061076357506107628261160c565b5b9050919050565b606060028054610779906136fb565b80601f01602080910402602001604051908101604052809291908181526020018280546107a5906136fb565b80156107f25780601f106107c7576101008083540402835291602001916107f2565b820191906000526020600020905b8154815290600101906020018083116107d557829003601f168201915b5050505050905090565b600061080782611676565b610846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083d9061347a565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061088c82610bfc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f49061339a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661091c611684565b73ffffffffffffffffffffffffffffffffffffffff16148061094b575061094a81610945611684565b611480565b5b61098a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610981906132ba565b60405180910390fd5b61099583838361168c565b505050565b6109a2611684565b73ffffffffffffffffffffffffffffffffffffffff166109c0610d83565b73ffffffffffffffffffffffffffffffffffffffff1614610a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0d9061331a565b60405180910390fd5b80600a8190555050565b6000600154905090565b600d6020528060005260406000206000915090505481565b610a4d83838361173e565b505050565b6108ae81565b610a60611684565b73ffffffffffffffffffffffffffffffffffffffff16610a7e610d83565b73ffffffffffffffffffffffffffffffffffffffff1614610ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acb9061331a565b60405180910390fd5b6000600960006101000a81548160ff021916908315150217905550565b610af9611684565b73ffffffffffffffffffffffffffffffffffffffff16610b17610d83565b73ffffffffffffffffffffffffffffffffffffffff1614610b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b649061331a565b60405180910390fd5b60026008541415610bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610baa9061343a565b60405180910390fd5b60026008819055506000479050610bd1610bcb610d83565b82611c7e565b506001600881905550565b610bf783838360405180602001604052806000815250611412565b505050565b6000610c0782611d72565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7a906132da565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b610d03611684565b73ffffffffffffffffffffffffffffffffffffffff16610d21610d83565b73ffffffffffffffffffffffffffffffffffffffff1614610d77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6e9061331a565b60405180910390fd5b610d816000611f0c565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610db4611684565b73ffffffffffffffffffffffffffffffffffffffff16610dd2610d83565b73ffffffffffffffffffffffffffffffffffffffff1614610e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f9061331a565b60405180910390fd5b80600c9080519060200190610e3e92919061280c565b5050565b610e4a611684565b73ffffffffffffffffffffffffffffffffffffffff16610e68610d83565b73ffffffffffffffffffffffffffffffffffffffff1614610ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb59061331a565b60405180910390fd5b80600b8190555050565b606060038054610ed7906136fb565b80601f0160208091040260200160405190810160405280929190818152602001828054610f03906136fb565b8015610f505780601f10610f2557610100808354040283529160200191610f50565b820191906000526020600020905b815481529060010190602001808311610f3357829003601f168201915b5050505050905090565b600b5481565b600960009054906101000a900460ff168015610f8457506108ae610f82610a20565b105b610fc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fba906131fa565b60405180910390fd5b60026008541415611009576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110009061343a565b60405180910390fd5b600260088190555060008111611054576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104b906133da565b60405180910390fd5b61107061105f610a20565b6108ae611fd090919063ffffffff16565b8111156110b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a99061329a565b60405180910390fd5b600a54611107600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483611fe690919063ffffffff16565b1115611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113f9061323a565b60405180910390fd5b61119a81600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fe690919063ffffffff16565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506111e73382611ffc565b600160088190555050565b6111fa611684565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125f9061335a565b60405180910390fd5b8060076000611275611684565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611322611684565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611367919061317d565b60405180910390a35050565b600a5481565b611381611684565b73ffffffffffffffffffffffffffffffffffffffff1661139f610d83565b73ffffffffffffffffffffffffffffffffffffffff16146113f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ec9061331a565b60405180910390fd5b6001600960006101000a81548160ff021916908315150217905550565b61141d84848461173e565b6114298484848461201a565b611468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145f906133ba565b60405180910390fd5b50505050565b6060611479826121b1565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61151c611684565b73ffffffffffffffffffffffffffffffffffffffff1661153a610d83565b73ffffffffffffffffffffffffffffffffffffffff1614611590576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115879061331a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f7906131ba565b60405180910390fd5b61160981611f0c565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061174982611d72565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611770611684565b73ffffffffffffffffffffffffffffffffffffffff1614806117cc5750611795611684565b73ffffffffffffffffffffffffffffffffffffffff166117b4846107fc565b73ffffffffffffffffffffffffffffffffffffffff16145b806117e857506117e782600001516117e2611684565b611480565b5b90508061182a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118219061337a565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461189c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611893906132fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561190c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119039061321a565b60405180910390fd5b6119198585856001612259565b611929600084846000015161168c565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611c0e57611b6d81611676565b15611c0d5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c77858585600161225f565b5050505050565b80471015611cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb89061327a565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611ce790613101565b60006040518083038185875af1925050503d8060008114611d24576040519150601f19603f3d011682016040523d82523d6000602084013e611d29565b606091505b5050905080611d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d649061325a565b60405180910390fd5b505050565b611d7a612892565b611d8382611676565b611dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db9906131da565b60405180910390fd5b60008290505b60008110611ecb576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611ebc578092505050611f07565b50808060019003915050611dc8565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efe9061345a565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183611fde9190613611565b905092915050565b60008183611ff4919061358a565b905092915050565b612016828260405180602001604052806000815250612265565b5050565b600061203b8473ffffffffffffffffffffffffffffffffffffffff16612277565b156121a4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612064611684565b8786866040518563ffffffff1660e01b81526004016120869493929190613131565b602060405180830381600087803b1580156120a057600080fd5b505af19250505080156120d157506040513d601f19601f820116820180604052508101906120ce9190612c22565b60015b612154573d8060008114612101576040519150601f19603f3d011682016040523d82523d6000602084013e612106565b606091505b5060008151141561214c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612143906133ba565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506121a9565b600190505b949350505050565b60606121bc82611676565b6121fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f29061333a565b60405180910390fd5b600061220561229a565b90506000815114156122265760405180602001604052806000815250612251565b806122308461232c565b6040516020016122419291906130dd565b6040516020818303038152906040525b915050919050565b50505050565b50505050565b612272838383600161248d565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060600c80546122a9906136fb565b80601f01602080910402602001604051908101604052809291908181526020018280546122d5906136fb565b80156123225780601f106122f757610100808354040283529160200191612322565b820191906000526020600020905b81548152906001019060200180831161230557829003601f168201915b5050505050905090565b60606000821415612374576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612488565b600082905060005b600082146123a657808061238f9061375e565b915050600a8261239f91906135e0565b915061237c565b60008167ffffffffffffffff8111156123c2576123c1613894565b5b6040519080825280601f01601f1916602001820160405280156123f45781602001600182028036833780820191505090505b5090505b600085146124815760018261240d9190613611565b9150600a8561241c91906137a7565b6030612428919061358a565b60f81b81838151811061243e5761243d613865565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561247a91906135e0565b94506123f8565b8093505050505b919050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fb906133fa565b60405180910390fd5b6000841415612548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253f9061341a565b60405180910390fd5b6125556000868387612259565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156127ef57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483156127da5761279a600088848861201a565b6127d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d0906133ba565b60405180910390fd5b5b81806001019250508080600101915050612723565b508060018190555050612805600086838761225f565b5050505050565b828054612818906136fb565b90600052602060002090601f01602090048101928261283a5760008555612881565b82601f1061285357805160ff1916838001178555612881565b82800160010185558215612881579182015b82811115612880578251825591602001919060010190612865565b5b50905061288e91906128cc565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156128e55760008160009055506001016128cd565b5090565b60006128fc6128f7846134da565b6134b5565b905082815260208101848484011115612918576129176138c8565b5b6129238482856136b9565b509392505050565b600061293e6129398461350b565b6134b5565b90508281526020810184848401111561295a576129596138c8565b5b6129658482856136b9565b509392505050565b60008135905061297c81613ed4565b92915050565b60008135905061299181613eeb565b92915050565b6000813590506129a681613f02565b92915050565b6000815190506129bb81613f02565b92915050565b600082601f8301126129d6576129d56138c3565b5b81356129e68482602086016128e9565b91505092915050565b600082601f830112612a0457612a036138c3565b5b8135612a1484826020860161292b565b91505092915050565b600081359050612a2c81613f19565b92915050565b600060208284031215612a4857612a476138d2565b5b6000612a568482850161296d565b91505092915050565b60008060408385031215612a7657612a756138d2565b5b6000612a848582860161296d565b9250506020612a958582860161296d565b9150509250929050565b600080600060608486031215612ab857612ab76138d2565b5b6000612ac68682870161296d565b9350506020612ad78682870161296d565b9250506040612ae886828701612a1d565b9150509250925092565b60008060008060808587031215612b0c57612b0b6138d2565b5b6000612b1a8782880161296d565b9450506020612b2b8782880161296d565b9350506040612b3c87828801612a1d565b925050606085013567ffffffffffffffff811115612b5d57612b5c6138cd565b5b612b69878288016129c1565b91505092959194509250565b60008060408385031215612b8c57612b8b6138d2565b5b6000612b9a8582860161296d565b9250506020612bab85828601612982565b9150509250929050565b60008060408385031215612bcc57612bcb6138d2565b5b6000612bda8582860161296d565b9250506020612beb85828601612a1d565b9150509250929050565b600060208284031215612c0b57612c0a6138d2565b5b6000612c1984828501612997565b91505092915050565b600060208284031215612c3857612c376138d2565b5b6000612c46848285016129ac565b91505092915050565b600060208284031215612c6557612c646138d2565b5b600082013567ffffffffffffffff811115612c8357612c826138cd565b5b612c8f848285016129ef565b91505092915050565b600060208284031215612cae57612cad6138d2565b5b6000612cbc84828501612a1d565b91505092915050565b612cce81613645565b82525050565b612cdd81613657565b82525050565b6000612cee8261353c565b612cf88185613552565b9350612d088185602086016136c8565b612d11816138d7565b840191505092915050565b6000612d2782613547565b612d31818561356e565b9350612d418185602086016136c8565b612d4a816138d7565b840191505092915050565b6000612d6082613547565b612d6a818561357f565b9350612d7a8185602086016136c8565b80840191505092915050565b6000612d9360268361356e565b9150612d9e826138e8565b604082019050919050565b6000612db6602a8361356e565b9150612dc182613937565b604082019050919050565b6000612dd9600a8361356e565b9150612de482613986565b602082019050919050565b6000612dfc60258361356e565b9150612e07826139af565b604082019050919050565b6000612e1f60128361356e565b9150612e2a826139fe565b602082019050919050565b6000612e42603a8361356e565b9150612e4d82613a27565b604082019050919050565b6000612e65601d8361356e565b9150612e7082613a76565b602082019050919050565b6000612e88600f8361356e565b9150612e9382613a9f565b602082019050919050565b6000612eab60398361356e565b9150612eb682613ac8565b604082019050919050565b6000612ece602b8361356e565b9150612ed982613b17565b604082019050919050565b6000612ef160268361356e565b9150612efc82613b66565b604082019050919050565b6000612f1460208361356e565b9150612f1f82613bb5565b602082019050919050565b6000612f37602f8361356e565b9150612f4282613bde565b604082019050919050565b6000612f5a601a8361356e565b9150612f6582613c2d565b602082019050919050565b6000612f7d60328361356e565b9150612f8882613c56565b604082019050919050565b6000612fa060228361356e565b9150612fab82613ca5565b604082019050919050565b6000612fc3600083613563565b9150612fce82613cf4565b600082019050919050565b6000612fe660338361356e565b9150612ff182613cf7565b604082019050919050565b6000613009600a8361356e565b915061301482613d46565b602082019050919050565b600061302c60218361356e565b915061303782613d6f565b604082019050919050565b600061304f60288361356e565b915061305a82613dbe565b604082019050919050565b6000613072601f8361356e565b915061307d82613e0d565b602082019050919050565b6000613095602f8361356e565b91506130a082613e36565b604082019050919050565b60006130b8602d8361356e565b91506130c382613e85565b604082019050919050565b6130d7816136af565b82525050565b60006130e98285612d55565b91506130f58284612d55565b91508190509392505050565b600061310c82612fb6565b9150819050919050565b600060208201905061312b6000830184612cc5565b92915050565b60006080820190506131466000830187612cc5565b6131536020830186612cc5565b61316060408301856130ce565b81810360608301526131728184612ce3565b905095945050505050565b60006020820190506131926000830184612cd4565b92915050565b600060208201905081810360008301526131b28184612d1c565b905092915050565b600060208201905081810360008301526131d381612d86565b9050919050565b600060208201905081810360008301526131f381612da9565b9050919050565b6000602082019050818103600083015261321381612dcc565b9050919050565b6000602082019050818103600083015261323381612def565b9050919050565b6000602082019050818103600083015261325381612e12565b9050919050565b6000602082019050818103600083015261327381612e35565b9050919050565b6000602082019050818103600083015261329381612e58565b9050919050565b600060208201905081810360008301526132b381612e7b565b9050919050565b600060208201905081810360008301526132d381612e9e565b9050919050565b600060208201905081810360008301526132f381612ec1565b9050919050565b6000602082019050818103600083015261331381612ee4565b9050919050565b6000602082019050818103600083015261333381612f07565b9050919050565b6000602082019050818103600083015261335381612f2a565b9050919050565b6000602082019050818103600083015261337381612f4d565b9050919050565b6000602082019050818103600083015261339381612f70565b9050919050565b600060208201905081810360008301526133b381612f93565b9050919050565b600060208201905081810360008301526133d381612fd9565b9050919050565b600060208201905081810360008301526133f381612ffc565b9050919050565b600060208201905081810360008301526134138161301f565b9050919050565b6000602082019050818103600083015261343381613042565b9050919050565b6000602082019050818103600083015261345381613065565b9050919050565b6000602082019050818103600083015261347381613088565b9050919050565b60006020820190508181036000830152613493816130ab565b9050919050565b60006020820190506134af60008301846130ce565b92915050565b60006134bf6134d0565b90506134cb828261372d565b919050565b6000604051905090565b600067ffffffffffffffff8211156134f5576134f4613894565b5b6134fe826138d7565b9050602081019050919050565b600067ffffffffffffffff82111561352657613525613894565b5b61352f826138d7565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613595826136af565b91506135a0836136af565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156135d5576135d46137d8565b5b828201905092915050565b60006135eb826136af565b91506135f6836136af565b92508261360657613605613807565b5b828204905092915050565b600061361c826136af565b9150613627836136af565b92508282101561363a576136396137d8565b5b828203905092915050565b60006136508261368f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156136e65780820151818401526020810190506136cb565b838111156136f5576000848401525b50505050565b6000600282049050600182168061371357607f821691505b6020821081141561372757613726613836565b5b50919050565b613736826138d7565b810181811067ffffffffffffffff8211171561375557613754613894565b5b80604052505050565b6000613769826136af565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561379c5761379b6137d8565b5b600182019050919050565b60006137b2826136af565b91506137bd836136af565b9250826137cd576137cc613807565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f6e6f742061637469766500000000000000000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f616c7265616479206d6178206d696e7465640000000000000000000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f6e6f7420656e6f756768206e6674730000000000000000000000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f7a65726f20636f756e7400000000000000000000000000000000000000000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b613edd81613645565b8114613ee857600080fd5b50565b613ef481613657565b8114613eff57600080fd5b50565b613f0b81613663565b8114613f1657600080fd5b50565b613f22816136af565b8114613f2d57600080fd5b5056fea2646970667358221220ef2831aaf0b2819ef1a30ecad03162c76750e019fe5f38b0aadb2a18bab3276964736f6c63430008070033

Deployed Bytecode Sourcemap

47326:2184:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34428:293;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36203:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37765:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37286:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49080:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34265:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47647:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38641:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47465:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48904:74;;;;;;;;;;;;;:::i;:::-;;49305:165;;;;;;;;;;;;;:::i;:::-;;38874:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36012:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34785:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2571:103;;;;;;;;;;;;;:::i;:::-;;1920:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49196:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48986:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36372:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47566:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47882:459;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38051:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47515:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48821:75;;;;;;;;;;;;;:::i;:::-;;39122:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48463:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38410:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2829:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34428:293;34530:4;34578:25;34563:40;;;:11;:40;;;;:101;;;;34631:33;34616:48;;;:11;:48;;;;34563:101;:150;;;;34677:36;34701:11;34677:23;:36::i;:::-;34563:150;34547:166;;34428:293;;;:::o;36203:100::-;36257:13;36290:5;36283:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36203:100;:::o;37765:214::-;37833:7;37861:16;37869:7;37861;:16::i;:::-;37853:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;37947:15;:24;37963:7;37947:24;;;;;;;;;;;;;;;;;;;;;37940:31;;37765:214;;;:::o;37286:413::-;37359:13;37375:24;37391:7;37375:15;:24::i;:::-;37359:40;;37424:5;37418:11;;:2;:11;;;;37410:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37519:5;37503:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;37528:37;37545:5;37552:12;:10;:12::i;:::-;37528:16;:37::i;:::-;37503:62;37481:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;37663:28;37672:2;37676:7;37685:5;37663:8;:28::i;:::-;37348:351;37286:413;;:::o;49080:108::-;2151:12;:10;:12::i;:::-;2140:23;;:7;:5;:7::i;:::-;:23;;;2132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49174:6:::1;49153:18;:27;;;;49080:108:::0;:::o;34265:91::-;34309:7;34336:12;;34329:19;;34265:91;:::o;47647:41::-;;;;;;;;;;;;;;;;;:::o;38641:162::-;38767:28;38777:4;38783:2;38787:7;38767:9;:28::i;:::-;38641:162;;;:::o;47465:41::-;47502:4;47465:41;:::o;48904:74::-;2151:12;:10;:12::i;:::-;2140:23;;:7;:5;:7::i;:::-;:23;;;2132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48965:5:::1;48953:9;;:17;;;;;;;;;;;;;;;;;;48904:74::o:0;49305:165::-;2151:12;:10;:12::i;:::-;2140:23;;:7;:5;:7::i;:::-;:23;;;2132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18065:1:::1;18663:7;;:19;;18655:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;18065:1;18796:7;:18;;;;49368:15:::2;49386:21;49368:39;;49418:44;49444:7;:5;:7::i;:::-;49454;49418:17;:44::i;:::-;49357:113;18021:1:::1;18975:7;:22;;;;49305:165::o:0;38874:177::-;39004:39;39021:4;39027:2;39031:7;39004:39;;;;;;;;;;;;:16;:39::i;:::-;38874:177;;;:::o;36012:124::-;36076:7;36103:20;36115:7;36103:11;:20::i;:::-;:25;;;36096:32;;36012:124;;;:::o;34785:221::-;34849:7;34894:1;34877:19;;:5;:19;;;;34869:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;34970:12;:19;34983:5;34970:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;34962:36;;34955:43;;34785:221;;;:::o;2571:103::-;2151:12;:10;:12::i;:::-;2140:23;;:7;:5;:7::i;:::-;:23;;;2132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2636:30:::1;2663:1;2636:18;:30::i;:::-;2571:103::o:0;1920:87::-;1966:7;1993:6;;;;;;;;;;;1986:13;;1920:87;:::o;49196:101::-;2151:12;:10;:12::i;:::-;2140:23;;:7;:5;:7::i;:::-;:23;;;2132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49286:3:::1;49270:13;:19;;;;;;;;;;;;:::i;:::-;;49196:101:::0;:::o;48986:86::-;2151:12;:10;:12::i;:::-;2140:23;;:7;:5;:7::i;:::-;:23;;;2132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49058:6:::1;49050:5;:14;;;;48986:86:::0;:::o;36372:104::-;36428:13;36461:7;36454:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36372:104;:::o;47566:30::-;;;;:::o;47882:459::-;47738:9;;;;;;;;;;;:39;;;;;47502:4;47751:13;:11;:13::i;:::-;:26;47738:39;47730:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;18065:1:::1;18663:7;;:19;;18655:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;18065:1;18796:7;:18;;;;47999:1:::2;47982:14;:18;47974:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;48052:29;48067:13;:11;:13::i;:::-;47502:4;48052:14;;:29;;;;:::i;:::-;48034:14;:47;;48026:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;48162:18;;48120:38;48139:6;:18;48146:10;48139:18;;;;;;;;;;;;;;;;48120:14;:18;;:38;;;;:::i;:::-;:60;;48112:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;48245:38;48268:14;48245:6;:18;48252:10;48245:18;;;;;;;;;;;;;;;;:22;;:38;;;;:::i;:::-;48224:6;:18;48231:10;48224:18;;;;;;;;;;;;;;;:59;;;;48296:37;48306:10;48318:14;48296:9;:37::i;:::-;18021:1:::1;18975:7;:22;;;;47882:459:::0;:::o;38051:288::-;38158:12;:10;:12::i;:::-;38146:24;;:8;:24;;;;38138:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;38259:8;38214:18;:32;38233:12;:10;:12::i;:::-;38214:32;;;;;;;;;;;;;;;:42;38247:8;38214:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;38312:8;38283:48;;38298:12;:10;:12::i;:::-;38283:48;;;38322:8;38283:48;;;;;;:::i;:::-;;;;;;;;38051:288;;:::o;47515:37::-;;;;:::o;48821:75::-;2151:12;:10;:12::i;:::-;2140:23;;:7;:5;:7::i;:::-;:23;;;2132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48884:4:::1;48872:9;;:16;;;;;;;;;;;;;;;;;;48821:75::o:0;39122:355::-;39281:28;39291:4;39297:2;39301:7;39281:9;:28::i;:::-;39342:48;39365:4;39371:2;39375:7;39384:5;39342:22;:48::i;:::-;39320:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;39122:355;;;;:::o;48463:143::-;48537:13;48575:23;48590:7;48575:14;:23::i;:::-;48568:30;;48463:143;;;:::o;38410:164::-;38507:4;38531:18;:25;38550:5;38531:25;;;;;;;;;;;;;;;:35;38557:8;38531:35;;;;;;;;;;;;;;;;;;;;;;;;;38524:42;;38410:164;;;;:::o;2829:201::-;2151:12;:10;:12::i;:::-;2140:23;;:7;:5;:7::i;:::-;:23;;;2132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2938:1:::1;2918:22;;:8;:22;;;;2910:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2994:28;3013:8;2994:18;:28::i;:::-;2829:201:::0;:::o;32407:157::-;32492:4;32531:25;32516:40;;;:11;:40;;;;32509:47;;32407:157;;;:::o;39732:111::-;39789:4;39823:12;;39813:7;:22;39806:29;;39732:111;;;:::o;638:98::-;691:7;718:10;711:17;;638:98;:::o;44512:196::-;44654:2;44627:15;:24;44643:7;44627:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44692:7;44688:2;44672:28;;44681:5;44672:28;;;;;;;;;;;;44512:196;;;:::o;42460:1934::-;42575:35;42613:20;42625:7;42613:11;:20::i;:::-;42575:58;;42646:22;42688:13;:18;;;42672:34;;:12;:10;:12::i;:::-;:34;;;:83;;;;42743:12;:10;:12::i;:::-;42719:36;;:20;42731:7;42719:11;:20::i;:::-;:36;;;42672:83;:146;;;;42768:50;42785:13;:18;;;42805:12;:10;:12::i;:::-;42768:16;:50::i;:::-;42672:146;42646:173;;42840:17;42832:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;42955:4;42933:26;;:13;:18;;;:26;;;42925:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;43035:1;43021:16;;:2;:16;;;;43013:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;43092:43;43114:4;43120:2;43124:7;43133:1;43092:21;:43::i;:::-;43200:49;43217:1;43221:7;43230:13;:18;;;43200:8;:49::i;:::-;43567:1;43537:12;:18;43550:4;43537:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43607:1;43579:12;:16;43592:2;43579:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43649:2;43621:11;:20;43633:7;43621:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;43707:15;43662:11;:20;43674:7;43662:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;43963:19;43995:1;43985:7;:11;43963:33;;44052:1;44011:43;;:11;:24;44023:11;44011:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;44007:275;;;44075:20;44083:11;44075:7;:20::i;:::-;44071:200;;;44148:13;:18;;;44116:11;:24;44128:11;44116:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;44227:13;:28;;;44185:11;:24;44197:11;44185:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;44071:200;44007:275;43516:773;44325:7;44321:2;44306:27;;44315:4;44306:27;;;;;;;;;;;;44344:42;44365:4;44371:2;44375:7;44384:1;44344:20;:42::i;:::-;42564:1830;;42460:1934;;;:::o;23395:317::-;23510:6;23485:21;:31;;23477:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23564:12;23582:9;:14;;23604:6;23582:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23563:52;;;23634:7;23626:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;23466:246;23395:317;;:::o;35445:505::-;35506:21;;:::i;:::-;35548:16;35556:7;35548;:16::i;:::-;35540:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;35646:12;35661:7;35646:22;;35641:225;35678:1;35670:4;:9;35641:225;;35704:31;35738:11;:17;35750:4;35738:17;;;;;;;;;;;35704:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35800:1;35774:28;;:9;:14;;;:28;;;35770:85;;35830:9;35823:16;;;;;;35770:85;35689:177;35681:6;;;;;;;;35641:225;;;;35885:57;;;;;;;;;;:::i;:::-;;;;;;;;35445:505;;;;:::o;3190:191::-;3264:16;3283:6;;;;;;;;;;;3264:25;;3309:8;3300:6;;:17;;;;;;;;;;;;;;;;;;3364:8;3333:40;;3354:8;3333:40;;;;;;;;;;;;3253:128;3190:191;:::o;6653:98::-;6711:7;6742:1;6738;:5;;;;:::i;:::-;6731:12;;6653:98;;;;:::o;6272:::-;6330:7;6361:1;6357;:5;;;;:::i;:::-;6350:12;;6272:98;;;;:::o;39851:104::-;39920:27;39930:2;39934:8;39920:27;;;;;;;;;;;;:9;:27::i;:::-;39851:104;;:::o;45273:804::-;45428:4;45449:15;:2;:13;;;:15::i;:::-;45445:625;;;45501:2;45485:36;;;45522:12;:10;:12::i;:::-;45536:4;45542:7;45551:5;45485:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45481:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45748:1;45731:6;:13;:18;45727:273;;;45774:61;;;;;;;;;;:::i;:::-;;;;;;;;45727:273;45950:6;45944:13;45935:6;45931:2;45927:15;45920:38;45481:534;45618:45;;;45608:55;;;:6;:55;;;;45601:62;;;;;45445:625;46054:4;46047:11;;45273:804;;;;;;;:::o;36547:335::-;36620:13;36654:16;36662:7;36654;:16::i;:::-;36646:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;36735:21;36759:10;:8;:10::i;:::-;36735:34;;36812:1;36793:7;36787:21;:26;;:87;;;;;;;;;;;;;;;;;36840:7;36849:18;:7;:16;:18::i;:::-;36823:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36787:87;36780:94;;;36547:335;;;:::o;46565:159::-;;;;;:::o;47136:158::-;;;;;:::o;40318:163::-;40441:32;40447:2;40451:8;40461:5;40468:4;40441:5;:32::i;:::-;40318:163;;;:::o;22134:326::-;22194:4;22451:1;22429:7;:19;;;:23;22422:30;;22134:326;;;:::o;48349:106::-;48401:13;48434;48427:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48349:106;:::o;29777:723::-;29833:13;30063:1;30054:5;:10;30050:53;;;30081:10;;;;;;;;;;;;;;;;;;;;;30050:53;30113:12;30128:5;30113:20;;30144:14;30169:78;30184:1;30176:4;:9;30169:78;;30202:8;;;;;:::i;:::-;;;;30233:2;30225:10;;;;;:::i;:::-;;;30169:78;;;30257:19;30289:6;30279:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30257:39;;30307:154;30323:1;30314:5;:10;30307:154;;30351:1;30341:11;;;;;:::i;:::-;;;30418:2;30410:5;:10;;;;:::i;:::-;30397:2;:24;;;;:::i;:::-;30384:39;;30367:6;30374;30367:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;30447:2;30438:11;;;;;:::i;:::-;;;30307:154;;;30485:6;30471:21;;;;;29777:723;;;;:::o;40740:1466::-;40879:20;40902:12;;40879:35;;40947:1;40933:16;;:2;:16;;;;40925:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;41018:1;41006:8;:13;;40998:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;41077:61;41107:1;41111:2;41115:12;41129:8;41077:21;:61::i;:::-;41444:8;41408:12;:16;41421:2;41408:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41505:8;41464:12;:16;41477:2;41464:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41560:2;41527:11;:25;41539:12;41527:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;41623:15;41573:11;:25;41585:12;41573:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;41652:20;41675:12;41652:35;;41705:9;41700:379;41720:8;41716:1;:12;41700:379;;;41780:12;41776:2;41755:38;;41772:1;41755:38;;;;;;;;;;;;41812:4;41808:229;;;41867:59;41898:1;41902:2;41906:12;41920:5;41867:22;:59::i;:::-;41837:184;;;;;;;;;;;;:::i;:::-;;;;;;;;;41808:229;42053:14;;;;;;;41730:3;;;;;;;41700:379;;;;42106:12;42091;:27;;;;41387:739;42138:60;42167:1;42171:2;42175:12;42189:8;42138:20;:60::i;:::-;40868:1338;40740:1466;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:118::-;7245:24;7263:5;7245:24;:::i;:::-;7240:3;7233:37;7158:118;;:::o;7282:109::-;7363:21;7378:5;7363:21;:::i;:::-;7358:3;7351:34;7282:109;;:::o;7397:360::-;7483:3;7511:38;7543:5;7511:38;:::i;:::-;7565:70;7628:6;7623:3;7565:70;:::i;:::-;7558:77;;7644:52;7689:6;7684:3;7677:4;7670:5;7666:16;7644:52;:::i;:::-;7721:29;7743:6;7721:29;:::i;:::-;7716:3;7712:39;7705:46;;7487:270;7397:360;;;;:::o;7763:364::-;7851:3;7879:39;7912:5;7879:39;:::i;:::-;7934:71;7998:6;7993:3;7934:71;:::i;:::-;7927:78;;8014:52;8059:6;8054:3;8047:4;8040:5;8036:16;8014:52;:::i;:::-;8091:29;8113:6;8091:29;:::i;:::-;8086:3;8082:39;8075:46;;7855:272;7763:364;;;;:::o;8133:377::-;8239:3;8267:39;8300:5;8267:39;:::i;:::-;8322:89;8404:6;8399:3;8322:89;:::i;:::-;8315:96;;8420:52;8465:6;8460:3;8453:4;8446:5;8442:16;8420:52;:::i;:::-;8497:6;8492:3;8488:16;8481:23;;8243:267;8133:377;;;;:::o;8516:366::-;8658:3;8679:67;8743:2;8738:3;8679:67;:::i;:::-;8672:74;;8755:93;8844:3;8755:93;:::i;:::-;8873:2;8868:3;8864:12;8857:19;;8516:366;;;:::o;8888:::-;9030:3;9051:67;9115:2;9110:3;9051:67;:::i;:::-;9044:74;;9127:93;9216:3;9127:93;:::i;:::-;9245:2;9240:3;9236:12;9229:19;;8888:366;;;:::o;9260:::-;9402:3;9423:67;9487:2;9482:3;9423:67;:::i;:::-;9416:74;;9499:93;9588:3;9499:93;:::i;:::-;9617:2;9612:3;9608:12;9601:19;;9260:366;;;:::o;9632:::-;9774:3;9795:67;9859:2;9854:3;9795:67;:::i;:::-;9788:74;;9871:93;9960:3;9871:93;:::i;:::-;9989:2;9984:3;9980:12;9973:19;;9632:366;;;:::o;10004:::-;10146:3;10167:67;10231:2;10226:3;10167:67;:::i;:::-;10160:74;;10243:93;10332:3;10243:93;:::i;:::-;10361:2;10356:3;10352:12;10345:19;;10004:366;;;:::o;10376:::-;10518:3;10539:67;10603:2;10598:3;10539:67;:::i;:::-;10532:74;;10615:93;10704:3;10615:93;:::i;:::-;10733:2;10728:3;10724:12;10717:19;;10376:366;;;:::o;10748:::-;10890:3;10911:67;10975:2;10970:3;10911:67;:::i;:::-;10904:74;;10987:93;11076:3;10987:93;:::i;:::-;11105:2;11100:3;11096:12;11089:19;;10748:366;;;:::o;11120:::-;11262:3;11283:67;11347:2;11342:3;11283:67;:::i;:::-;11276:74;;11359:93;11448:3;11359:93;:::i;:::-;11477:2;11472:3;11468:12;11461:19;;11120:366;;;:::o;11492:::-;11634:3;11655:67;11719:2;11714:3;11655:67;:::i;:::-;11648:74;;11731:93;11820:3;11731:93;:::i;:::-;11849:2;11844:3;11840:12;11833:19;;11492:366;;;:::o;11864:::-;12006:3;12027:67;12091:2;12086:3;12027:67;:::i;:::-;12020:74;;12103:93;12192:3;12103:93;:::i;:::-;12221:2;12216:3;12212:12;12205:19;;11864:366;;;:::o;12236:::-;12378:3;12399:67;12463:2;12458:3;12399:67;:::i;:::-;12392:74;;12475:93;12564:3;12475:93;:::i;:::-;12593:2;12588:3;12584:12;12577:19;;12236:366;;;:::o;12608:::-;12750:3;12771:67;12835:2;12830:3;12771:67;:::i;:::-;12764:74;;12847:93;12936:3;12847:93;:::i;:::-;12965:2;12960:3;12956:12;12949:19;;12608:366;;;:::o;12980:::-;13122:3;13143:67;13207:2;13202:3;13143:67;:::i;:::-;13136:74;;13219:93;13308:3;13219:93;:::i;:::-;13337:2;13332:3;13328:12;13321:19;;12980:366;;;:::o;13352:::-;13494:3;13515:67;13579:2;13574:3;13515:67;:::i;:::-;13508:74;;13591:93;13680:3;13591:93;:::i;:::-;13709:2;13704:3;13700:12;13693:19;;13352:366;;;:::o;13724:::-;13866:3;13887:67;13951:2;13946:3;13887:67;:::i;:::-;13880:74;;13963:93;14052:3;13963:93;:::i;:::-;14081:2;14076:3;14072:12;14065:19;;13724:366;;;:::o;14096:::-;14238:3;14259:67;14323:2;14318:3;14259:67;:::i;:::-;14252:74;;14335:93;14424:3;14335:93;:::i;:::-;14453:2;14448:3;14444:12;14437:19;;14096:366;;;:::o;14468:398::-;14627:3;14648:83;14729:1;14724:3;14648:83;:::i;:::-;14641:90;;14740:93;14829:3;14740:93;:::i;:::-;14858:1;14853:3;14849:11;14842:18;;14468:398;;;:::o;14872:366::-;15014:3;15035:67;15099:2;15094:3;15035:67;:::i;:::-;15028:74;;15111:93;15200:3;15111:93;:::i;:::-;15229:2;15224:3;15220:12;15213:19;;14872:366;;;:::o;15244:::-;15386:3;15407:67;15471:2;15466:3;15407:67;:::i;:::-;15400:74;;15483:93;15572:3;15483:93;:::i;:::-;15601:2;15596:3;15592:12;15585:19;;15244:366;;;:::o;15616:::-;15758:3;15779:67;15843:2;15838:3;15779:67;:::i;:::-;15772:74;;15855:93;15944:3;15855:93;:::i;:::-;15973:2;15968:3;15964:12;15957:19;;15616:366;;;:::o;15988:::-;16130:3;16151:67;16215:2;16210:3;16151:67;:::i;:::-;16144:74;;16227:93;16316:3;16227:93;:::i;:::-;16345:2;16340:3;16336:12;16329:19;;15988:366;;;:::o;16360:::-;16502:3;16523:67;16587:2;16582:3;16523:67;:::i;:::-;16516:74;;16599:93;16688:3;16599:93;:::i;:::-;16717:2;16712:3;16708:12;16701:19;;16360:366;;;:::o;16732:::-;16874:3;16895:67;16959:2;16954:3;16895:67;:::i;:::-;16888:74;;16971:93;17060:3;16971:93;:::i;:::-;17089:2;17084:3;17080:12;17073:19;;16732:366;;;:::o;17104:::-;17246:3;17267:67;17331:2;17326:3;17267:67;:::i;:::-;17260:74;;17343:93;17432:3;17343:93;:::i;:::-;17461:2;17456:3;17452:12;17445:19;;17104:366;;;:::o;17476:118::-;17563:24;17581:5;17563:24;:::i;:::-;17558:3;17551:37;17476:118;;:::o;17600:435::-;17780:3;17802:95;17893:3;17884:6;17802:95;:::i;:::-;17795:102;;17914:95;18005:3;17996:6;17914:95;:::i;:::-;17907:102;;18026:3;18019:10;;17600:435;;;;;:::o;18041:379::-;18225:3;18247:147;18390:3;18247:147;:::i;:::-;18240:154;;18411:3;18404:10;;18041:379;;;:::o;18426:222::-;18519:4;18557:2;18546:9;18542:18;18534:26;;18570:71;18638:1;18627:9;18623:17;18614:6;18570:71;:::i;:::-;18426:222;;;;:::o;18654:640::-;18849:4;18887:3;18876:9;18872:19;18864:27;;18901:71;18969:1;18958:9;18954:17;18945:6;18901:71;:::i;:::-;18982:72;19050:2;19039:9;19035:18;19026:6;18982:72;:::i;:::-;19064;19132:2;19121:9;19117:18;19108:6;19064:72;:::i;:::-;19183:9;19177:4;19173:20;19168:2;19157:9;19153:18;19146:48;19211:76;19282:4;19273:6;19211:76;:::i;:::-;19203:84;;18654:640;;;;;;;:::o;19300:210::-;19387:4;19425:2;19414:9;19410:18;19402:26;;19438:65;19500:1;19489:9;19485:17;19476:6;19438:65;:::i;:::-;19300:210;;;;:::o;19516:313::-;19629:4;19667:2;19656:9;19652:18;19644:26;;19716:9;19710:4;19706:20;19702:1;19691:9;19687:17;19680:47;19744:78;19817:4;19808:6;19744:78;:::i;:::-;19736:86;;19516:313;;;;:::o;19835:419::-;20001:4;20039:2;20028:9;20024:18;20016:26;;20088:9;20082:4;20078:20;20074:1;20063:9;20059:17;20052:47;20116:131;20242:4;20116:131;:::i;:::-;20108:139;;19835:419;;;:::o;20260:::-;20426:4;20464:2;20453:9;20449:18;20441:26;;20513:9;20507:4;20503:20;20499:1;20488:9;20484:17;20477:47;20541:131;20667:4;20541:131;:::i;:::-;20533:139;;20260:419;;;:::o;20685:::-;20851:4;20889:2;20878:9;20874:18;20866:26;;20938:9;20932:4;20928:20;20924:1;20913:9;20909:17;20902:47;20966:131;21092:4;20966:131;:::i;:::-;20958:139;;20685:419;;;:::o;21110:::-;21276:4;21314:2;21303:9;21299:18;21291:26;;21363:9;21357:4;21353:20;21349:1;21338:9;21334:17;21327:47;21391:131;21517:4;21391:131;:::i;:::-;21383:139;;21110:419;;;:::o;21535:::-;21701:4;21739:2;21728:9;21724:18;21716:26;;21788:9;21782:4;21778:20;21774:1;21763:9;21759:17;21752:47;21816:131;21942:4;21816:131;:::i;:::-;21808:139;;21535:419;;;:::o;21960:::-;22126:4;22164:2;22153:9;22149:18;22141:26;;22213:9;22207:4;22203:20;22199:1;22188:9;22184:17;22177:47;22241:131;22367:4;22241:131;:::i;:::-;22233:139;;21960:419;;;:::o;22385:::-;22551:4;22589:2;22578:9;22574:18;22566:26;;22638:9;22632:4;22628:20;22624:1;22613:9;22609:17;22602:47;22666:131;22792:4;22666:131;:::i;:::-;22658:139;;22385:419;;;:::o;22810:::-;22976:4;23014:2;23003:9;22999:18;22991:26;;23063:9;23057:4;23053:20;23049:1;23038:9;23034:17;23027:47;23091:131;23217:4;23091:131;:::i;:::-;23083:139;;22810:419;;;:::o;23235:::-;23401:4;23439:2;23428:9;23424:18;23416:26;;23488:9;23482:4;23478:20;23474:1;23463:9;23459:17;23452:47;23516:131;23642:4;23516:131;:::i;:::-;23508:139;;23235:419;;;:::o;23660:::-;23826:4;23864:2;23853:9;23849:18;23841:26;;23913:9;23907:4;23903:20;23899:1;23888:9;23884:17;23877:47;23941:131;24067:4;23941:131;:::i;:::-;23933:139;;23660:419;;;:::o;24085:::-;24251:4;24289:2;24278:9;24274:18;24266:26;;24338:9;24332:4;24328:20;24324:1;24313:9;24309:17;24302:47;24366:131;24492:4;24366:131;:::i;:::-;24358:139;;24085:419;;;:::o;24510:::-;24676:4;24714:2;24703:9;24699:18;24691:26;;24763:9;24757:4;24753:20;24749:1;24738:9;24734:17;24727:47;24791:131;24917:4;24791:131;:::i;:::-;24783:139;;24510:419;;;:::o;24935:::-;25101:4;25139:2;25128:9;25124:18;25116:26;;25188:9;25182:4;25178:20;25174:1;25163:9;25159:17;25152:47;25216:131;25342:4;25216:131;:::i;:::-;25208:139;;24935:419;;;:::o;25360:::-;25526:4;25564:2;25553:9;25549:18;25541:26;;25613:9;25607:4;25603:20;25599:1;25588:9;25584:17;25577:47;25641:131;25767:4;25641:131;:::i;:::-;25633:139;;25360:419;;;:::o;25785:::-;25951:4;25989:2;25978:9;25974:18;25966:26;;26038:9;26032:4;26028:20;26024:1;26013:9;26009:17;26002:47;26066:131;26192:4;26066:131;:::i;:::-;26058:139;;25785:419;;;:::o;26210:::-;26376:4;26414:2;26403:9;26399:18;26391:26;;26463:9;26457:4;26453:20;26449:1;26438:9;26434:17;26427:47;26491:131;26617:4;26491:131;:::i;:::-;26483:139;;26210:419;;;:::o;26635:::-;26801:4;26839:2;26828:9;26824:18;26816:26;;26888:9;26882:4;26878:20;26874:1;26863:9;26859:17;26852:47;26916:131;27042:4;26916:131;:::i;:::-;26908:139;;26635:419;;;:::o;27060:::-;27226:4;27264:2;27253:9;27249:18;27241:26;;27313:9;27307:4;27303:20;27299:1;27288:9;27284:17;27277:47;27341:131;27467:4;27341:131;:::i;:::-;27333:139;;27060:419;;;:::o;27485:::-;27651:4;27689:2;27678:9;27674:18;27666:26;;27738:9;27732:4;27728:20;27724:1;27713:9;27709:17;27702:47;27766:131;27892:4;27766:131;:::i;:::-;27758:139;;27485:419;;;:::o;27910:::-;28076:4;28114:2;28103:9;28099:18;28091:26;;28163:9;28157:4;28153:20;28149:1;28138:9;28134:17;28127:47;28191:131;28317:4;28191:131;:::i;:::-;28183:139;;27910:419;;;:::o;28335:::-;28501:4;28539:2;28528:9;28524:18;28516:26;;28588:9;28582:4;28578:20;28574:1;28563:9;28559:17;28552:47;28616:131;28742:4;28616:131;:::i;:::-;28608:139;;28335:419;;;:::o;28760:::-;28926:4;28964:2;28953:9;28949:18;28941:26;;29013:9;29007:4;29003:20;28999:1;28988:9;28984:17;28977:47;29041:131;29167:4;29041:131;:::i;:::-;29033:139;;28760:419;;;:::o;29185:::-;29351:4;29389:2;29378:9;29374:18;29366:26;;29438:9;29432:4;29428:20;29424:1;29413:9;29409:17;29402:47;29466:131;29592:4;29466:131;:::i;:::-;29458:139;;29185:419;;;:::o;29610:222::-;29703:4;29741:2;29730:9;29726:18;29718:26;;29754:71;29822:1;29811:9;29807:17;29798:6;29754:71;:::i;:::-;29610:222;;;;:::o;29838:129::-;29872:6;29899:20;;:::i;:::-;29889:30;;29928:33;29956:4;29948:6;29928:33;:::i;:::-;29838:129;;;:::o;29973:75::-;30006:6;30039:2;30033:9;30023:19;;29973:75;:::o;30054:307::-;30115:4;30205:18;30197:6;30194:30;30191:56;;;30227:18;;:::i;:::-;30191:56;30265:29;30287:6;30265:29;:::i;:::-;30257:37;;30349:4;30343;30339:15;30331:23;;30054:307;;;:::o;30367:308::-;30429:4;30519:18;30511:6;30508:30;30505:56;;;30541:18;;:::i;:::-;30505:56;30579:29;30601:6;30579:29;:::i;:::-;30571:37;;30663:4;30657;30653:15;30645:23;;30367:308;;;:::o;30681:98::-;30732:6;30766:5;30760:12;30750:22;;30681:98;;;:::o;30785:99::-;30837:6;30871:5;30865:12;30855:22;;30785:99;;;:::o;30890:168::-;30973:11;31007:6;31002:3;30995:19;31047:4;31042:3;31038:14;31023:29;;30890:168;;;;:::o;31064:147::-;31165:11;31202:3;31187:18;;31064:147;;;;:::o;31217:169::-;31301:11;31335:6;31330:3;31323:19;31375:4;31370:3;31366:14;31351:29;;31217:169;;;;:::o;31392:148::-;31494:11;31531:3;31516:18;;31392:148;;;;:::o;31546:305::-;31586:3;31605:20;31623:1;31605:20;:::i;:::-;31600:25;;31639:20;31657:1;31639:20;:::i;:::-;31634:25;;31793:1;31725:66;31721:74;31718:1;31715:81;31712:107;;;31799:18;;:::i;:::-;31712:107;31843:1;31840;31836:9;31829:16;;31546:305;;;;:::o;31857:185::-;31897:1;31914:20;31932:1;31914:20;:::i;:::-;31909:25;;31948:20;31966:1;31948:20;:::i;:::-;31943:25;;31987:1;31977:35;;31992:18;;:::i;:::-;31977:35;32034:1;32031;32027:9;32022:14;;31857:185;;;;:::o;32048:191::-;32088:4;32108:20;32126:1;32108:20;:::i;:::-;32103:25;;32142:20;32160:1;32142:20;:::i;:::-;32137:25;;32181:1;32178;32175:8;32172:34;;;32186:18;;:::i;:::-;32172:34;32231:1;32228;32224:9;32216:17;;32048:191;;;;:::o;32245:96::-;32282:7;32311:24;32329:5;32311:24;:::i;:::-;32300:35;;32245:96;;;:::o;32347:90::-;32381:7;32424:5;32417:13;32410:21;32399:32;;32347:90;;;:::o;32443:149::-;32479:7;32519:66;32512:5;32508:78;32497:89;;32443:149;;;:::o;32598:126::-;32635:7;32675:42;32668:5;32664:54;32653:65;;32598:126;;;:::o;32730:77::-;32767:7;32796:5;32785:16;;32730:77;;;:::o;32813:154::-;32897:6;32892:3;32887;32874:30;32959:1;32950:6;32945:3;32941:16;32934:27;32813:154;;;:::o;32973:307::-;33041:1;33051:113;33065:6;33062:1;33059:13;33051:113;;;33150:1;33145:3;33141:11;33135:18;33131:1;33126:3;33122:11;33115:39;33087:2;33084:1;33080:10;33075:15;;33051:113;;;33182:6;33179:1;33176:13;33173:101;;;33262:1;33253:6;33248:3;33244:16;33237:27;33173:101;33022:258;32973:307;;;:::o;33286:320::-;33330:6;33367:1;33361:4;33357:12;33347:22;;33414:1;33408:4;33404:12;33435:18;33425:81;;33491:4;33483:6;33479:17;33469:27;;33425:81;33553:2;33545:6;33542:14;33522:18;33519:38;33516:84;;;33572:18;;:::i;:::-;33516:84;33337:269;33286:320;;;:::o;33612:281::-;33695:27;33717:4;33695:27;:::i;:::-;33687:6;33683:40;33825:6;33813:10;33810:22;33789:18;33777:10;33774:34;33771:62;33768:88;;;33836:18;;:::i;:::-;33768:88;33876:10;33872:2;33865:22;33655:238;33612:281;;:::o;33899:233::-;33938:3;33961:24;33979:5;33961:24;:::i;:::-;33952:33;;34007:66;34000:5;33997:77;33994:103;;;34077:18;;:::i;:::-;33994:103;34124:1;34117:5;34113:13;34106:20;;33899:233;;;:::o;34138:176::-;34170:1;34187:20;34205:1;34187:20;:::i;:::-;34182:25;;34221:20;34239:1;34221:20;:::i;:::-;34216:25;;34260:1;34250:35;;34265:18;;:::i;:::-;34250:35;34306:1;34303;34299:9;34294:14;;34138:176;;;;:::o;34320:180::-;34368:77;34365:1;34358:88;34465:4;34462:1;34455:15;34489:4;34486:1;34479:15;34506:180;34554:77;34551:1;34544:88;34651:4;34648:1;34641:15;34675:4;34672:1;34665:15;34692:180;34740:77;34737:1;34730:88;34837:4;34834:1;34827:15;34861:4;34858:1;34851:15;34878:180;34926:77;34923:1;34916:88;35023:4;35020:1;35013:15;35047:4;35044:1;35037:15;35064:180;35112:77;35109:1;35102:88;35209:4;35206:1;35199:15;35233:4;35230:1;35223:15;35250:117;35359:1;35356;35349:12;35373:117;35482:1;35479;35472:12;35496:117;35605:1;35602;35595:12;35619:117;35728:1;35725;35718:12;35742:102;35783:6;35834:2;35830:7;35825:2;35818:5;35814:14;35810:28;35800:38;;35742:102;;;:::o;35850:225::-;35990:34;35986:1;35978:6;35974:14;35967:58;36059:8;36054:2;36046:6;36042:15;36035:33;35850:225;:::o;36081:229::-;36221:34;36217:1;36209:6;36205:14;36198:58;36290:12;36285:2;36277:6;36273:15;36266:37;36081:229;:::o;36316:160::-;36456:12;36452:1;36444:6;36440:14;36433:36;36316:160;:::o;36482:224::-;36622:34;36618:1;36610:6;36606:14;36599:58;36691:7;36686:2;36678:6;36674:15;36667:32;36482:224;:::o;36712:168::-;36852:20;36848:1;36840:6;36836:14;36829:44;36712:168;:::o;36886:245::-;37026:34;37022:1;37014:6;37010:14;37003:58;37095:28;37090:2;37082:6;37078:15;37071:53;36886:245;:::o;37137:179::-;37277:31;37273:1;37265:6;37261:14;37254:55;37137:179;:::o;37322:165::-;37462:17;37458:1;37450:6;37446:14;37439:41;37322:165;:::o;37493:244::-;37633:34;37629:1;37621:6;37617:14;37610:58;37702:27;37697:2;37689:6;37685:15;37678:52;37493:244;:::o;37743:230::-;37883:34;37879:1;37871:6;37867:14;37860:58;37952:13;37947:2;37939:6;37935:15;37928:38;37743:230;:::o;37979:225::-;38119:34;38115:1;38107:6;38103:14;38096:58;38188:8;38183:2;38175:6;38171:15;38164:33;37979:225;:::o;38210:182::-;38350:34;38346:1;38338:6;38334:14;38327:58;38210:182;:::o;38398:234::-;38538:34;38534:1;38526:6;38522:14;38515:58;38607:17;38602:2;38594:6;38590:15;38583:42;38398:234;:::o;38638:176::-;38778:28;38774:1;38766:6;38762:14;38755:52;38638:176;:::o;38820:237::-;38960:34;38956:1;38948:6;38944:14;38937:58;39029:20;39024:2;39016:6;39012:15;39005:45;38820:237;:::o;39063:221::-;39203:34;39199:1;39191:6;39187:14;39180:58;39272:4;39267:2;39259:6;39255:15;39248:29;39063:221;:::o;39290:114::-;;:::o;39410:238::-;39550:34;39546:1;39538:6;39534:14;39527:58;39619:21;39614:2;39606:6;39602:15;39595:46;39410:238;:::o;39654:160::-;39794:12;39790:1;39782:6;39778:14;39771:36;39654:160;:::o;39820:220::-;39960:34;39956:1;39948:6;39944:14;39937:58;40029:3;40024:2;40016:6;40012:15;40005:28;39820:220;:::o;40046:227::-;40186:34;40182:1;40174:6;40170:14;40163:58;40255:10;40250:2;40242:6;40238:15;40231:35;40046:227;:::o;40279:181::-;40419:33;40415:1;40407:6;40403:14;40396:57;40279:181;:::o;40466:234::-;40606:34;40602:1;40594:6;40590:14;40583:58;40675:17;40670:2;40662:6;40658:15;40651:42;40466:234;:::o;40706:232::-;40846:34;40842:1;40834:6;40830:14;40823:58;40915:15;40910:2;40902:6;40898:15;40891:40;40706:232;:::o;40944:122::-;41017:24;41035:5;41017:24;:::i;:::-;41010:5;41007:35;40997:63;;41056:1;41053;41046:12;40997:63;40944:122;:::o;41072:116::-;41142:21;41157:5;41142:21;:::i;:::-;41135:5;41132:32;41122:60;;41178:1;41175;41168:12;41122:60;41072:116;:::o;41194:120::-;41266:23;41283:5;41266:23;:::i;:::-;41259:5;41256:34;41246:62;;41304:1;41301;41294:12;41246:62;41194:120;:::o;41320:122::-;41393:24;41411:5;41393:24;:::i;:::-;41386:5;41383:35;41373:63;;41432:1;41429;41422:12;41373:63;41320:122;:::o

Swarm Source

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