ETH Price: $3,434.56 (+4.06%)

Token

SmolPunks (SMOL)
 

Overview

Max Total Supply

3,333 SMOL

Holders

1,293

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
posers customised: Deployer
Balance
3 SMOL
0xa12eeeaad1d13f0938febd6a1b0e8b10ab31dbd6
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:
Smol

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-17
*/

// SPDX-License-Identifier: None
/*
░██████╗███╗░░░███╗░█████╗░██╗░░░░░██████╗░██╗░░░██╗███╗░░██╗██╗░░██╗░██████╗
██╔════╝████╗░████║██╔══██╗██║░░░░░██╔══██╗██║░░░██║████╗░██║██║░██╔╝██╔════╝
╚█████╗░██╔████╔██║██║░░██║██║░░░░░██████╔╝██║░░░██║██╔██╗██║█████═╝░╚█████╗░
░╚═══██╗██║╚██╔╝██║██║░░██║██║░░░░░██╔═══╝░██║░░░██║██║╚████║██╔═██╗░░╚═══██╗
██████╔╝██║░╚═╝░██║╚█████╔╝███████╗██║░░░░░╚██████╔╝██║░╚███║██║░╚██╗██████╔╝
╚═════╝░╚═╝░░░░░╚═╝░╚════╝░╚══════╝╚═╝░░░░░░╚═════╝░╚═╝░░╚══╝╚═╝░░╚═╝╚═════╝░  
*/

interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/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`, 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 Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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

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

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



pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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/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/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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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

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

// OpenZeppelin Contracts v4.4.1 (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 substraction 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;
        }
    }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        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 virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: 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 virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

        _balances[to] += 1;
        _owners[tokenId] = to;

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), 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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}



// File: @openzeppelin/contracts/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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

pragma solidity ^0.8.0;

contract Smol is Ownable, ERC721 {
  
  using SafeMath for uint256;
  using Counters for Counters.Counter;
  Counters.Counter private _tokenIdCounter;
  
  uint256 public mintPrice = .01 ether;
  uint256 public maxSupply = 3333;
  uint256 public freeMintAmount = 666;
  uint256 private mintLimit = 3;
  string private baseURI;
  bool public publicSaleState = false;
  bool public revealed = false;
  string private base_URI_tail = ".json";
  string private hiddenURI = "ipfs://Qmc9sSJVnFgDPmbJz1fLiYmHsMoTWTaDWxkwadV49WgvuB/hidden.json";

  constructor() ERC721("SmolPunks", "SMOL") { 
  }

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

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

  function tokenURI(uint256 _tokenId) public view override returns (string memory) {
    require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
    if(revealed == false) {
        return hiddenURI; 
    }
  string memory currentBaseURI = _baseURI();
  return string(abi.encodePacked(currentBaseURI, Strings.toString(_tokenId), base_URI_tail));
  }  

  function reveal() public onlyOwner returns(bool) {
    revealed = !revealed;
    return revealed;
  }
      
  function changeStatePublicSale() public onlyOwner returns(bool) {
    publicSaleState = !publicSaleState;
    return publicSaleState;
  }

  function mint(uint numberOfTokens) external payable {
    require(publicSaleState, "Sale is not active");
    require(_tokenIdCounter.current() <= maxSupply, "Not enough tokens left");
    require(numberOfTokens <= mintLimit, "Too many tokens for one transaction");
    if(_tokenIdCounter.current() >= freeMintAmount){
        require(msg.value >= mintPrice.mul(numberOfTokens), "Insufficient payment");
    }
    mintInternal(msg.sender, numberOfTokens);
  }
 
  function mintInternal(address wallet, uint amount) internal {
    uint currentTokenSupply = _tokenIdCounter.current();
    require(currentTokenSupply.add(amount) <= maxSupply, "Not enough tokens left");
        for(uint i = 0; i< amount; i++){
        currentTokenSupply++;
        _safeMint(wallet, currentTokenSupply);
        _tokenIdCounter.increment();
    }
  }
  
  function reserve(uint256 numberOfTokens) external onlyOwner {
    mintInternal(msg.sender, numberOfTokens);
  }
  function setfreeAmount(uint16 _newFreeMints) public onlyOwner() {
    freeMintAmount = _newFreeMints;
  }

  function totalSupply() public view returns (uint){
    return _tokenIdCounter.current();
  }

  function withdraw() public onlyOwner {
    require(address(this).balance > 0, "No balance to withdraw");
    payable(owner()).transfer(address(this).balance); 
    }
}

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":[{"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":"changeStatePublicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","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":[],"name":"mintPrice","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":"publicSaleState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_newFreeMints","type":"uint16"}],"name":"setfreeAmount","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"}]

6080604052662386f26fc10000600855610d0560095561029a600a556003600b556000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff0219169083151502179055506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600e9080519060200190620000a392919062000276565b5060405180608001604052806041815260200162003ebc60419139600f9080519060200190620000d592919062000276565b50348015620000e357600080fd5b506040518060400160405280600981526020017f536d6f6c50756e6b7300000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f534d4f4c000000000000000000000000000000000000000000000000000000008152506200017062000164620001aa60201b60201c565b620001b260201b60201c565b81600190805190602001906200018892919062000276565b508060029080519060200190620001a192919062000276565b5050506200038b565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002849062000355565b90600052602060002090601f016020900481019282620002a85760008555620002f4565b82601f10620002c357805160ff1916838001178555620002f4565b82800160010185558215620002f4579182015b82811115620002f3578251825591602001919060010190620002d6565b5b50905062000303919062000307565b5090565b5b808211156200032257600081600090555060010162000308565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200036e57607f821691505b6020821081141562000385576200038462000326565b5b50919050565b613b21806200039b6000396000f3fe6080604052600436106101c25760003560e01c806370a08231116100f7578063a22cb46511610095578063d1cbf17d11610064578063d1cbf17d1461060d578063d5abeb0114610638578063e985e9c514610663578063f2fde38b146106a0576101c2565b8063a22cb46514610553578063a475b5dd1461057c578063b88d4fde146105a7578063c87b56dd146105d0576101c2565b8063819b25ba116100d1578063819b25ba146104b85780638da5cb5b146104e157806395d89b411461050c578063a0712d6814610537576101c2565b806370a0823114610439578063715018a61461047657806371adc02a1461048d576101c2565b80633a467e3d11610164578063518302271161013e578063518302271461037d57806355f804b3146103a85780636352211e146103d15780636817c76c1461040e576101c2565b80633a467e3d146103125780633ccfd60b1461033d57806342842e0e14610354576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806318160ddd1461029557806323b872dd146102c05780632d46d6ff146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612555565b6106c9565b6040516101fb919061259d565b60405180910390f35b34801561021057600080fd5b506102196107ab565b6040516102269190612651565b60405180910390f35b34801561023b57600080fd5b50610256600480360381019061025191906126a9565b61083d565b6040516102639190612717565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e919061275e565b6108c2565b005b3480156102a157600080fd5b506102aa6109da565b6040516102b791906127ad565b60405180910390f35b3480156102cc57600080fd5b506102e760048036038101906102e291906127c8565b6109eb565b005b3480156102f557600080fd5b50610310600480360381019061030b9190612855565b610a4b565b005b34801561031e57600080fd5b50610327610ad5565b60405161033491906127ad565b60405180910390f35b34801561034957600080fd5b50610352610adb565b005b34801561036057600080fd5b5061037b600480360381019061037691906127c8565b610bea565b005b34801561038957600080fd5b50610392610c0a565b60405161039f919061259d565b60405180910390f35b3480156103b457600080fd5b506103cf60048036038101906103ca91906128e7565b610c1d565b005b3480156103dd57600080fd5b506103f860048036038101906103f391906126a9565b610caf565b6040516104059190612717565b60405180910390f35b34801561041a57600080fd5b50610423610d61565b60405161043091906127ad565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b9190612934565b610d67565b60405161046d91906127ad565b60405180910390f35b34801561048257600080fd5b5061048b610e1f565b005b34801561049957600080fd5b506104a2610ea7565b6040516104af919061259d565b60405180910390f35b3480156104c457600080fd5b506104df60048036038101906104da91906126a9565b610eba565b005b3480156104ed57600080fd5b506104f6610f43565b6040516105039190612717565b60405180910390f35b34801561051857600080fd5b50610521610f6c565b60405161052e9190612651565b60405180910390f35b610551600480360381019061054c91906126a9565b610ffe565b005b34801561055f57600080fd5b5061057a6004803603810190610575919061298d565b611157565b005b34801561058857600080fd5b506105916112d8565b60405161059e919061259d565b60405180910390f35b3480156105b357600080fd5b506105ce60048036038101906105c99190612afd565b611395565b005b3480156105dc57600080fd5b506105f760048036038101906105f291906126a9565b6113f7565b6040516106049190612651565b60405180910390f35b34801561061957600080fd5b50610622611531565b60405161062f919061259d565b60405180910390f35b34801561064457600080fd5b5061064d6115ee565b60405161065a91906127ad565b60405180910390f35b34801561066f57600080fd5b5061068a60048036038101906106859190612b80565b6115f4565b604051610697919061259d565b60405180910390f35b3480156106ac57600080fd5b506106c760048036038101906106c29190612934565b611688565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061079457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107a457506107a382611780565b5b9050919050565b6060600180546107ba90612bef565b80601f01602080910402602001604051908101604052809291908181526020018280546107e690612bef565b80156108335780601f1061080857610100808354040283529160200191610833565b820191906000526020600020905b81548152906001019060200180831161081657829003601f168201915b5050505050905090565b6000610848826117ea565b610887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087e90612c93565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108cd82610caf565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561093e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093590612d25565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661095d611856565b73ffffffffffffffffffffffffffffffffffffffff16148061098c575061098b81610986611856565b6115f4565b5b6109cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c290612db7565b60405180910390fd5b6109d5838361185e565b505050565b60006109e66007611917565b905090565b6109fc6109f6611856565b82611925565b610a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3290612e49565b60405180910390fd5b610a46838383611a03565b505050565b610a53611856565b73ffffffffffffffffffffffffffffffffffffffff16610a71610f43565b73ffffffffffffffffffffffffffffffffffffffff1614610ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abe90612eb5565b60405180910390fd5b8061ffff16600a8190555050565b600a5481565b610ae3611856565b73ffffffffffffffffffffffffffffffffffffffff16610b01610f43565b73ffffffffffffffffffffffffffffffffffffffff1614610b57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4e90612eb5565b60405180910390fd5b60004711610b9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9190612f21565b60405180910390fd5b610ba2610f43565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610be7573d6000803e3d6000fd5b50565b610c0583838360405180602001604052806000815250611395565b505050565b600d60019054906101000a900460ff1681565b610c25611856565b73ffffffffffffffffffffffffffffffffffffffff16610c43610f43565b73ffffffffffffffffffffffffffffffffffffffff1614610c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9090612eb5565b60405180910390fd5b8181600c9190610caa929190612446565b505050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4f90612fb3565b60405180910390fd5b80915050919050565b60085481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcf90613045565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e27611856565b73ffffffffffffffffffffffffffffffffffffffff16610e45610f43565b73ffffffffffffffffffffffffffffffffffffffff1614610e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9290612eb5565b60405180910390fd5b610ea56000611c5f565b565b600d60009054906101000a900460ff1681565b610ec2611856565b73ffffffffffffffffffffffffffffffffffffffff16610ee0610f43565b73ffffffffffffffffffffffffffffffffffffffff1614610f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2d90612eb5565b60405180910390fd5b610f403382611d23565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054610f7b90612bef565b80601f0160208091040260200160405190810160405280929190818152602001828054610fa790612bef565b8015610ff45780601f10610fc957610100808354040283529160200191610ff4565b820191906000526020600020905b815481529060010190602001808311610fd757829003601f168201915b5050505050905090565b600d60009054906101000a900460ff1661104d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611044906130b1565b60405180910390fd5b60095461105a6007611917565b111561109b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110929061311d565b60405180910390fd5b600b548111156110e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d7906131af565b60405180910390fd5b600a546110ed6007611917565b1061114a5761110781600854611dce90919063ffffffff16565b341015611149576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111409061321b565b60405180910390fd5b5b6111543382611d23565b50565b61115f611856565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c490613287565b60405180910390fd5b80600660006111da611856565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611287611856565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112cc919061259d565b60405180910390a35050565b60006112e2611856565b73ffffffffffffffffffffffffffffffffffffffff16611300610f43565b73ffffffffffffffffffffffffffffffffffffffff1614611356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134d90612eb5565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550600d60019054906101000a900460ff16905090565b6113a66113a0611856565b83611925565b6113e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dc90612e49565b60405180910390fd5b6113f184848484611de4565b50505050565b6060611402826117ea565b611441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143890613319565b60405180910390fd5b60001515600d60019054906101000a900460ff16151514156114ef57600f805461146a90612bef565b80601f016020809104026020016040519081016040528092919081815260200182805461149690612bef565b80156114e35780601f106114b8576101008083540402835291602001916114e3565b820191906000526020600020905b8154815290600101906020018083116114c657829003601f168201915b5050505050905061152c565b60006114f9611e40565b90508061150584611ed2565b600e60405160200161151993929190613409565b6040516020818303038152906040529150505b919050565b600061153b611856565b73ffffffffffffffffffffffffffffffffffffffff16611559610f43565b73ffffffffffffffffffffffffffffffffffffffff16146115af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a690612eb5565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550600d60009054906101000a900460ff16905090565b60095481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611690611856565b73ffffffffffffffffffffffffffffffffffffffff166116ae610f43565b73ffffffffffffffffffffffffffffffffffffffff1614611704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fb90612eb5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176b906134ac565b60405180910390fd5b61177d81611c5f565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166118d183610caf565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000611930826117ea565b61196f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119669061353e565b60405180910390fd5b600061197a83610caf565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806119e957508373ffffffffffffffffffffffffffffffffffffffff166119d18461083d565b73ffffffffffffffffffffffffffffffffffffffff16145b806119fa57506119f981856115f4565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611a2382610caf565b73ffffffffffffffffffffffffffffffffffffffff1614611a79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a70906135d0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ae9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae090613662565b60405180910390fd5b611af4838383612033565b611aff60008261185e565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b4f91906136b1565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ba691906136e5565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000611d2f6007611917565b9050600954611d47838361203890919063ffffffff16565b1115611d88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7f9061311d565b60405180910390fd5b60005b82811015611dc8578180611d9e9061373b565b925050611dab848361204e565b611db5600761206c565b8080611dc09061373b565b915050611d8b565b50505050565b60008183611ddc9190613784565b905092915050565b611def848484611a03565b611dfb84848484612082565b611e3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3190613850565b60405180910390fd5b50505050565b6060600c8054611e4f90612bef565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7b90612bef565b8015611ec85780601f10611e9d57610100808354040283529160200191611ec8565b820191906000526020600020905b815481529060010190602001808311611eab57829003601f168201915b5050505050905090565b60606000821415611f1a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061202e565b600082905060005b60008214611f4c578080611f359061373b565b915050600a82611f45919061389f565b9150611f22565b60008167ffffffffffffffff811115611f6857611f676129d2565b5b6040519080825280601f01601f191660200182016040528015611f9a5781602001600182028036833780820191505090505b5090505b6000851461202757600182611fb391906136b1565b9150600a85611fc291906138d0565b6030611fce91906136e5565b60f81b818381518110611fe457611fe3613901565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612020919061389f565b9450611f9e565b8093505050505b919050565b505050565b6000818361204691906136e5565b905092915050565b61206882826040518060200160405280600081525061220a565b5050565b6001816000016000828254019250508190555050565b60006120a38473ffffffffffffffffffffffffffffffffffffffff16612265565b156121fd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026120cc611856565b8786866040518563ffffffff1660e01b81526004016120ee9493929190613985565b6020604051808303816000875af192505050801561212a57506040513d601f19601f8201168201806040525081019061212791906139e6565b60015b6121ad573d806000811461215a576040519150601f19603f3d011682016040523d82523d6000602084013e61215f565b606091505b506000815114156121a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219c90613850565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612202565b600190505b949350505050565b6122148383612278565b6122216000848484612082565b612260576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225790613850565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122df90613a5f565b60405180910390fd5b6122f1816117ea565b15612331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232890613acb565b60405180910390fd5b61233d60008383612033565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461238d91906136e5565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461245290612bef565b90600052602060002090601f01602090048101928261247457600085556124bb565b82601f1061248d57803560ff19168380011785556124bb565b828001600101855582156124bb579182015b828111156124ba57823582559160200191906001019061249f565b5b5090506124c891906124cc565b5090565b5b808211156124e55760008160009055506001016124cd565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612532816124fd565b811461253d57600080fd5b50565b60008135905061254f81612529565b92915050565b60006020828403121561256b5761256a6124f3565b5b600061257984828501612540565b91505092915050565b60008115159050919050565b61259781612582565b82525050565b60006020820190506125b2600083018461258e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156125f25780820151818401526020810190506125d7565b83811115612601576000848401525b50505050565b6000601f19601f8301169050919050565b6000612623826125b8565b61262d81856125c3565b935061263d8185602086016125d4565b61264681612607565b840191505092915050565b6000602082019050818103600083015261266b8184612618565b905092915050565b6000819050919050565b61268681612673565b811461269157600080fd5b50565b6000813590506126a38161267d565b92915050565b6000602082840312156126bf576126be6124f3565b5b60006126cd84828501612694565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612701826126d6565b9050919050565b612711816126f6565b82525050565b600060208201905061272c6000830184612708565b92915050565b61273b816126f6565b811461274657600080fd5b50565b60008135905061275881612732565b92915050565b60008060408385031215612775576127746124f3565b5b600061278385828601612749565b925050602061279485828601612694565b9150509250929050565b6127a781612673565b82525050565b60006020820190506127c2600083018461279e565b92915050565b6000806000606084860312156127e1576127e06124f3565b5b60006127ef86828701612749565b935050602061280086828701612749565b925050604061281186828701612694565b9150509250925092565b600061ffff82169050919050565b6128328161281b565b811461283d57600080fd5b50565b60008135905061284f81612829565b92915050565b60006020828403121561286b5761286a6124f3565b5b600061287984828501612840565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126128a7576128a6612882565b5b8235905067ffffffffffffffff8111156128c4576128c3612887565b5b6020830191508360018202830111156128e0576128df61288c565b5b9250929050565b600080602083850312156128fe576128fd6124f3565b5b600083013567ffffffffffffffff81111561291c5761291b6124f8565b5b61292885828601612891565b92509250509250929050565b60006020828403121561294a576129496124f3565b5b600061295884828501612749565b91505092915050565b61296a81612582565b811461297557600080fd5b50565b60008135905061298781612961565b92915050565b600080604083850312156129a4576129a36124f3565b5b60006129b285828601612749565b92505060206129c385828601612978565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a0a82612607565b810181811067ffffffffffffffff82111715612a2957612a286129d2565b5b80604052505050565b6000612a3c6124e9565b9050612a488282612a01565b919050565b600067ffffffffffffffff821115612a6857612a676129d2565b5b612a7182612607565b9050602081019050919050565b82818337600083830152505050565b6000612aa0612a9b84612a4d565b612a32565b905082815260208101848484011115612abc57612abb6129cd565b5b612ac7848285612a7e565b509392505050565b600082601f830112612ae457612ae3612882565b5b8135612af4848260208601612a8d565b91505092915050565b60008060008060808587031215612b1757612b166124f3565b5b6000612b2587828801612749565b9450506020612b3687828801612749565b9350506040612b4787828801612694565b925050606085013567ffffffffffffffff811115612b6857612b676124f8565b5b612b7487828801612acf565b91505092959194509250565b60008060408385031215612b9757612b966124f3565b5b6000612ba585828601612749565b9250506020612bb685828601612749565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612c0757607f821691505b60208210811415612c1b57612c1a612bc0565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612c7d602c836125c3565b9150612c8882612c21565b604082019050919050565b60006020820190508181036000830152612cac81612c70565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612d0f6021836125c3565b9150612d1a82612cb3565b604082019050919050565b60006020820190508181036000830152612d3e81612d02565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612da16038836125c3565b9150612dac82612d45565b604082019050919050565b60006020820190508181036000830152612dd081612d94565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000612e336031836125c3565b9150612e3e82612dd7565b604082019050919050565b60006020820190508181036000830152612e6281612e26565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612e9f6020836125c3565b9150612eaa82612e69565b602082019050919050565b60006020820190508181036000830152612ece81612e92565b9050919050565b7f4e6f2062616c616e636520746f20776974686472617700000000000000000000600082015250565b6000612f0b6016836125c3565b9150612f1682612ed5565b602082019050919050565b60006020820190508181036000830152612f3a81612efe565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000612f9d6029836125c3565b9150612fa882612f41565b604082019050919050565b60006020820190508181036000830152612fcc81612f90565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061302f602a836125c3565b915061303a82612fd3565b604082019050919050565b6000602082019050818103600083015261305e81613022565b9050919050565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b600061309b6012836125c3565b91506130a682613065565b602082019050919050565b600060208201905081810360008301526130ca8161308e565b9050919050565b7f4e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b60006131076016836125c3565b9150613112826130d1565b602082019050919050565b60006020820190508181036000830152613136816130fa565b9050919050565b7f546f6f206d616e7920746f6b656e7320666f72206f6e65207472616e7361637460008201527f696f6e0000000000000000000000000000000000000000000000000000000000602082015250565b60006131996023836125c3565b91506131a48261313d565b604082019050919050565b600060208201905081810360008301526131c88161318c565b9050919050565b7f496e73756666696369656e74207061796d656e74000000000000000000000000600082015250565b60006132056014836125c3565b9150613210826131cf565b602082019050919050565b60006020820190508181036000830152613234816131f8565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006132716019836125c3565b915061327c8261323b565b602082019050919050565b600060208201905081810360008301526132a081613264565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613303602f836125c3565b915061330e826132a7565b604082019050919050565b60006020820190508181036000830152613332816132f6565b9050919050565b600081905092915050565b600061334f826125b8565b6133598185613339565b93506133698185602086016125d4565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461339781612bef565b6133a18186613339565b945060018216600081146133bc57600181146133cd57613400565b60ff19831686528186019350613400565b6133d685613375565b60005b838110156133f8578154818901526001820191506020810190506133d9565b838801955050505b50505092915050565b60006134158286613344565b91506134218285613344565b915061342d828461338a565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006134966026836125c3565b91506134a18261343a565b604082019050919050565b600060208201905081810360008301526134c581613489565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613528602c836125c3565b9150613533826134cc565b604082019050919050565b600060208201905081810360008301526135578161351b565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006135ba6029836125c3565b91506135c58261355e565b604082019050919050565b600060208201905081810360008301526135e9816135ad565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061364c6024836125c3565b9150613657826135f0565b604082019050919050565b6000602082019050818103600083015261367b8161363f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006136bc82612673565b91506136c783612673565b9250828210156136da576136d9613682565b5b828203905092915050565b60006136f082612673565b91506136fb83612673565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156137305761372f613682565b5b828201905092915050565b600061374682612673565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561377957613778613682565b5b600182019050919050565b600061378f82612673565b915061379a83612673565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156137d3576137d2613682565b5b828202905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061383a6032836125c3565b9150613845826137de565b604082019050919050565b600060208201905081810360008301526138698161382d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006138aa82612673565b91506138b583612673565b9250826138c5576138c4613870565b5b828204905092915050565b60006138db82612673565b91506138e683612673565b9250826138f6576138f5613870565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061395782613930565b613961818561393b565b93506139718185602086016125d4565b61397a81612607565b840191505092915050565b600060808201905061399a6000830187612708565b6139a76020830186612708565b6139b4604083018561279e565b81810360608301526139c6818461394c565b905095945050505050565b6000815190506139e081612529565b92915050565b6000602082840312156139fc576139fb6124f3565b5b6000613a0a848285016139d1565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613a496020836125c3565b9150613a5482613a13565b602082019050919050565b60006020820190508181036000830152613a7881613a3c565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613ab5601c836125c3565b9150613ac082613a7f565b602082019050919050565b60006020820190508181036000830152613ae481613aa8565b905091905056fea264697066735822122047e56714809367612d5214f511a13d3e2299589147fbe0922c8607698dc577cf64736f6c634300080a0033697066733a2f2f516d633973534a566e466744506d624a7a31664c69596d48734d6f545754614457786b77616456343957677675422f68696464656e2e6a736f6e

Deployed Bytecode

0x6080604052600436106101c25760003560e01c806370a08231116100f7578063a22cb46511610095578063d1cbf17d11610064578063d1cbf17d1461060d578063d5abeb0114610638578063e985e9c514610663578063f2fde38b146106a0576101c2565b8063a22cb46514610553578063a475b5dd1461057c578063b88d4fde146105a7578063c87b56dd146105d0576101c2565b8063819b25ba116100d1578063819b25ba146104b85780638da5cb5b146104e157806395d89b411461050c578063a0712d6814610537576101c2565b806370a0823114610439578063715018a61461047657806371adc02a1461048d576101c2565b80633a467e3d11610164578063518302271161013e578063518302271461037d57806355f804b3146103a85780636352211e146103d15780636817c76c1461040e576101c2565b80633a467e3d146103125780633ccfd60b1461033d57806342842e0e14610354576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806318160ddd1461029557806323b872dd146102c05780632d46d6ff146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612555565b6106c9565b6040516101fb919061259d565b60405180910390f35b34801561021057600080fd5b506102196107ab565b6040516102269190612651565b60405180910390f35b34801561023b57600080fd5b50610256600480360381019061025191906126a9565b61083d565b6040516102639190612717565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e919061275e565b6108c2565b005b3480156102a157600080fd5b506102aa6109da565b6040516102b791906127ad565b60405180910390f35b3480156102cc57600080fd5b506102e760048036038101906102e291906127c8565b6109eb565b005b3480156102f557600080fd5b50610310600480360381019061030b9190612855565b610a4b565b005b34801561031e57600080fd5b50610327610ad5565b60405161033491906127ad565b60405180910390f35b34801561034957600080fd5b50610352610adb565b005b34801561036057600080fd5b5061037b600480360381019061037691906127c8565b610bea565b005b34801561038957600080fd5b50610392610c0a565b60405161039f919061259d565b60405180910390f35b3480156103b457600080fd5b506103cf60048036038101906103ca91906128e7565b610c1d565b005b3480156103dd57600080fd5b506103f860048036038101906103f391906126a9565b610caf565b6040516104059190612717565b60405180910390f35b34801561041a57600080fd5b50610423610d61565b60405161043091906127ad565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b9190612934565b610d67565b60405161046d91906127ad565b60405180910390f35b34801561048257600080fd5b5061048b610e1f565b005b34801561049957600080fd5b506104a2610ea7565b6040516104af919061259d565b60405180910390f35b3480156104c457600080fd5b506104df60048036038101906104da91906126a9565b610eba565b005b3480156104ed57600080fd5b506104f6610f43565b6040516105039190612717565b60405180910390f35b34801561051857600080fd5b50610521610f6c565b60405161052e9190612651565b60405180910390f35b610551600480360381019061054c91906126a9565b610ffe565b005b34801561055f57600080fd5b5061057a6004803603810190610575919061298d565b611157565b005b34801561058857600080fd5b506105916112d8565b60405161059e919061259d565b60405180910390f35b3480156105b357600080fd5b506105ce60048036038101906105c99190612afd565b611395565b005b3480156105dc57600080fd5b506105f760048036038101906105f291906126a9565b6113f7565b6040516106049190612651565b60405180910390f35b34801561061957600080fd5b50610622611531565b60405161062f919061259d565b60405180910390f35b34801561064457600080fd5b5061064d6115ee565b60405161065a91906127ad565b60405180910390f35b34801561066f57600080fd5b5061068a60048036038101906106859190612b80565b6115f4565b604051610697919061259d565b60405180910390f35b3480156106ac57600080fd5b506106c760048036038101906106c29190612934565b611688565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061079457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107a457506107a382611780565b5b9050919050565b6060600180546107ba90612bef565b80601f01602080910402602001604051908101604052809291908181526020018280546107e690612bef565b80156108335780601f1061080857610100808354040283529160200191610833565b820191906000526020600020905b81548152906001019060200180831161081657829003601f168201915b5050505050905090565b6000610848826117ea565b610887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087e90612c93565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108cd82610caf565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561093e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093590612d25565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661095d611856565b73ffffffffffffffffffffffffffffffffffffffff16148061098c575061098b81610986611856565b6115f4565b5b6109cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c290612db7565b60405180910390fd5b6109d5838361185e565b505050565b60006109e66007611917565b905090565b6109fc6109f6611856565b82611925565b610a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3290612e49565b60405180910390fd5b610a46838383611a03565b505050565b610a53611856565b73ffffffffffffffffffffffffffffffffffffffff16610a71610f43565b73ffffffffffffffffffffffffffffffffffffffff1614610ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abe90612eb5565b60405180910390fd5b8061ffff16600a8190555050565b600a5481565b610ae3611856565b73ffffffffffffffffffffffffffffffffffffffff16610b01610f43565b73ffffffffffffffffffffffffffffffffffffffff1614610b57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4e90612eb5565b60405180910390fd5b60004711610b9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9190612f21565b60405180910390fd5b610ba2610f43565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610be7573d6000803e3d6000fd5b50565b610c0583838360405180602001604052806000815250611395565b505050565b600d60019054906101000a900460ff1681565b610c25611856565b73ffffffffffffffffffffffffffffffffffffffff16610c43610f43565b73ffffffffffffffffffffffffffffffffffffffff1614610c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9090612eb5565b60405180910390fd5b8181600c9190610caa929190612446565b505050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4f90612fb3565b60405180910390fd5b80915050919050565b60085481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcf90613045565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e27611856565b73ffffffffffffffffffffffffffffffffffffffff16610e45610f43565b73ffffffffffffffffffffffffffffffffffffffff1614610e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9290612eb5565b60405180910390fd5b610ea56000611c5f565b565b600d60009054906101000a900460ff1681565b610ec2611856565b73ffffffffffffffffffffffffffffffffffffffff16610ee0610f43565b73ffffffffffffffffffffffffffffffffffffffff1614610f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2d90612eb5565b60405180910390fd5b610f403382611d23565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054610f7b90612bef565b80601f0160208091040260200160405190810160405280929190818152602001828054610fa790612bef565b8015610ff45780601f10610fc957610100808354040283529160200191610ff4565b820191906000526020600020905b815481529060010190602001808311610fd757829003601f168201915b5050505050905090565b600d60009054906101000a900460ff1661104d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611044906130b1565b60405180910390fd5b60095461105a6007611917565b111561109b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110929061311d565b60405180910390fd5b600b548111156110e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d7906131af565b60405180910390fd5b600a546110ed6007611917565b1061114a5761110781600854611dce90919063ffffffff16565b341015611149576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111409061321b565b60405180910390fd5b5b6111543382611d23565b50565b61115f611856565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c490613287565b60405180910390fd5b80600660006111da611856565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611287611856565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112cc919061259d565b60405180910390a35050565b60006112e2611856565b73ffffffffffffffffffffffffffffffffffffffff16611300610f43565b73ffffffffffffffffffffffffffffffffffffffff1614611356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134d90612eb5565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550600d60019054906101000a900460ff16905090565b6113a66113a0611856565b83611925565b6113e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dc90612e49565b60405180910390fd5b6113f184848484611de4565b50505050565b6060611402826117ea565b611441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143890613319565b60405180910390fd5b60001515600d60019054906101000a900460ff16151514156114ef57600f805461146a90612bef565b80601f016020809104026020016040519081016040528092919081815260200182805461149690612bef565b80156114e35780601f106114b8576101008083540402835291602001916114e3565b820191906000526020600020905b8154815290600101906020018083116114c657829003601f168201915b5050505050905061152c565b60006114f9611e40565b90508061150584611ed2565b600e60405160200161151993929190613409565b6040516020818303038152906040529150505b919050565b600061153b611856565b73ffffffffffffffffffffffffffffffffffffffff16611559610f43565b73ffffffffffffffffffffffffffffffffffffffff16146115af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a690612eb5565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550600d60009054906101000a900460ff16905090565b60095481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611690611856565b73ffffffffffffffffffffffffffffffffffffffff166116ae610f43565b73ffffffffffffffffffffffffffffffffffffffff1614611704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fb90612eb5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176b906134ac565b60405180910390fd5b61177d81611c5f565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166118d183610caf565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000611930826117ea565b61196f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119669061353e565b60405180910390fd5b600061197a83610caf565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806119e957508373ffffffffffffffffffffffffffffffffffffffff166119d18461083d565b73ffffffffffffffffffffffffffffffffffffffff16145b806119fa57506119f981856115f4565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611a2382610caf565b73ffffffffffffffffffffffffffffffffffffffff1614611a79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a70906135d0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ae9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae090613662565b60405180910390fd5b611af4838383612033565b611aff60008261185e565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b4f91906136b1565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ba691906136e5565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000611d2f6007611917565b9050600954611d47838361203890919063ffffffff16565b1115611d88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7f9061311d565b60405180910390fd5b60005b82811015611dc8578180611d9e9061373b565b925050611dab848361204e565b611db5600761206c565b8080611dc09061373b565b915050611d8b565b50505050565b60008183611ddc9190613784565b905092915050565b611def848484611a03565b611dfb84848484612082565b611e3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3190613850565b60405180910390fd5b50505050565b6060600c8054611e4f90612bef565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7b90612bef565b8015611ec85780601f10611e9d57610100808354040283529160200191611ec8565b820191906000526020600020905b815481529060010190602001808311611eab57829003601f168201915b5050505050905090565b60606000821415611f1a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061202e565b600082905060005b60008214611f4c578080611f359061373b565b915050600a82611f45919061389f565b9150611f22565b60008167ffffffffffffffff811115611f6857611f676129d2565b5b6040519080825280601f01601f191660200182016040528015611f9a5781602001600182028036833780820191505090505b5090505b6000851461202757600182611fb391906136b1565b9150600a85611fc291906138d0565b6030611fce91906136e5565b60f81b818381518110611fe457611fe3613901565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612020919061389f565b9450611f9e565b8093505050505b919050565b505050565b6000818361204691906136e5565b905092915050565b61206882826040518060200160405280600081525061220a565b5050565b6001816000016000828254019250508190555050565b60006120a38473ffffffffffffffffffffffffffffffffffffffff16612265565b156121fd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026120cc611856565b8786866040518563ffffffff1660e01b81526004016120ee9493929190613985565b6020604051808303816000875af192505050801561212a57506040513d601f19601f8201168201806040525081019061212791906139e6565b60015b6121ad573d806000811461215a576040519150601f19603f3d011682016040523d82523d6000602084013e61215f565b606091505b506000815114156121a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219c90613850565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612202565b600190505b949350505050565b6122148383612278565b6122216000848484612082565b612260576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225790613850565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122df90613a5f565b60405180910390fd5b6122f1816117ea565b15612331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232890613acb565b60405180910390fd5b61233d60008383612033565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461238d91906136e5565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461245290612bef565b90600052602060002090601f01602090048101928261247457600085556124bb565b82601f1061248d57803560ff19168380011785556124bb565b828001600101855582156124bb579182015b828111156124ba57823582559160200191906001019061249f565b5b5090506124c891906124cc565b5090565b5b808211156124e55760008160009055506001016124cd565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612532816124fd565b811461253d57600080fd5b50565b60008135905061254f81612529565b92915050565b60006020828403121561256b5761256a6124f3565b5b600061257984828501612540565b91505092915050565b60008115159050919050565b61259781612582565b82525050565b60006020820190506125b2600083018461258e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156125f25780820151818401526020810190506125d7565b83811115612601576000848401525b50505050565b6000601f19601f8301169050919050565b6000612623826125b8565b61262d81856125c3565b935061263d8185602086016125d4565b61264681612607565b840191505092915050565b6000602082019050818103600083015261266b8184612618565b905092915050565b6000819050919050565b61268681612673565b811461269157600080fd5b50565b6000813590506126a38161267d565b92915050565b6000602082840312156126bf576126be6124f3565b5b60006126cd84828501612694565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612701826126d6565b9050919050565b612711816126f6565b82525050565b600060208201905061272c6000830184612708565b92915050565b61273b816126f6565b811461274657600080fd5b50565b60008135905061275881612732565b92915050565b60008060408385031215612775576127746124f3565b5b600061278385828601612749565b925050602061279485828601612694565b9150509250929050565b6127a781612673565b82525050565b60006020820190506127c2600083018461279e565b92915050565b6000806000606084860312156127e1576127e06124f3565b5b60006127ef86828701612749565b935050602061280086828701612749565b925050604061281186828701612694565b9150509250925092565b600061ffff82169050919050565b6128328161281b565b811461283d57600080fd5b50565b60008135905061284f81612829565b92915050565b60006020828403121561286b5761286a6124f3565b5b600061287984828501612840565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126128a7576128a6612882565b5b8235905067ffffffffffffffff8111156128c4576128c3612887565b5b6020830191508360018202830111156128e0576128df61288c565b5b9250929050565b600080602083850312156128fe576128fd6124f3565b5b600083013567ffffffffffffffff81111561291c5761291b6124f8565b5b61292885828601612891565b92509250509250929050565b60006020828403121561294a576129496124f3565b5b600061295884828501612749565b91505092915050565b61296a81612582565b811461297557600080fd5b50565b60008135905061298781612961565b92915050565b600080604083850312156129a4576129a36124f3565b5b60006129b285828601612749565b92505060206129c385828601612978565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a0a82612607565b810181811067ffffffffffffffff82111715612a2957612a286129d2565b5b80604052505050565b6000612a3c6124e9565b9050612a488282612a01565b919050565b600067ffffffffffffffff821115612a6857612a676129d2565b5b612a7182612607565b9050602081019050919050565b82818337600083830152505050565b6000612aa0612a9b84612a4d565b612a32565b905082815260208101848484011115612abc57612abb6129cd565b5b612ac7848285612a7e565b509392505050565b600082601f830112612ae457612ae3612882565b5b8135612af4848260208601612a8d565b91505092915050565b60008060008060808587031215612b1757612b166124f3565b5b6000612b2587828801612749565b9450506020612b3687828801612749565b9350506040612b4787828801612694565b925050606085013567ffffffffffffffff811115612b6857612b676124f8565b5b612b7487828801612acf565b91505092959194509250565b60008060408385031215612b9757612b966124f3565b5b6000612ba585828601612749565b9250506020612bb685828601612749565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612c0757607f821691505b60208210811415612c1b57612c1a612bc0565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612c7d602c836125c3565b9150612c8882612c21565b604082019050919050565b60006020820190508181036000830152612cac81612c70565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612d0f6021836125c3565b9150612d1a82612cb3565b604082019050919050565b60006020820190508181036000830152612d3e81612d02565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612da16038836125c3565b9150612dac82612d45565b604082019050919050565b60006020820190508181036000830152612dd081612d94565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000612e336031836125c3565b9150612e3e82612dd7565b604082019050919050565b60006020820190508181036000830152612e6281612e26565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612e9f6020836125c3565b9150612eaa82612e69565b602082019050919050565b60006020820190508181036000830152612ece81612e92565b9050919050565b7f4e6f2062616c616e636520746f20776974686472617700000000000000000000600082015250565b6000612f0b6016836125c3565b9150612f1682612ed5565b602082019050919050565b60006020820190508181036000830152612f3a81612efe565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000612f9d6029836125c3565b9150612fa882612f41565b604082019050919050565b60006020820190508181036000830152612fcc81612f90565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061302f602a836125c3565b915061303a82612fd3565b604082019050919050565b6000602082019050818103600083015261305e81613022565b9050919050565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b600061309b6012836125c3565b91506130a682613065565b602082019050919050565b600060208201905081810360008301526130ca8161308e565b9050919050565b7f4e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b60006131076016836125c3565b9150613112826130d1565b602082019050919050565b60006020820190508181036000830152613136816130fa565b9050919050565b7f546f6f206d616e7920746f6b656e7320666f72206f6e65207472616e7361637460008201527f696f6e0000000000000000000000000000000000000000000000000000000000602082015250565b60006131996023836125c3565b91506131a48261313d565b604082019050919050565b600060208201905081810360008301526131c88161318c565b9050919050565b7f496e73756666696369656e74207061796d656e74000000000000000000000000600082015250565b60006132056014836125c3565b9150613210826131cf565b602082019050919050565b60006020820190508181036000830152613234816131f8565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006132716019836125c3565b915061327c8261323b565b602082019050919050565b600060208201905081810360008301526132a081613264565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613303602f836125c3565b915061330e826132a7565b604082019050919050565b60006020820190508181036000830152613332816132f6565b9050919050565b600081905092915050565b600061334f826125b8565b6133598185613339565b93506133698185602086016125d4565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461339781612bef565b6133a18186613339565b945060018216600081146133bc57600181146133cd57613400565b60ff19831686528186019350613400565b6133d685613375565b60005b838110156133f8578154818901526001820191506020810190506133d9565b838801955050505b50505092915050565b60006134158286613344565b91506134218285613344565b915061342d828461338a565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006134966026836125c3565b91506134a18261343a565b604082019050919050565b600060208201905081810360008301526134c581613489565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613528602c836125c3565b9150613533826134cc565b604082019050919050565b600060208201905081810360008301526135578161351b565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006135ba6029836125c3565b91506135c58261355e565b604082019050919050565b600060208201905081810360008301526135e9816135ad565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061364c6024836125c3565b9150613657826135f0565b604082019050919050565b6000602082019050818103600083015261367b8161363f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006136bc82612673565b91506136c783612673565b9250828210156136da576136d9613682565b5b828203905092915050565b60006136f082612673565b91506136fb83612673565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156137305761372f613682565b5b828201905092915050565b600061374682612673565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561377957613778613682565b5b600182019050919050565b600061378f82612673565b915061379a83612673565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156137d3576137d2613682565b5b828202905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061383a6032836125c3565b9150613845826137de565b604082019050919050565b600060208201905081810360008301526138698161382d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006138aa82612673565b91506138b583612673565b9250826138c5576138c4613870565b5b828204905092915050565b60006138db82612673565b91506138e683612673565b9250826138f6576138f5613870565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061395782613930565b613961818561393b565b93506139718185602086016125d4565b61397a81612607565b840191505092915050565b600060808201905061399a6000830187612708565b6139a76020830186612708565b6139b4604083018561279e565b81810360608301526139c6818461394c565b905095945050505050565b6000815190506139e081612529565b92915050565b6000602082840312156139fc576139fb6124f3565b5b6000613a0a848285016139d1565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613a496020836125c3565b9150613a5482613a13565b602082019050919050565b60006020820190508181036000830152613a7881613a3c565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613ab5601c836125c3565b9150613ac082613a7f565b602082019050919050565b60006020820190508181036000830152613ae481613aa8565b905091905056fea264697066735822122047e56714809367612d5214f511a13d3e2299589147fbe0922c8607698dc577cf64736f6c634300080a0033

Deployed Bytecode Sourcemap

44089:2921:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29667:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30612:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32171:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31694:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46739:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33061:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46626:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44328:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46839:168;;;;;;;;;;;;;:::i;:::-;;33471:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44469:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44898:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30306:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44251:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30036:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43433:94;;;;;;;;;;;;;:::i;:::-;;44429:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46509:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42782:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30781:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45652:467;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32464:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45390:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33727:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45006:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45506:140;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44292:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32830:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43682:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29667:305;29769:4;29821:25;29806:40;;;:11;:40;;;;:105;;;;29878:33;29863:48;;;:11;:48;;;;29806:105;:158;;;;29928:36;29952:11;29928:23;:36::i;:::-;29806:158;29786:178;;29667:305;;;:::o;30612:100::-;30666:13;30699:5;30692:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30612:100;:::o;32171:221::-;32247:7;32275:16;32283:7;32275;:16::i;:::-;32267:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32360:15;:24;32376:7;32360:24;;;;;;;;;;;;;;;;;;;;;32353:31;;32171:221;;;:::o;31694:411::-;31775:13;31791:23;31806:7;31791:14;:23::i;:::-;31775:39;;31839:5;31833:11;;:2;:11;;;;31825:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;31933:5;31917:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;31942:37;31959:5;31966:12;:10;:12::i;:::-;31942:16;:37::i;:::-;31917:62;31895:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;32076:21;32085:2;32089:7;32076:8;:21::i;:::-;31764:341;31694:411;;:::o;46739:94::-;46783:4;46802:25;:15;:23;:25::i;:::-;46795:32;;46739:94;:::o;33061:339::-;33256:41;33275:12;:10;:12::i;:::-;33289:7;33256:18;:41::i;:::-;33248:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33364:28;33374:4;33380:2;33384:7;33364:9;:28::i;:::-;33061:339;;;:::o;46626:107::-;43013:12;:10;:12::i;:::-;43002:23;;:7;:5;:7::i;:::-;:23;;;42994:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46714:13:::1;46697:30;;:14;:30;;;;46626:107:::0;:::o;44328:35::-;;;;:::o;46839:168::-;43013:12;:10;:12::i;:::-;43002:23;;:7;:5;:7::i;:::-;:23;;;42994:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46915:1:::1;46891:21;:25;46883:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;46958:7;:5;:7::i;:::-;46950:25;;:48;46976:21;46950:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;46839:168::o:0;33471:185::-;33609:39;33626:4;33632:2;33636:7;33609:39;;;;;;;;;;;;:16;:39::i;:::-;33471:185;;;:::o;44469:28::-;;;;;;;;;;;;;:::o;44898:102::-;43013:12;:10;:12::i;:::-;43002:23;;:7;:5;:7::i;:::-;:23;;;42994:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44984:10:::1;;44974:7;:20;;;;;;;:::i;:::-;;44898:102:::0;;:::o;30306:239::-;30378:7;30398:13;30414:7;:16;30422:7;30414:16;;;;;;;;;;;;;;;;;;;;;30398:32;;30466:1;30449:19;;:5;:19;;;;30441:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30532:5;30525:12;;;30306:239;;;:::o;44251:36::-;;;;:::o;30036:208::-;30108:7;30153:1;30136:19;;:5;:19;;;;30128:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30220:9;:16;30230:5;30220:16;;;;;;;;;;;;;;;;30213:23;;30036:208;;;:::o;43433:94::-;43013:12;:10;:12::i;:::-;43002:23;;:7;:5;:7::i;:::-;:23;;;42994:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43498:21:::1;43516:1;43498:9;:21::i;:::-;43433:94::o:0;44429:35::-;;;;;;;;;;;;;:::o;46509:113::-;43013:12;:10;:12::i;:::-;43002:23;;:7;:5;:7::i;:::-;:23;;;42994:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46576:40:::1;46589:10;46601:14;46576:12;:40::i;:::-;46509:113:::0;:::o;42782:87::-;42828:7;42855:6;;;;;;;;;;;42848:13;;42782:87;:::o;30781:104::-;30837:13;30870:7;30863:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30781:104;:::o;45652:467::-;45719:15;;;;;;;;;;;45711:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;45801:9;;45772:25;:15;:23;:25::i;:::-;:38;;45764:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45870:9;;45852:14;:27;;45844:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;45958:14;;45929:25;:15;:23;:25::i;:::-;:43;45926:141;;46005:29;46019:14;46005:9;;:13;;:29;;;;:::i;:::-;45992:9;:42;;45984:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;45926:141;46073:40;46086:10;46098:14;46073:12;:40::i;:::-;45652:467;:::o;32464:295::-;32579:12;:10;:12::i;:::-;32567:24;;:8;:24;;;;32559:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;32679:8;32634:18;:32;32653:12;:10;:12::i;:::-;32634:32;;;;;;;;;;;;;;;:42;32667:8;32634:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;32732:8;32703:48;;32718:12;:10;:12::i;:::-;32703:48;;;32742:8;32703:48;;;;;;:::i;:::-;;;;;;;;32464:295;;:::o;45390:104::-;45433:4;43013:12;:10;:12::i;:::-;43002:23;;:7;:5;:7::i;:::-;:23;;;42994:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45458:8:::1;;;;;;;;;;;45457:9;45446:8;;:20;;;;;;;;;;;;;;;;;;45480:8;;;;;;;;;;;45473:15;;45390:104:::0;:::o;33727:328::-;33902:41;33921:12;:10;:12::i;:::-;33935:7;33902:18;:41::i;:::-;33894:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34008:39;34022:4;34028:2;34032:7;34041:5;34008:13;:39::i;:::-;33727:328;;;;:::o;45006:376::-;45072:13;45102:17;45110:8;45102:7;:17::i;:::-;45094:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;45193:5;45181:17;;:8;;;;;;;;;;;:17;;;45178:58;;;45218:9;45211:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45178:58;45240:28;45271:10;:8;:10::i;:::-;45240:41;;45317:14;45333:26;45350:8;45333:16;:26::i;:::-;45361:13;45300:75;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45286:90;;;45006:376;;;;:::o;45506:140::-;45564:4;43013:12;:10;:12::i;:::-;43002:23;;:7;:5;:7::i;:::-;:23;;;42994:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45596:15:::1;;;;;;;;;;;45595:16;45577:15;;:34;;;;;;;;;;;;;;;;;;45625:15;;;;;;;;;;;45618:22;;45506:140:::0;:::o;44292:31::-;;;;:::o;32830:164::-;32927:4;32951:18;:25;32970:5;32951:25;;;;;;;;;;;;;;;:35;32977:8;32951:35;;;;;;;;;;;;;;;;;;;;;;;;;32944:42;;32830:164;;;;:::o;43682:192::-;43013:12;:10;:12::i;:::-;43002:23;;:7;:5;:7::i;:::-;:23;;;42994:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43791:1:::1;43771:22;;:8;:22;;;;43763:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43847:19;43857:8;43847:9;:19::i;:::-;43682:192:::0;:::o;7127:157::-;7212:4;7251:25;7236:40;;;:11;:40;;;;7229:47;;7127:157;;;:::o;35565:127::-;35630:4;35682:1;35654:30;;:7;:16;35662:7;35654:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35647:37;;35565:127;;;:::o;19770:98::-;19823:7;19850:10;19843:17;;19770:98;:::o;39547:174::-;39649:2;39622:15;:24;39638:7;39622:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39705:7;39701:2;39667:46;;39676:23;39691:7;39676:14;:23::i;:::-;39667:46;;;;;;;;;;;;39547:174;;:::o;27764:114::-;27829:7;27856;:14;;;27849:21;;27764:114;;;:::o;35859:348::-;35952:4;35977:16;35985:7;35977;:16::i;:::-;35969:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36053:13;36069:23;36084:7;36069:14;:23::i;:::-;36053:39;;36122:5;36111:16;;:7;:16;;;:51;;;;36155:7;36131:31;;:20;36143:7;36131:11;:20::i;:::-;:31;;;36111:51;:87;;;;36166:32;36183:5;36190:7;36166:16;:32::i;:::-;36111:87;36103:96;;;35859:348;;;;:::o;38851:578::-;39010:4;38983:31;;:23;38998:7;38983:14;:23::i;:::-;:31;;;38975:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39093:1;39079:16;;:2;:16;;;;39071:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39149:39;39170:4;39176:2;39180:7;39149:20;:39::i;:::-;39253:29;39270:1;39274:7;39253:8;:29::i;:::-;39314:1;39295:9;:15;39305:4;39295:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39343:1;39326:9;:13;39336:2;39326:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39374:2;39355:7;:16;39363:7;39355:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39413:7;39409:2;39394:27;;39403:4;39394:27;;;;;;;;;;;;38851:578;;;:::o;43882:173::-;43938:16;43957:6;;;;;;;;;;;43938:25;;43983:8;43974:6;;:17;;;;;;;;;;;;;;;;;;44038:8;44007:40;;44028:8;44007:40;;;;;;;;;;;;43927:128;43882:173;:::o;46126:375::-;46193:23;46219:25;:15;:23;:25::i;:::-;46193:51;;46293:9;;46259:30;46282:6;46259:18;:22;;:30;;;;:::i;:::-;:43;;46251:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;46344:6;46340:156;46359:6;46356:1;:9;46340:156;;;46382:20;;;;;:::i;:::-;;;;46413:37;46423:6;46431:18;46413:9;:37::i;:::-;46461:27;:15;:25;:27::i;:::-;46367:3;;;;;:::i;:::-;;;;46340:156;;;;46186:315;46126:375;;:::o;23522:98::-;23580:7;23611:1;23607;:5;;;;:::i;:::-;23600:12;;23522:98;;;;:::o;34937:315::-;35094:28;35104:4;35110:2;35114:7;35094:9;:28::i;:::-;35141:48;35164:4;35170:2;35174:7;35183:5;35141:22;:48::i;:::-;35133:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;34937:315;;;;:::o;44798:94::-;44850:13;44879:7;44872:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44798:94;:::o;7602:723::-;7658:13;7888:1;7879:5;:10;7875:53;;;7906:10;;;;;;;;;;;;;;;;;;;;;7875:53;7938:12;7953:5;7938:20;;7969:14;7994:78;8009:1;8001:4;:9;7994:78;;8027:8;;;;;:::i;:::-;;;;8058:2;8050:10;;;;;:::i;:::-;;;7994:78;;;8082:19;8114:6;8104:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8082:39;;8132:154;8148:1;8139:5;:10;8132:154;;8176:1;8166:11;;;;;:::i;:::-;;;8243:2;8235:5;:10;;;;:::i;:::-;8222:2;:24;;;;:::i;:::-;8209:39;;8192:6;8199;8192:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8272:2;8263:11;;;;;:::i;:::-;;;8132:154;;;8310:6;8296:21;;;;;7602:723;;;;:::o;41657:126::-;;;;:::o;22784:98::-;22842:7;22873:1;22869;:5;;;;:::i;:::-;22862:12;;22784:98;;;;:::o;36549:110::-;36625:26;36635:2;36639:7;36625:26;;;;;;;;;;;;:9;:26::i;:::-;36549:110;;:::o;27886:127::-;27993:1;27975:7;:14;;;:19;;;;;;;;;;;27886:127;:::o;40286:799::-;40441:4;40462:15;:2;:13;;;:15::i;:::-;40458:620;;;40514:2;40498:36;;;40535:12;:10;:12::i;:::-;40549:4;40555:7;40564:5;40498:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40494:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40757:1;40740:6;:13;:18;40736:272;;;40783:60;;;;;;;;;;:::i;:::-;;;;;;;;40736:272;40958:6;40952:13;40943:6;40939:2;40935:15;40928:38;40494:529;40631:41;;;40621:51;;;:6;:51;;;;40614:58;;;;;40458:620;41062:4;41055:11;;40286:799;;;;;;;:::o;36886:321::-;37016:18;37022:2;37026:7;37016:5;:18::i;:::-;37067:54;37098:1;37102:2;37106:7;37115:5;37067:22;:54::i;:::-;37045:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;36886:321;;;:::o;10127:387::-;10187:4;10395:12;10462:7;10450:20;10442:28;;10505:1;10498:4;:8;10491:15;;;10127:387;;;:::o;37543:382::-;37637:1;37623:16;;:2;:16;;;;37615:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37696:16;37704:7;37696;:16::i;:::-;37695:17;37687:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37758:45;37787:1;37791:2;37795:7;37758:20;:45::i;:::-;37833:1;37816:9;:13;37826:2;37816:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37864:2;37845:7;:16;37853:7;37845:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37909:7;37905:2;37884:33;;37901:1;37884:33;;;;;;;;;;;;37543:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:89::-;5951:7;5991:6;5984:5;5980:18;5969:29;;5915:89;;;:::o;6010:120::-;6082:23;6099:5;6082:23;:::i;:::-;6075:5;6072:34;6062:62;;6120:1;6117;6110:12;6062:62;6010:120;:::o;6136:137::-;6181:5;6219:6;6206:20;6197:29;;6235:32;6261:5;6235:32;:::i;:::-;6136:137;;;;:::o;6279:327::-;6337:6;6386:2;6374:9;6365:7;6361:23;6357:32;6354:119;;;6392:79;;:::i;:::-;6354:119;6512:1;6537:52;6581:7;6572:6;6561:9;6557:22;6537:52;:::i;:::-;6527:62;;6483:116;6279:327;;;;:::o;6612:117::-;6721:1;6718;6711:12;6735:117;6844:1;6841;6834:12;6858:117;6967:1;6964;6957:12;6995:553;7053:8;7063:6;7113:3;7106:4;7098:6;7094:17;7090:27;7080:122;;7121:79;;:::i;:::-;7080:122;7234:6;7221:20;7211:30;;7264:18;7256:6;7253:30;7250:117;;;7286:79;;:::i;:::-;7250:117;7400:4;7392:6;7388:17;7376:29;;7454:3;7446:4;7438:6;7434:17;7424:8;7420:32;7417:41;7414:128;;;7461:79;;:::i;:::-;7414:128;6995:553;;;;;:::o;7554:529::-;7625:6;7633;7682:2;7670:9;7661:7;7657:23;7653:32;7650:119;;;7688:79;;:::i;:::-;7650:119;7836:1;7825:9;7821:17;7808:31;7866:18;7858:6;7855:30;7852:117;;;7888:79;;:::i;:::-;7852:117;8001:65;8058:7;8049:6;8038:9;8034:22;8001:65;:::i;:::-;7983:83;;;;7779:297;7554:529;;;;;:::o;8089:329::-;8148:6;8197:2;8185:9;8176:7;8172:23;8168:32;8165:119;;;8203:79;;:::i;:::-;8165:119;8323:1;8348:53;8393:7;8384:6;8373:9;8369:22;8348:53;:::i;:::-;8338:63;;8294:117;8089:329;;;;:::o;8424:116::-;8494:21;8509:5;8494:21;:::i;:::-;8487:5;8484:32;8474:60;;8530:1;8527;8520:12;8474:60;8424:116;:::o;8546:133::-;8589:5;8627:6;8614:20;8605:29;;8643:30;8667:5;8643:30;:::i;:::-;8546:133;;;;:::o;8685:468::-;8750:6;8758;8807:2;8795:9;8786:7;8782:23;8778:32;8775:119;;;8813:79;;:::i;:::-;8775:119;8933:1;8958:53;9003:7;8994:6;8983:9;8979:22;8958:53;:::i;:::-;8948:63;;8904:117;9060:2;9086:50;9128:7;9119:6;9108:9;9104:22;9086:50;:::i;:::-;9076:60;;9031:115;8685:468;;;;;:::o;9159:117::-;9268:1;9265;9258:12;9282:180;9330:77;9327:1;9320:88;9427:4;9424:1;9417:15;9451:4;9448:1;9441:15;9468:281;9551:27;9573:4;9551:27;:::i;:::-;9543:6;9539:40;9681:6;9669:10;9666:22;9645:18;9633:10;9630:34;9627:62;9624:88;;;9692:18;;:::i;:::-;9624:88;9732:10;9728:2;9721:22;9511:238;9468:281;;:::o;9755:129::-;9789:6;9816:20;;:::i;:::-;9806:30;;9845:33;9873:4;9865:6;9845:33;:::i;:::-;9755:129;;;:::o;9890:307::-;9951:4;10041:18;10033:6;10030:30;10027:56;;;10063:18;;:::i;:::-;10027:56;10101:29;10123:6;10101:29;:::i;:::-;10093:37;;10185:4;10179;10175:15;10167:23;;9890:307;;;:::o;10203:154::-;10287:6;10282:3;10277;10264:30;10349:1;10340:6;10335:3;10331:16;10324:27;10203:154;;;:::o;10363:410::-;10440:5;10465:65;10481:48;10522:6;10481:48;:::i;:::-;10465:65;:::i;:::-;10456:74;;10553:6;10546:5;10539:21;10591:4;10584:5;10580:16;10629:3;10620:6;10615:3;10611:16;10608:25;10605:112;;;10636:79;;:::i;:::-;10605:112;10726:41;10760:6;10755:3;10750;10726:41;:::i;:::-;10446:327;10363:410;;;;;:::o;10792:338::-;10847:5;10896:3;10889:4;10881:6;10877:17;10873:27;10863:122;;10904:79;;:::i;:::-;10863:122;11021:6;11008:20;11046:78;11120:3;11112:6;11105:4;11097:6;11093:17;11046:78;:::i;:::-;11037:87;;10853:277;10792:338;;;;:::o;11136:943::-;11231:6;11239;11247;11255;11304:3;11292:9;11283:7;11279:23;11275:33;11272:120;;;11311:79;;:::i;:::-;11272:120;11431:1;11456:53;11501:7;11492:6;11481:9;11477:22;11456:53;:::i;:::-;11446:63;;11402:117;11558:2;11584:53;11629:7;11620:6;11609:9;11605:22;11584:53;:::i;:::-;11574:63;;11529:118;11686:2;11712:53;11757:7;11748:6;11737:9;11733:22;11712:53;:::i;:::-;11702:63;;11657:118;11842:2;11831:9;11827:18;11814:32;11873:18;11865:6;11862:30;11859:117;;;11895:79;;:::i;:::-;11859:117;12000:62;12054:7;12045:6;12034:9;12030:22;12000:62;:::i;:::-;11990:72;;11785:287;11136:943;;;;;;;:::o;12085:474::-;12153:6;12161;12210:2;12198:9;12189:7;12185:23;12181:32;12178:119;;;12216:79;;:::i;:::-;12178:119;12336:1;12361:53;12406:7;12397:6;12386:9;12382:22;12361:53;:::i;:::-;12351:63;;12307:117;12463:2;12489:53;12534:7;12525:6;12514:9;12510:22;12489:53;:::i;:::-;12479:63;;12434:118;12085:474;;;;;:::o;12565:180::-;12613:77;12610:1;12603:88;12710:4;12707:1;12700:15;12734:4;12731:1;12724:15;12751:320;12795:6;12832:1;12826:4;12822:12;12812:22;;12879:1;12873:4;12869:12;12900:18;12890:81;;12956:4;12948:6;12944:17;12934:27;;12890:81;13018:2;13010:6;13007:14;12987:18;12984:38;12981:84;;;13037:18;;:::i;:::-;12981:84;12802:269;12751:320;;;:::o;13077:231::-;13217:34;13213:1;13205:6;13201:14;13194:58;13286:14;13281:2;13273:6;13269:15;13262:39;13077:231;:::o;13314:366::-;13456:3;13477:67;13541:2;13536:3;13477:67;:::i;:::-;13470:74;;13553:93;13642:3;13553:93;:::i;:::-;13671:2;13666:3;13662:12;13655:19;;13314:366;;;:::o;13686:419::-;13852:4;13890:2;13879:9;13875:18;13867:26;;13939:9;13933:4;13929:20;13925:1;13914:9;13910:17;13903:47;13967:131;14093:4;13967:131;:::i;:::-;13959:139;;13686:419;;;:::o;14111:220::-;14251:34;14247:1;14239:6;14235:14;14228:58;14320:3;14315:2;14307:6;14303:15;14296:28;14111:220;:::o;14337:366::-;14479:3;14500:67;14564:2;14559:3;14500:67;:::i;:::-;14493:74;;14576:93;14665:3;14576:93;:::i;:::-;14694:2;14689:3;14685:12;14678:19;;14337:366;;;:::o;14709:419::-;14875:4;14913:2;14902:9;14898:18;14890:26;;14962:9;14956:4;14952:20;14948:1;14937:9;14933:17;14926:47;14990:131;15116:4;14990:131;:::i;:::-;14982:139;;14709:419;;;:::o;15134:243::-;15274:34;15270:1;15262:6;15258:14;15251:58;15343:26;15338:2;15330:6;15326:15;15319:51;15134:243;:::o;15383:366::-;15525:3;15546:67;15610:2;15605:3;15546:67;:::i;:::-;15539:74;;15622:93;15711:3;15622:93;:::i;:::-;15740:2;15735:3;15731:12;15724:19;;15383:366;;;:::o;15755:419::-;15921:4;15959:2;15948:9;15944:18;15936:26;;16008:9;16002:4;15998:20;15994:1;15983:9;15979:17;15972:47;16036:131;16162:4;16036:131;:::i;:::-;16028:139;;15755:419;;;:::o;16180:236::-;16320:34;16316:1;16308:6;16304:14;16297:58;16389:19;16384:2;16376:6;16372:15;16365:44;16180:236;:::o;16422:366::-;16564:3;16585:67;16649:2;16644:3;16585:67;:::i;:::-;16578:74;;16661:93;16750:3;16661:93;:::i;:::-;16779:2;16774:3;16770:12;16763:19;;16422:366;;;:::o;16794:419::-;16960:4;16998:2;16987:9;16983:18;16975:26;;17047:9;17041:4;17037:20;17033:1;17022:9;17018:17;17011:47;17075:131;17201:4;17075:131;:::i;:::-;17067:139;;16794:419;;;:::o;17219:182::-;17359:34;17355:1;17347:6;17343:14;17336:58;17219:182;:::o;17407:366::-;17549:3;17570:67;17634:2;17629:3;17570:67;:::i;:::-;17563:74;;17646:93;17735:3;17646:93;:::i;:::-;17764:2;17759:3;17755:12;17748:19;;17407:366;;;:::o;17779:419::-;17945:4;17983:2;17972:9;17968:18;17960:26;;18032:9;18026:4;18022:20;18018:1;18007:9;18003:17;17996:47;18060:131;18186:4;18060:131;:::i;:::-;18052:139;;17779:419;;;:::o;18204:172::-;18344:24;18340:1;18332:6;18328:14;18321:48;18204:172;:::o;18382:366::-;18524:3;18545:67;18609:2;18604:3;18545:67;:::i;:::-;18538:74;;18621:93;18710:3;18621:93;:::i;:::-;18739:2;18734:3;18730:12;18723:19;;18382:366;;;:::o;18754:419::-;18920:4;18958:2;18947:9;18943:18;18935:26;;19007:9;19001:4;18997:20;18993:1;18982:9;18978:17;18971:47;19035:131;19161:4;19035:131;:::i;:::-;19027:139;;18754:419;;;:::o;19179:228::-;19319:34;19315:1;19307:6;19303:14;19296:58;19388:11;19383:2;19375:6;19371:15;19364:36;19179:228;:::o;19413:366::-;19555:3;19576:67;19640:2;19635:3;19576:67;:::i;:::-;19569:74;;19652:93;19741:3;19652:93;:::i;:::-;19770:2;19765:3;19761:12;19754:19;;19413:366;;;:::o;19785:419::-;19951:4;19989:2;19978:9;19974:18;19966:26;;20038:9;20032:4;20028:20;20024:1;20013:9;20009:17;20002:47;20066:131;20192:4;20066:131;:::i;:::-;20058:139;;19785:419;;;:::o;20210:229::-;20350:34;20346:1;20338:6;20334:14;20327:58;20419:12;20414:2;20406:6;20402:15;20395:37;20210:229;:::o;20445:366::-;20587:3;20608:67;20672:2;20667:3;20608:67;:::i;:::-;20601:74;;20684:93;20773:3;20684:93;:::i;:::-;20802:2;20797:3;20793:12;20786:19;;20445:366;;;:::o;20817:419::-;20983:4;21021:2;21010:9;21006:18;20998:26;;21070:9;21064:4;21060:20;21056:1;21045:9;21041:17;21034:47;21098:131;21224:4;21098:131;:::i;:::-;21090:139;;20817:419;;;:::o;21242:168::-;21382:20;21378:1;21370:6;21366:14;21359:44;21242:168;:::o;21416:366::-;21558:3;21579:67;21643:2;21638:3;21579:67;:::i;:::-;21572:74;;21655:93;21744:3;21655:93;:::i;:::-;21773:2;21768:3;21764:12;21757:19;;21416:366;;;:::o;21788:419::-;21954:4;21992:2;21981:9;21977:18;21969:26;;22041:9;22035:4;22031:20;22027:1;22016:9;22012:17;22005:47;22069:131;22195:4;22069:131;:::i;:::-;22061:139;;21788:419;;;:::o;22213:172::-;22353:24;22349:1;22341:6;22337:14;22330:48;22213:172;:::o;22391:366::-;22533:3;22554:67;22618:2;22613:3;22554:67;:::i;:::-;22547:74;;22630:93;22719:3;22630:93;:::i;:::-;22748:2;22743:3;22739:12;22732:19;;22391:366;;;:::o;22763:419::-;22929:4;22967:2;22956:9;22952:18;22944:26;;23016:9;23010:4;23006:20;23002:1;22991:9;22987:17;22980:47;23044:131;23170:4;23044:131;:::i;:::-;23036:139;;22763:419;;;:::o;23188:222::-;23328:34;23324:1;23316:6;23312:14;23305:58;23397:5;23392:2;23384:6;23380:15;23373:30;23188:222;:::o;23416:366::-;23558:3;23579:67;23643:2;23638:3;23579:67;:::i;:::-;23572:74;;23655:93;23744:3;23655:93;:::i;:::-;23773:2;23768:3;23764:12;23757:19;;23416:366;;;:::o;23788:419::-;23954:4;23992:2;23981:9;23977:18;23969:26;;24041:9;24035:4;24031:20;24027:1;24016:9;24012:17;24005:47;24069:131;24195:4;24069:131;:::i;:::-;24061:139;;23788:419;;;:::o;24213:170::-;24353:22;24349:1;24341:6;24337:14;24330:46;24213:170;:::o;24389:366::-;24531:3;24552:67;24616:2;24611:3;24552:67;:::i;:::-;24545:74;;24628:93;24717:3;24628:93;:::i;:::-;24746:2;24741:3;24737:12;24730:19;;24389:366;;;:::o;24761:419::-;24927:4;24965:2;24954:9;24950:18;24942:26;;25014:9;25008:4;25004:20;25000:1;24989:9;24985:17;24978:47;25042:131;25168:4;25042:131;:::i;:::-;25034:139;;24761:419;;;:::o;25186:175::-;25326:27;25322:1;25314:6;25310:14;25303:51;25186:175;:::o;25367:366::-;25509:3;25530:67;25594:2;25589:3;25530:67;:::i;:::-;25523:74;;25606:93;25695:3;25606:93;:::i;:::-;25724:2;25719:3;25715:12;25708:19;;25367:366;;;:::o;25739:419::-;25905:4;25943:2;25932:9;25928:18;25920:26;;25992:9;25986:4;25982:20;25978:1;25967:9;25963:17;25956:47;26020:131;26146:4;26020:131;:::i;:::-;26012:139;;25739:419;;;:::o;26164:234::-;26304:34;26300:1;26292:6;26288:14;26281:58;26373:17;26368:2;26360:6;26356:15;26349:42;26164:234;:::o;26404:366::-;26546:3;26567:67;26631:2;26626:3;26567:67;:::i;:::-;26560:74;;26643:93;26732:3;26643:93;:::i;:::-;26761:2;26756:3;26752:12;26745:19;;26404:366;;;:::o;26776:419::-;26942:4;26980:2;26969:9;26965:18;26957:26;;27029:9;27023:4;27019:20;27015:1;27004:9;27000:17;26993:47;27057:131;27183:4;27057:131;:::i;:::-;27049:139;;26776:419;;;:::o;27201:148::-;27303:11;27340:3;27325:18;;27201:148;;;;:::o;27355:377::-;27461:3;27489:39;27522:5;27489:39;:::i;:::-;27544:89;27626:6;27621:3;27544:89;:::i;:::-;27537:96;;27642:52;27687:6;27682:3;27675:4;27668:5;27664:16;27642:52;:::i;:::-;27719:6;27714:3;27710:16;27703:23;;27465:267;27355:377;;;;:::o;27738:141::-;27787:4;27810:3;27802:11;;27833:3;27830:1;27823:14;27867:4;27864:1;27854:18;27846:26;;27738:141;;;:::o;27909:845::-;28012:3;28049:5;28043:12;28078:36;28104:9;28078:36;:::i;:::-;28130:89;28212:6;28207:3;28130:89;:::i;:::-;28123:96;;28250:1;28239:9;28235:17;28266:1;28261:137;;;;28412:1;28407:341;;;;28228:520;;28261:137;28345:4;28341:9;28330;28326:25;28321:3;28314:38;28381:6;28376:3;28372:16;28365:23;;28261:137;;28407:341;28474:38;28506:5;28474:38;:::i;:::-;28534:1;28548:154;28562:6;28559:1;28556:13;28548:154;;;28636:7;28630:14;28626:1;28621:3;28617:11;28610:35;28686:1;28677:7;28673:15;28662:26;;28584:4;28581:1;28577:12;28572:17;;28548:154;;;28731:6;28726:3;28722:16;28715:23;;28414:334;;28228:520;;28016:738;;27909:845;;;;:::o;28760:589::-;28985:3;29007:95;29098:3;29089:6;29007:95;:::i;:::-;29000:102;;29119:95;29210:3;29201:6;29119:95;:::i;:::-;29112:102;;29231:92;29319:3;29310:6;29231:92;:::i;:::-;29224:99;;29340:3;29333:10;;28760:589;;;;;;:::o;29355:225::-;29495:34;29491:1;29483:6;29479:14;29472:58;29564:8;29559:2;29551:6;29547:15;29540:33;29355:225;:::o;29586:366::-;29728:3;29749:67;29813:2;29808:3;29749:67;:::i;:::-;29742:74;;29825:93;29914:3;29825:93;:::i;:::-;29943:2;29938:3;29934:12;29927:19;;29586:366;;;:::o;29958:419::-;30124:4;30162:2;30151:9;30147:18;30139:26;;30211:9;30205:4;30201:20;30197:1;30186:9;30182:17;30175:47;30239:131;30365:4;30239:131;:::i;:::-;30231:139;;29958:419;;;:::o;30383:231::-;30523:34;30519:1;30511:6;30507:14;30500:58;30592:14;30587:2;30579:6;30575:15;30568:39;30383:231;:::o;30620:366::-;30762:3;30783:67;30847:2;30842:3;30783:67;:::i;:::-;30776:74;;30859:93;30948:3;30859:93;:::i;:::-;30977:2;30972:3;30968:12;30961:19;;30620:366;;;:::o;30992:419::-;31158:4;31196:2;31185:9;31181:18;31173:26;;31245:9;31239:4;31235:20;31231:1;31220:9;31216:17;31209:47;31273:131;31399:4;31273:131;:::i;:::-;31265:139;;30992:419;;;:::o;31417:228::-;31557:34;31553:1;31545:6;31541:14;31534:58;31626:11;31621:2;31613:6;31609:15;31602:36;31417:228;:::o;31651:366::-;31793:3;31814:67;31878:2;31873:3;31814:67;:::i;:::-;31807:74;;31890:93;31979:3;31890:93;:::i;:::-;32008:2;32003:3;31999:12;31992:19;;31651:366;;;:::o;32023:419::-;32189:4;32227:2;32216:9;32212:18;32204:26;;32276:9;32270:4;32266:20;32262:1;32251:9;32247:17;32240:47;32304:131;32430:4;32304:131;:::i;:::-;32296:139;;32023:419;;;:::o;32448:223::-;32588:34;32584:1;32576:6;32572:14;32565:58;32657:6;32652:2;32644:6;32640:15;32633:31;32448:223;:::o;32677:366::-;32819:3;32840:67;32904:2;32899:3;32840:67;:::i;:::-;32833:74;;32916:93;33005:3;32916:93;:::i;:::-;33034:2;33029:3;33025:12;33018:19;;32677:366;;;:::o;33049:419::-;33215:4;33253:2;33242:9;33238:18;33230:26;;33302:9;33296:4;33292:20;33288:1;33277:9;33273:17;33266:47;33330:131;33456:4;33330:131;:::i;:::-;33322:139;;33049:419;;;:::o;33474:180::-;33522:77;33519:1;33512:88;33619:4;33616:1;33609:15;33643:4;33640:1;33633:15;33660:191;33700:4;33720:20;33738:1;33720:20;:::i;:::-;33715:25;;33754:20;33772:1;33754:20;:::i;:::-;33749:25;;33793:1;33790;33787:8;33784:34;;;33798:18;;:::i;:::-;33784:34;33843:1;33840;33836:9;33828:17;;33660:191;;;;:::o;33857:305::-;33897:3;33916:20;33934:1;33916:20;:::i;:::-;33911:25;;33950:20;33968:1;33950:20;:::i;:::-;33945:25;;34104:1;34036:66;34032:74;34029:1;34026:81;34023:107;;;34110:18;;:::i;:::-;34023:107;34154:1;34151;34147:9;34140:16;;33857:305;;;;:::o;34168:233::-;34207:3;34230:24;34248:5;34230:24;:::i;:::-;34221:33;;34276:66;34269:5;34266:77;34263:103;;;34346:18;;:::i;:::-;34263:103;34393:1;34386:5;34382:13;34375:20;;34168:233;;;:::o;34407:348::-;34447:7;34470:20;34488:1;34470:20;:::i;:::-;34465:25;;34504:20;34522:1;34504:20;:::i;:::-;34499:25;;34692:1;34624:66;34620:74;34617:1;34614:81;34609:1;34602:9;34595:17;34591:105;34588:131;;;34699:18;;:::i;:::-;34588:131;34747:1;34744;34740:9;34729:20;;34407:348;;;;:::o;34761:237::-;34901:34;34897:1;34889:6;34885:14;34878:58;34970:20;34965:2;34957:6;34953:15;34946:45;34761:237;:::o;35004:366::-;35146:3;35167:67;35231:2;35226:3;35167:67;:::i;:::-;35160:74;;35243:93;35332:3;35243:93;:::i;:::-;35361:2;35356:3;35352:12;35345:19;;35004:366;;;:::o;35376:419::-;35542:4;35580:2;35569:9;35565:18;35557:26;;35629:9;35623:4;35619:20;35615:1;35604:9;35600:17;35593:47;35657:131;35783:4;35657:131;:::i;:::-;35649:139;;35376:419;;;:::o;35801:180::-;35849:77;35846:1;35839:88;35946:4;35943:1;35936:15;35970:4;35967:1;35960:15;35987:185;36027:1;36044:20;36062:1;36044:20;:::i;:::-;36039:25;;36078:20;36096:1;36078:20;:::i;:::-;36073:25;;36117:1;36107:35;;36122:18;;:::i;:::-;36107:35;36164:1;36161;36157:9;36152:14;;35987:185;;;;:::o;36178:176::-;36210:1;36227:20;36245:1;36227:20;:::i;:::-;36222:25;;36261:20;36279:1;36261:20;:::i;:::-;36256:25;;36300:1;36290:35;;36305:18;;:::i;:::-;36290:35;36346:1;36343;36339:9;36334:14;;36178:176;;;;:::o;36360:180::-;36408:77;36405:1;36398:88;36505:4;36502:1;36495:15;36529:4;36526:1;36519:15;36546:98;36597:6;36631:5;36625:12;36615:22;;36546:98;;;:::o;36650:168::-;36733:11;36767:6;36762:3;36755:19;36807:4;36802:3;36798:14;36783:29;;36650:168;;;;:::o;36824:360::-;36910:3;36938:38;36970:5;36938:38;:::i;:::-;36992:70;37055:6;37050:3;36992:70;:::i;:::-;36985:77;;37071:52;37116:6;37111:3;37104:4;37097:5;37093:16;37071:52;:::i;:::-;37148:29;37170:6;37148:29;:::i;:::-;37143:3;37139:39;37132:46;;36914:270;36824:360;;;;:::o;37190:640::-;37385:4;37423:3;37412:9;37408:19;37400:27;;37437:71;37505:1;37494:9;37490:17;37481:6;37437:71;:::i;:::-;37518:72;37586:2;37575:9;37571:18;37562:6;37518:72;:::i;:::-;37600;37668:2;37657:9;37653:18;37644:6;37600:72;:::i;:::-;37719:9;37713:4;37709:20;37704:2;37693:9;37689:18;37682:48;37747:76;37818:4;37809:6;37747:76;:::i;:::-;37739:84;;37190:640;;;;;;;:::o;37836:141::-;37892:5;37923:6;37917:13;37908:22;;37939:32;37965:5;37939:32;:::i;:::-;37836:141;;;;:::o;37983:349::-;38052:6;38101:2;38089:9;38080:7;38076:23;38072:32;38069:119;;;38107:79;;:::i;:::-;38069:119;38227:1;38252:63;38307:7;38298:6;38287:9;38283:22;38252:63;:::i;:::-;38242:73;;38198:127;37983:349;;;;:::o;38338:182::-;38478:34;38474:1;38466:6;38462:14;38455:58;38338:182;:::o;38526:366::-;38668:3;38689:67;38753:2;38748:3;38689:67;:::i;:::-;38682:74;;38765:93;38854:3;38765:93;:::i;:::-;38883:2;38878:3;38874:12;38867:19;;38526:366;;;:::o;38898:419::-;39064:4;39102:2;39091:9;39087:18;39079:26;;39151:9;39145:4;39141:20;39137:1;39126:9;39122:17;39115:47;39179:131;39305:4;39179:131;:::i;:::-;39171:139;;38898:419;;;:::o;39323:178::-;39463:30;39459:1;39451:6;39447:14;39440:54;39323:178;:::o;39507:366::-;39649:3;39670:67;39734:2;39729:3;39670:67;:::i;:::-;39663:74;;39746:93;39835:3;39746:93;:::i;:::-;39864:2;39859:3;39855:12;39848:19;;39507:366;;;:::o;39879:419::-;40045:4;40083:2;40072:9;40068:18;40060:26;;40132:9;40126:4;40122:20;40118:1;40107:9;40103:17;40096:47;40160:131;40286:4;40160:131;:::i;:::-;40152:139;;39879:419;;;:::o

Swarm Source

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