ETH Price: $3,169.36 (-0.63%)

Token

Hikari: Ochita (OCH)
 

Overview

Max Total Supply

252 OCH

Holders

118

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 OCH
0xa08c74def42dfcd2ff43ad5f23aeb92c1b518b67
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:
HikariOchita

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-07
*/

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol

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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol

// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf)
        internal
        pure
        returns (bytes32)
    {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(
                    abi.encodePacked(computedHash, proofElement)
                );
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(
                    abi.encodePacked(proofElement, computedHash)
                );
            }
        }
        return computedHash;
    }
}

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (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/IERC721Receiver.sol

// OpenZeppelin Contracts v4.4.1 (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/introspection/IERC165.sol

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

// OpenZeppelin Contracts v4.4.1 (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/token/ERC721/extensions/IERC721Metadata.sol

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

pragma solidity ^0.8.0;

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (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
    {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: 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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev 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: HikariOchita.sol

pragma solidity 0.8.11;

contract HikariOchita is ERC721, Ownable {
    using MerkleProof for bytes32[];

    string private baseTokenURI;
    bool public saleOpen;

    // To store total number of NFTs minted
    uint256 private mintCount;
    uint256 public constant MAX_NFT = 500;

    bytes32 public merkleRoot;

    // Tracks number of NFTs minted by an address
    mapping(address => uint256) public addressMintCount;

    event Minted(uint256 totalMinted);

    constructor(string memory baseURI) ERC721("Hikari: Ochita", "OCH") {
        setBaseURI(baseURI);
    }

    receive() external payable {
        revert("Ether not accepted");
    }

    /**
     * @notice Toggles sale state
     * @dev Only callable by the owner
     */
    function flipSaleState() external onlyOwner {
        saleOpen = !saleOpen;
    }

    /**
     * @notice Sets merkle root
     * @param _merkleRoot root hash
     * @dev Only callable by the owner
     */
    function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner {
        merkleRoot = _merkleRoot;
    }

    /**
     * @notice Sets baseURI
     * @param baseURI api that points to the metadata
     * @dev Only callable by the owner
     */
    function setBaseURI(string memory baseURI) public onlyOwner {
        baseTokenURI = baseURI;
    }

    /**
     * @notice Returns circulating supply
     */
    function totalSupply() public view returns (uint256) {
        return mintCount;
    }

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

    /**
     * @notice Mints token.
     * @param _proof proves that your address is eligible to mint
     * @param _allowedCount represents number of NFTs caller is allowed to mint
     * @param _count indiciates number of NFTs caller wants to mint in the transaction
     */
    function mint(
        bytes32[] calldata _proof,
        uint256 _allowedCount,
        uint256 _count
    ) external {
        require(
            totalSupply() + _count <= MAX_NFT,
            "Transaction will exceed maximum supply"
        );
        require(merkleRoot != 0, "No address is eligible for minting yet");
        require(saleOpen, "Ssale is not live yet");
        require(
            MerkleProof.verify(
                _proof,
                merkleRoot,
                keccak256(abi.encodePacked(msg.sender, _allowedCount))
            ),
            "Address is not eligible for mint"
        );

        require(_count > 0 && _count <= _allowedCount, "Invalid mint count");
        require(
            _allowedCount >= addressMintCount[msg.sender] + _count,
            "Transaction will exceed maximum NFTs allowed to mint"
        );

        uint256 supply = totalSupply();
        mintCount += _count;
        addressMintCount[msg.sender] += _count;

        for (uint256 i; i < _count; i++) {
            _mint(++supply);
        }
    }

    /**
     * @notice Reserve NFTs.
     * @param _count indiciates number of NFTs owner wants to mint in the transaction
     * @dev Only callable by the owner
     */
    function reserveNFTs(uint256 _count) external onlyOwner {
        require(
            totalSupply() + _count <= MAX_NFT,
            "Transaction will exceed maximum supply"
        );

        uint256 supply = totalSupply();
        mintCount += _count;

        for (uint256 i; i < _count; i++) {
            _mint(++supply);
        }
    }

    function _mint(uint256 tokenId) private {
        _safeMint(msg.sender, tokenId);
        emit Minted(tokenId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalMinted","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_NFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"uint256","name":"_allowedCount","type":"uint256"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"reserveNFTs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","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"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b506040516200436b3803806200436b8339818101604052810190620000379190620004ff565b6040518060400160405280600e81526020017f48696b6172693a204f63686974610000000000000000000000000000000000008152506040518060400160405280600381526020017f4f434800000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000bb929190620002b2565b508060019080519060200190620000d4929190620002b2565b505050620000f7620000eb6200010f60201b60201c565b6200011760201b60201c565b6200010881620001dd60201b60201c565b5062000638565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620001ed6200010f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002136200028860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200026c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200026390620005b1565b60405180910390fd5b806007908051906020019062000284929190620002b2565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002c09062000602565b90600052602060002090601f016020900481019282620002e4576000855562000330565b82601f10620002ff57805160ff191683800117855562000330565b8280016001018555821562000330579182015b828111156200032f57825182559160200191906001019062000312565b5b5090506200033f919062000343565b5090565b5b808211156200035e57600081600090555060010162000344565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003cb8262000380565b810181811067ffffffffffffffff82111715620003ed57620003ec62000391565b5b80604052505050565b60006200040262000362565b9050620004108282620003c0565b919050565b600067ffffffffffffffff82111562000433576200043262000391565b5b6200043e8262000380565b9050602081019050919050565b60005b838110156200046b5780820151818401526020810190506200044e565b838111156200047b576000848401525b50505050565b600062000498620004928462000415565b620003f6565b905082815260208101848484011115620004b757620004b66200037b565b5b620004c48482856200044b565b509392505050565b600082601f830112620004e457620004e362000376565b5b8151620004f684826020860162000481565b91505092915050565b6000602082840312156200051857620005176200036c565b5b600082015167ffffffffffffffff81111562000539576200053862000371565b5b6200054784828501620004cc565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200059960208362000550565b9150620005a68262000561565b602082019050919050565b60006020820190508181036000830152620005cc816200058a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200061b57607f821691505b60208210811415620006325762000631620005d3565b5b50919050565b613d2380620006486000396000f3fe6080604052600436106101855760003560e01c80636fdaddf1116100d157806399288dbb1161008a578063bc7df09111610064578063bc7df0911461059e578063c87b56dd146105c7578063e985e9c514610604578063f2fde38b14610641576101c5565b806399288dbb14610521578063a22cb4651461054c578063b88d4fde14610575576101c5565b80636fdaddf11461042357806370a082311461044e578063715018a61461048b5780637cb64759146104a25780638da5cb5b146104cb57806395d89b41146104f6576101c5565b80631ba4f67d1161013e57806334918dfd1161011857806334918dfd1461037d57806342842e0e1461039457806355f804b3146103bd5780636352211e146103e6576101c5565b80631ba4f67d146102ec57806323b872dd146103295780632eb4a7ab14610352576101c5565b806301ffc9a7146101ca57806306fdde0314610207578063081812fc14610232578063095ea7b31461026f57806314bf9af61461029857806318160ddd146102c1576101c5565b366101c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101bc90612506565b60405180910390fd5b600080fd5b3480156101d657600080fd5b506101f160048036038101906101ec9190612592565b61066a565b6040516101fe91906125da565b60405180910390f35b34801561021357600080fd5b5061021c61074c565b604051610229919061267d565b60405180910390f35b34801561023e57600080fd5b50610259600480360381019061025491906126d5565b6107de565b6040516102669190612743565b60405180910390f35b34801561027b57600080fd5b506102966004803603810190610291919061278a565b610863565b005b3480156102a457600080fd5b506102bf60048036038101906102ba919061282f565b61097b565b005b3480156102cd57600080fd5b506102d6610cb0565b6040516102e391906128b2565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e91906128cd565b610cba565b60405161032091906128b2565b60405180910390f35b34801561033557600080fd5b50610350600480360381019061034b91906128fa565b610cd2565b005b34801561035e57600080fd5b50610367610d32565b6040516103749190612966565b60405180910390f35b34801561038957600080fd5b50610392610d38565b005b3480156103a057600080fd5b506103bb60048036038101906103b691906128fa565b610de0565b005b3480156103c957600080fd5b506103e460048036038101906103df9190612ab1565b610e00565b005b3480156103f257600080fd5b5061040d600480360381019061040891906126d5565b610e96565b60405161041a9190612743565b60405180910390f35b34801561042f57600080fd5b50610438610f48565b60405161044591906128b2565b60405180910390f35b34801561045a57600080fd5b50610475600480360381019061047091906128cd565b610f4e565b60405161048291906128b2565b60405180910390f35b34801561049757600080fd5b506104a0611006565b005b3480156104ae57600080fd5b506104c960048036038101906104c49190612b26565b61108e565b005b3480156104d757600080fd5b506104e0611114565b6040516104ed9190612743565b60405180910390f35b34801561050257600080fd5b5061050b61113e565b604051610518919061267d565b60405180910390f35b34801561052d57600080fd5b506105366111d0565b60405161054391906125da565b60405180910390f35b34801561055857600080fd5b50610573600480360381019061056e9190612b7f565b6111e3565b005b34801561058157600080fd5b5061059c60048036038101906105979190612c60565b6111f9565b005b3480156105aa57600080fd5b506105c560048036038101906105c091906126d5565b61125b565b005b3480156105d357600080fd5b506105ee60048036038101906105e991906126d5565b61138b565b6040516105fb919061267d565b60405180910390f35b34801561061057600080fd5b5061062b60048036038101906106269190612ce3565b611432565b60405161063891906125da565b60405180910390f35b34801561064d57600080fd5b50610668600480360381019061066391906128cd565b6114c6565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061073557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107455750610744826115be565b5b9050919050565b60606000805461075b90612d52565b80601f016020809104026020016040519081016040528092919081815260200182805461078790612d52565b80156107d45780601f106107a9576101008083540402835291602001916107d4565b820191906000526020600020905b8154815290600101906020018083116107b757829003601f168201915b5050505050905090565b60006107e982611628565b610828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081f90612df6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061086e82610e96565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d690612e88565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fe611694565b73ffffffffffffffffffffffffffffffffffffffff16148061092d575061092c81610927611694565b611432565b5b61096c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096390612f1a565b60405180910390fd5b610976838361169c565b505050565b6101f481610987610cb0565b6109919190612f69565b11156109d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c990613031565b60405180910390fd5b6000801b600a541415610a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a11906130c3565b60405180910390fd5b600860009054906101000a900460ff16610a69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a609061312f565b60405180910390fd5b610adf848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a543385604051602001610ac49291906131b8565b60405160208183030381529060405280519060200120611755565b610b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1590613230565b60405180910390fd5b600081118015610b2e5750818111155b610b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b649061329c565b60405180910390fd5b80600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610bb89190612f69565b821015610bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf19061332e565b60405180910390fd5b6000610c04610cb0565b90508160096000828254610c189190612f69565b9250508190555081600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c6e9190612f69565b9250508190555060005b82811015610ca857610c9582610c8d9061334e565b92508261176c565b8080610ca09061334e565b915050610c78565b505050505050565b6000600954905090565b600b6020528060005260406000206000915090505481565b610ce3610cdd611694565b826117b0565b610d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1990613409565b60405180910390fd5b610d2d83838361188e565b505050565b600a5481565b610d40611694565b73ffffffffffffffffffffffffffffffffffffffff16610d5e611114565b73ffffffffffffffffffffffffffffffffffffffff1614610db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dab90613475565b60405180910390fd5b600860009054906101000a900460ff1615600860006101000a81548160ff021916908315150217905550565b610dfb838383604051806020016040528060008152506111f9565b505050565b610e08611694565b73ffffffffffffffffffffffffffffffffffffffff16610e26611114565b73ffffffffffffffffffffffffffffffffffffffff1614610e7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7390613475565b60405180910390fd5b8060079080519060200190610e92929190612406565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3690613507565b60405180910390fd5b80915050919050565b6101f481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb690613599565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61100e611694565b73ffffffffffffffffffffffffffffffffffffffff1661102c611114565b73ffffffffffffffffffffffffffffffffffffffff1614611082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107990613475565b60405180910390fd5b61108c6000611aea565b565b611096611694565b73ffffffffffffffffffffffffffffffffffffffff166110b4611114565b73ffffffffffffffffffffffffffffffffffffffff161461110a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110190613475565b60405180910390fd5b80600a8190555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461114d90612d52565b80601f016020809104026020016040519081016040528092919081815260200182805461117990612d52565b80156111c65780601f1061119b576101008083540402835291602001916111c6565b820191906000526020600020905b8154815290600101906020018083116111a957829003601f168201915b5050505050905090565b600860009054906101000a900460ff1681565b6111f56111ee611694565b8383611bb0565b5050565b61120a611204611694565b836117b0565b611249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124090613409565b60405180910390fd5b61125584848484611d1d565b50505050565b611263611694565b73ffffffffffffffffffffffffffffffffffffffff16611281611114565b73ffffffffffffffffffffffffffffffffffffffff16146112d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ce90613475565b60405180910390fd5b6101f4816112e3610cb0565b6112ed9190612f69565b111561132e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132590613031565b60405180910390fd5b6000611338610cb0565b9050816009600082825461134c9190612f69565b9250508190555060005b82811015611386576113738261136b9061334e565b92508261176c565b808061137e9061334e565b915050611356565b505050565b606061139682611628565b6113d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cc9061362b565b60405180910390fd5b60006113df611d79565b905060008151116113ff576040518060200160405280600081525061142a565b8061140984611e0b565b60405160200161141a929190613687565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114ce611694565b73ffffffffffffffffffffffffffffffffffffffff166114ec611114565b73ffffffffffffffffffffffffffffffffffffffff1614611542576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153990613475565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a99061371d565b60405180910390fd5b6115bb81611aea565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661170f83610e96565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000826117628584611f6c565b1490509392505050565b611776338261201f565b7f176b02bb2d12439ff7a20b59f402cca16c76f50508b13ef3166a600eb719354a816040516117a591906128b2565b60405180910390a150565b60006117bb82611628565b6117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f1906137af565b60405180910390fd5b600061180583610e96565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061187457508373ffffffffffffffffffffffffffffffffffffffff1661185c846107de565b73ffffffffffffffffffffffffffffffffffffffff16145b8061188557506118848185611432565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166118ae82610e96565b73ffffffffffffffffffffffffffffffffffffffff1614611904576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fb90613841565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611974576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196b906138d3565b60405180910390fd5b61197f83838361203d565b61198a60008261169c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119da91906138f3565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a319190612f69565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1690613973565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d1091906125da565b60405180910390a3505050565b611d2884848461188e565b611d3484848484612042565b611d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6a90613a05565b60405180910390fd5b50505050565b606060078054611d8890612d52565b80601f0160208091040260200160405190810160405280929190818152602001828054611db490612d52565b8015611e015780601f10611dd657610100808354040283529160200191611e01565b820191906000526020600020905b815481529060010190602001808311611de457829003601f168201915b5050505050905090565b60606000821415611e53576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f67565b600082905060005b60008214611e85578080611e6e9061334e565b915050600a82611e7e9190613a54565b9150611e5b565b60008167ffffffffffffffff811115611ea157611ea0612986565b5b6040519080825280601f01601f191660200182016040528015611ed35781602001600182028036833780820191505090505b5090505b60008514611f6057600182611eec91906138f3565b9150600a85611efb9190613a85565b6030611f079190612f69565b60f81b818381518110611f1d57611f1c613ab6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f599190613a54565b9450611ed7565b8093505050505b919050565b60008082905060005b8451811015612014576000858281518110611f9357611f92613ab6565b5b60200260200101519050808311611fd4578281604051602001611fb7929190613b06565b604051602081830303815290604052805190602001209250612000565b8083604051602001611fe7929190613b06565b6040516020818303038152906040528051906020012092505b50808061200c9061334e565b915050611f75565b508091505092915050565b6120398282604051806020016040528060008152506121ca565b5050565b505050565b60006120638473ffffffffffffffffffffffffffffffffffffffff16612225565b156121bd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261208c611694565b8786866040518563ffffffff1660e01b81526004016120ae9493929190613b87565b6020604051808303816000875af19250505080156120ea57506040513d601f19601f820116820180604052508101906120e79190613be8565b60015b61216d573d806000811461211a576040519150601f19603f3d011682016040523d82523d6000602084013e61211f565b606091505b50600081511415612165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215c90613a05565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506121c2565b600190505b949350505050565b6121d48383612238565b6121e16000848484612042565b612220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221790613a05565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229f90613c61565b60405180910390fd5b6122b181611628565b156122f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e890613ccd565b60405180910390fd5b6122fd6000838361203d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461234d9190612f69565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461241290612d52565b90600052602060002090601f016020900481019282612434576000855561247b565b82601f1061244d57805160ff191683800117855561247b565b8280016001018555821561247b579182015b8281111561247a57825182559160200191906001019061245f565b5b509050612488919061248c565b5090565b5b808211156124a557600081600090555060010161248d565b5090565b600082825260208201905092915050565b7f4574686572206e6f742061636365707465640000000000000000000000000000600082015250565b60006124f06012836124a9565b91506124fb826124ba565b602082019050919050565b6000602082019050818103600083015261251f816124e3565b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61256f8161253a565b811461257a57600080fd5b50565b60008135905061258c81612566565b92915050565b6000602082840312156125a8576125a7612530565b5b60006125b68482850161257d565b91505092915050565b60008115159050919050565b6125d4816125bf565b82525050565b60006020820190506125ef60008301846125cb565b92915050565b600081519050919050565b60005b8381101561261e578082015181840152602081019050612603565b8381111561262d576000848401525b50505050565b6000601f19601f8301169050919050565b600061264f826125f5565b61265981856124a9565b9350612669818560208601612600565b61267281612633565b840191505092915050565b600060208201905081810360008301526126978184612644565b905092915050565b6000819050919050565b6126b28161269f565b81146126bd57600080fd5b50565b6000813590506126cf816126a9565b92915050565b6000602082840312156126eb576126ea612530565b5b60006126f9848285016126c0565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061272d82612702565b9050919050565b61273d81612722565b82525050565b60006020820190506127586000830184612734565b92915050565b61276781612722565b811461277257600080fd5b50565b6000813590506127848161275e565b92915050565b600080604083850312156127a1576127a0612530565b5b60006127af85828601612775565b92505060206127c0858286016126c0565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126127ef576127ee6127ca565b5b8235905067ffffffffffffffff81111561280c5761280b6127cf565b5b602083019150836020820283011115612828576128276127d4565b5b9250929050565b6000806000806060858703121561284957612848612530565b5b600085013567ffffffffffffffff81111561286757612866612535565b5b612873878288016127d9565b94509450506020612886878288016126c0565b9250506040612897878288016126c0565b91505092959194509250565b6128ac8161269f565b82525050565b60006020820190506128c760008301846128a3565b92915050565b6000602082840312156128e3576128e2612530565b5b60006128f184828501612775565b91505092915050565b60008060006060848603121561291357612912612530565b5b600061292186828701612775565b935050602061293286828701612775565b9250506040612943868287016126c0565b9150509250925092565b6000819050919050565b6129608161294d565b82525050565b600060208201905061297b6000830184612957565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6129be82612633565b810181811067ffffffffffffffff821117156129dd576129dc612986565b5b80604052505050565b60006129f0612526565b90506129fc82826129b5565b919050565b600067ffffffffffffffff821115612a1c57612a1b612986565b5b612a2582612633565b9050602081019050919050565b82818337600083830152505050565b6000612a54612a4f84612a01565b6129e6565b905082815260208101848484011115612a7057612a6f612981565b5b612a7b848285612a32565b509392505050565b600082601f830112612a9857612a976127ca565b5b8135612aa8848260208601612a41565b91505092915050565b600060208284031215612ac757612ac6612530565b5b600082013567ffffffffffffffff811115612ae557612ae4612535565b5b612af184828501612a83565b91505092915050565b612b038161294d565b8114612b0e57600080fd5b50565b600081359050612b2081612afa565b92915050565b600060208284031215612b3c57612b3b612530565b5b6000612b4a84828501612b11565b91505092915050565b612b5c816125bf565b8114612b6757600080fd5b50565b600081359050612b7981612b53565b92915050565b60008060408385031215612b9657612b95612530565b5b6000612ba485828601612775565b9250506020612bb585828601612b6a565b9150509250929050565b600067ffffffffffffffff821115612bda57612bd9612986565b5b612be382612633565b9050602081019050919050565b6000612c03612bfe84612bbf565b6129e6565b905082815260208101848484011115612c1f57612c1e612981565b5b612c2a848285612a32565b509392505050565b600082601f830112612c4757612c466127ca565b5b8135612c57848260208601612bf0565b91505092915050565b60008060008060808587031215612c7a57612c79612530565b5b6000612c8887828801612775565b9450506020612c9987828801612775565b9350506040612caa878288016126c0565b925050606085013567ffffffffffffffff811115612ccb57612cca612535565b5b612cd787828801612c32565b91505092959194509250565b60008060408385031215612cfa57612cf9612530565b5b6000612d0885828601612775565b9250506020612d1985828601612775565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612d6a57607f821691505b60208210811415612d7e57612d7d612d23565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612de0602c836124a9565b9150612deb82612d84565b604082019050919050565b60006020820190508181036000830152612e0f81612dd3565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612e726021836124a9565b9150612e7d82612e16565b604082019050919050565b60006020820190508181036000830152612ea181612e65565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612f046038836124a9565b9150612f0f82612ea8565b604082019050919050565b60006020820190508181036000830152612f3381612ef7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612f748261269f565b9150612f7f8361269f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612fb457612fb3612f3a565b5b828201905092915050565b7f5472616e73616374696f6e2077696c6c20657863656564206d6178696d756d2060008201527f737570706c790000000000000000000000000000000000000000000000000000602082015250565b600061301b6026836124a9565b915061302682612fbf565b604082019050919050565b6000602082019050818103600083015261304a8161300e565b9050919050565b7f4e6f206164647265737320697320656c696769626c6520666f72206d696e746960008201527f6e67207965740000000000000000000000000000000000000000000000000000602082015250565b60006130ad6026836124a9565b91506130b882613051565b604082019050919050565b600060208201905081810360008301526130dc816130a0565b9050919050565b7f5373616c65206973206e6f74206c697665207965740000000000000000000000600082015250565b60006131196015836124a9565b9150613124826130e3565b602082019050919050565b600060208201905081810360008301526131488161310c565b9050919050565b60008160601b9050919050565b60006131678261314f565b9050919050565b60006131798261315c565b9050919050565b61319161318c82612722565b61316e565b82525050565b6000819050919050565b6131b26131ad8261269f565b613197565b82525050565b60006131c48285613180565b6014820191506131d482846131a1565b6020820191508190509392505050565b7f41646472657373206973206e6f7420656c696769626c6520666f72206d696e74600082015250565b600061321a6020836124a9565b9150613225826131e4565b602082019050919050565b600060208201905081810360008301526132498161320d565b9050919050565b7f496e76616c6964206d696e7420636f756e740000000000000000000000000000600082015250565b60006132866012836124a9565b915061329182613250565b602082019050919050565b600060208201905081810360008301526132b581613279565b9050919050565b7f5472616e73616374696f6e2077696c6c20657863656564206d6178696d756d2060008201527f4e46547320616c6c6f77656420746f206d696e74000000000000000000000000602082015250565b60006133186034836124a9565b9150613323826132bc565b604082019050919050565b600060208201905081810360008301526133478161330b565b9050919050565b60006133598261269f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561338c5761338b612f3a565b5b600182019050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006133f36031836124a9565b91506133fe82613397565b604082019050919050565b60006020820190508181036000830152613422816133e6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061345f6020836124a9565b915061346a82613429565b602082019050919050565b6000602082019050818103600083015261348e81613452565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006134f16029836124a9565b91506134fc82613495565b604082019050919050565b60006020820190508181036000830152613520816134e4565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613583602a836124a9565b915061358e82613527565b604082019050919050565b600060208201905081810360008301526135b281613576565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613615602f836124a9565b9150613620826135b9565b604082019050919050565b6000602082019050818103600083015261364481613608565b9050919050565b600081905092915050565b6000613661826125f5565b61366b818561364b565b935061367b818560208601612600565b80840191505092915050565b60006136938285613656565b915061369f8284613656565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006137076026836124a9565b9150613712826136ab565b604082019050919050565b60006020820190508181036000830152613736816136fa565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613799602c836124a9565b91506137a48261373d565b604082019050919050565b600060208201905081810360008301526137c88161378c565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061382b6029836124a9565b9150613836826137cf565b604082019050919050565b6000602082019050818103600083015261385a8161381e565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006138bd6024836124a9565b91506138c882613861565b604082019050919050565b600060208201905081810360008301526138ec816138b0565b9050919050565b60006138fe8261269f565b91506139098361269f565b92508282101561391c5761391b612f3a565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061395d6019836124a9565b915061396882613927565b602082019050919050565b6000602082019050818103600083015261398c81613950565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006139ef6032836124a9565b91506139fa82613993565b604082019050919050565b60006020820190508181036000830152613a1e816139e2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613a5f8261269f565b9150613a6a8361269f565b925082613a7a57613a79613a25565b5b828204905092915050565b6000613a908261269f565b9150613a9b8361269f565b925082613aab57613aaa613a25565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b613b00613afb8261294d565b613ae5565b82525050565b6000613b128285613aef565b602082019150613b228284613aef565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000613b5982613b32565b613b638185613b3d565b9350613b73818560208601612600565b613b7c81612633565b840191505092915050565b6000608082019050613b9c6000830187612734565b613ba96020830186612734565b613bb660408301856128a3565b8181036060830152613bc88184613b4e565b905095945050505050565b600081519050613be281612566565b92915050565b600060208284031215613bfe57613bfd612530565b5b6000613c0c84828501613bd3565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613c4b6020836124a9565b9150613c5682613c15565b602082019050919050565b60006020820190508181036000830152613c7a81613c3e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613cb7601c836124a9565b9150613cc282613c81565b602082019050919050565b60006020820190508181036000830152613ce681613caa565b905091905056fea2646970667358221220859eabbd1aed9636652f369bb71de0d13dcd561ba3c6aa97584263bbdbef394c64736f6c634300080b003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101855760003560e01c80636fdaddf1116100d157806399288dbb1161008a578063bc7df09111610064578063bc7df0911461059e578063c87b56dd146105c7578063e985e9c514610604578063f2fde38b14610641576101c5565b806399288dbb14610521578063a22cb4651461054c578063b88d4fde14610575576101c5565b80636fdaddf11461042357806370a082311461044e578063715018a61461048b5780637cb64759146104a25780638da5cb5b146104cb57806395d89b41146104f6576101c5565b80631ba4f67d1161013e57806334918dfd1161011857806334918dfd1461037d57806342842e0e1461039457806355f804b3146103bd5780636352211e146103e6576101c5565b80631ba4f67d146102ec57806323b872dd146103295780632eb4a7ab14610352576101c5565b806301ffc9a7146101ca57806306fdde0314610207578063081812fc14610232578063095ea7b31461026f57806314bf9af61461029857806318160ddd146102c1576101c5565b366101c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101bc90612506565b60405180910390fd5b600080fd5b3480156101d657600080fd5b506101f160048036038101906101ec9190612592565b61066a565b6040516101fe91906125da565b60405180910390f35b34801561021357600080fd5b5061021c61074c565b604051610229919061267d565b60405180910390f35b34801561023e57600080fd5b50610259600480360381019061025491906126d5565b6107de565b6040516102669190612743565b60405180910390f35b34801561027b57600080fd5b506102966004803603810190610291919061278a565b610863565b005b3480156102a457600080fd5b506102bf60048036038101906102ba919061282f565b61097b565b005b3480156102cd57600080fd5b506102d6610cb0565b6040516102e391906128b2565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e91906128cd565b610cba565b60405161032091906128b2565b60405180910390f35b34801561033557600080fd5b50610350600480360381019061034b91906128fa565b610cd2565b005b34801561035e57600080fd5b50610367610d32565b6040516103749190612966565b60405180910390f35b34801561038957600080fd5b50610392610d38565b005b3480156103a057600080fd5b506103bb60048036038101906103b691906128fa565b610de0565b005b3480156103c957600080fd5b506103e460048036038101906103df9190612ab1565b610e00565b005b3480156103f257600080fd5b5061040d600480360381019061040891906126d5565b610e96565b60405161041a9190612743565b60405180910390f35b34801561042f57600080fd5b50610438610f48565b60405161044591906128b2565b60405180910390f35b34801561045a57600080fd5b50610475600480360381019061047091906128cd565b610f4e565b60405161048291906128b2565b60405180910390f35b34801561049757600080fd5b506104a0611006565b005b3480156104ae57600080fd5b506104c960048036038101906104c49190612b26565b61108e565b005b3480156104d757600080fd5b506104e0611114565b6040516104ed9190612743565b60405180910390f35b34801561050257600080fd5b5061050b61113e565b604051610518919061267d565b60405180910390f35b34801561052d57600080fd5b506105366111d0565b60405161054391906125da565b60405180910390f35b34801561055857600080fd5b50610573600480360381019061056e9190612b7f565b6111e3565b005b34801561058157600080fd5b5061059c60048036038101906105979190612c60565b6111f9565b005b3480156105aa57600080fd5b506105c560048036038101906105c091906126d5565b61125b565b005b3480156105d357600080fd5b506105ee60048036038101906105e991906126d5565b61138b565b6040516105fb919061267d565b60405180910390f35b34801561061057600080fd5b5061062b60048036038101906106269190612ce3565b611432565b60405161063891906125da565b60405180910390f35b34801561064d57600080fd5b50610668600480360381019061066391906128cd565b6114c6565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061073557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107455750610744826115be565b5b9050919050565b60606000805461075b90612d52565b80601f016020809104026020016040519081016040528092919081815260200182805461078790612d52565b80156107d45780601f106107a9576101008083540402835291602001916107d4565b820191906000526020600020905b8154815290600101906020018083116107b757829003601f168201915b5050505050905090565b60006107e982611628565b610828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081f90612df6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061086e82610e96565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d690612e88565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fe611694565b73ffffffffffffffffffffffffffffffffffffffff16148061092d575061092c81610927611694565b611432565b5b61096c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096390612f1a565b60405180910390fd5b610976838361169c565b505050565b6101f481610987610cb0565b6109919190612f69565b11156109d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c990613031565b60405180910390fd5b6000801b600a541415610a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a11906130c3565b60405180910390fd5b600860009054906101000a900460ff16610a69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a609061312f565b60405180910390fd5b610adf848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a543385604051602001610ac49291906131b8565b60405160208183030381529060405280519060200120611755565b610b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1590613230565b60405180910390fd5b600081118015610b2e5750818111155b610b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b649061329c565b60405180910390fd5b80600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610bb89190612f69565b821015610bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf19061332e565b60405180910390fd5b6000610c04610cb0565b90508160096000828254610c189190612f69565b9250508190555081600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c6e9190612f69565b9250508190555060005b82811015610ca857610c9582610c8d9061334e565b92508261176c565b8080610ca09061334e565b915050610c78565b505050505050565b6000600954905090565b600b6020528060005260406000206000915090505481565b610ce3610cdd611694565b826117b0565b610d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1990613409565b60405180910390fd5b610d2d83838361188e565b505050565b600a5481565b610d40611694565b73ffffffffffffffffffffffffffffffffffffffff16610d5e611114565b73ffffffffffffffffffffffffffffffffffffffff1614610db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dab90613475565b60405180910390fd5b600860009054906101000a900460ff1615600860006101000a81548160ff021916908315150217905550565b610dfb838383604051806020016040528060008152506111f9565b505050565b610e08611694565b73ffffffffffffffffffffffffffffffffffffffff16610e26611114565b73ffffffffffffffffffffffffffffffffffffffff1614610e7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7390613475565b60405180910390fd5b8060079080519060200190610e92929190612406565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3690613507565b60405180910390fd5b80915050919050565b6101f481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb690613599565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61100e611694565b73ffffffffffffffffffffffffffffffffffffffff1661102c611114565b73ffffffffffffffffffffffffffffffffffffffff1614611082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107990613475565b60405180910390fd5b61108c6000611aea565b565b611096611694565b73ffffffffffffffffffffffffffffffffffffffff166110b4611114565b73ffffffffffffffffffffffffffffffffffffffff161461110a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110190613475565b60405180910390fd5b80600a8190555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461114d90612d52565b80601f016020809104026020016040519081016040528092919081815260200182805461117990612d52565b80156111c65780601f1061119b576101008083540402835291602001916111c6565b820191906000526020600020905b8154815290600101906020018083116111a957829003601f168201915b5050505050905090565b600860009054906101000a900460ff1681565b6111f56111ee611694565b8383611bb0565b5050565b61120a611204611694565b836117b0565b611249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124090613409565b60405180910390fd5b61125584848484611d1d565b50505050565b611263611694565b73ffffffffffffffffffffffffffffffffffffffff16611281611114565b73ffffffffffffffffffffffffffffffffffffffff16146112d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ce90613475565b60405180910390fd5b6101f4816112e3610cb0565b6112ed9190612f69565b111561132e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132590613031565b60405180910390fd5b6000611338610cb0565b9050816009600082825461134c9190612f69565b9250508190555060005b82811015611386576113738261136b9061334e565b92508261176c565b808061137e9061334e565b915050611356565b505050565b606061139682611628565b6113d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cc9061362b565b60405180910390fd5b60006113df611d79565b905060008151116113ff576040518060200160405280600081525061142a565b8061140984611e0b565b60405160200161141a929190613687565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114ce611694565b73ffffffffffffffffffffffffffffffffffffffff166114ec611114565b73ffffffffffffffffffffffffffffffffffffffff1614611542576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153990613475565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a99061371d565b60405180910390fd5b6115bb81611aea565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661170f83610e96565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000826117628584611f6c565b1490509392505050565b611776338261201f565b7f176b02bb2d12439ff7a20b59f402cca16c76f50508b13ef3166a600eb719354a816040516117a591906128b2565b60405180910390a150565b60006117bb82611628565b6117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f1906137af565b60405180910390fd5b600061180583610e96565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061187457508373ffffffffffffffffffffffffffffffffffffffff1661185c846107de565b73ffffffffffffffffffffffffffffffffffffffff16145b8061188557506118848185611432565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166118ae82610e96565b73ffffffffffffffffffffffffffffffffffffffff1614611904576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fb90613841565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611974576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196b906138d3565b60405180910390fd5b61197f83838361203d565b61198a60008261169c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119da91906138f3565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a319190612f69565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1690613973565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d1091906125da565b60405180910390a3505050565b611d2884848461188e565b611d3484848484612042565b611d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6a90613a05565b60405180910390fd5b50505050565b606060078054611d8890612d52565b80601f0160208091040260200160405190810160405280929190818152602001828054611db490612d52565b8015611e015780601f10611dd657610100808354040283529160200191611e01565b820191906000526020600020905b815481529060010190602001808311611de457829003601f168201915b5050505050905090565b60606000821415611e53576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f67565b600082905060005b60008214611e85578080611e6e9061334e565b915050600a82611e7e9190613a54565b9150611e5b565b60008167ffffffffffffffff811115611ea157611ea0612986565b5b6040519080825280601f01601f191660200182016040528015611ed35781602001600182028036833780820191505090505b5090505b60008514611f6057600182611eec91906138f3565b9150600a85611efb9190613a85565b6030611f079190612f69565b60f81b818381518110611f1d57611f1c613ab6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f599190613a54565b9450611ed7565b8093505050505b919050565b60008082905060005b8451811015612014576000858281518110611f9357611f92613ab6565b5b60200260200101519050808311611fd4578281604051602001611fb7929190613b06565b604051602081830303815290604052805190602001209250612000565b8083604051602001611fe7929190613b06565b6040516020818303038152906040528051906020012092505b50808061200c9061334e565b915050611f75565b508091505092915050565b6120398282604051806020016040528060008152506121ca565b5050565b505050565b60006120638473ffffffffffffffffffffffffffffffffffffffff16612225565b156121bd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261208c611694565b8786866040518563ffffffff1660e01b81526004016120ae9493929190613b87565b6020604051808303816000875af19250505080156120ea57506040513d601f19601f820116820180604052508101906120e79190613be8565b60015b61216d573d806000811461211a576040519150601f19603f3d011682016040523d82523d6000602084013e61211f565b606091505b50600081511415612165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215c90613a05565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506121c2565b600190505b949350505050565b6121d48383612238565b6121e16000848484612042565b612220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221790613a05565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229f90613c61565b60405180910390fd5b6122b181611628565b156122f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e890613ccd565b60405180910390fd5b6122fd6000838361203d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461234d9190612f69565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461241290612d52565b90600052602060002090601f016020900481019282612434576000855561247b565b82601f1061244d57805160ff191683800117855561247b565b8280016001018555821561247b579182015b8281111561247a57825182559160200191906001019061245f565b5b509050612488919061248c565b5090565b5b808211156124a557600081600090555060010161248d565b5090565b600082825260208201905092915050565b7f4574686572206e6f742061636365707465640000000000000000000000000000600082015250565b60006124f06012836124a9565b91506124fb826124ba565b602082019050919050565b6000602082019050818103600083015261251f816124e3565b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61256f8161253a565b811461257a57600080fd5b50565b60008135905061258c81612566565b92915050565b6000602082840312156125a8576125a7612530565b5b60006125b68482850161257d565b91505092915050565b60008115159050919050565b6125d4816125bf565b82525050565b60006020820190506125ef60008301846125cb565b92915050565b600081519050919050565b60005b8381101561261e578082015181840152602081019050612603565b8381111561262d576000848401525b50505050565b6000601f19601f8301169050919050565b600061264f826125f5565b61265981856124a9565b9350612669818560208601612600565b61267281612633565b840191505092915050565b600060208201905081810360008301526126978184612644565b905092915050565b6000819050919050565b6126b28161269f565b81146126bd57600080fd5b50565b6000813590506126cf816126a9565b92915050565b6000602082840312156126eb576126ea612530565b5b60006126f9848285016126c0565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061272d82612702565b9050919050565b61273d81612722565b82525050565b60006020820190506127586000830184612734565b92915050565b61276781612722565b811461277257600080fd5b50565b6000813590506127848161275e565b92915050565b600080604083850312156127a1576127a0612530565b5b60006127af85828601612775565b92505060206127c0858286016126c0565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126127ef576127ee6127ca565b5b8235905067ffffffffffffffff81111561280c5761280b6127cf565b5b602083019150836020820283011115612828576128276127d4565b5b9250929050565b6000806000806060858703121561284957612848612530565b5b600085013567ffffffffffffffff81111561286757612866612535565b5b612873878288016127d9565b94509450506020612886878288016126c0565b9250506040612897878288016126c0565b91505092959194509250565b6128ac8161269f565b82525050565b60006020820190506128c760008301846128a3565b92915050565b6000602082840312156128e3576128e2612530565b5b60006128f184828501612775565b91505092915050565b60008060006060848603121561291357612912612530565b5b600061292186828701612775565b935050602061293286828701612775565b9250506040612943868287016126c0565b9150509250925092565b6000819050919050565b6129608161294d565b82525050565b600060208201905061297b6000830184612957565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6129be82612633565b810181811067ffffffffffffffff821117156129dd576129dc612986565b5b80604052505050565b60006129f0612526565b90506129fc82826129b5565b919050565b600067ffffffffffffffff821115612a1c57612a1b612986565b5b612a2582612633565b9050602081019050919050565b82818337600083830152505050565b6000612a54612a4f84612a01565b6129e6565b905082815260208101848484011115612a7057612a6f612981565b5b612a7b848285612a32565b509392505050565b600082601f830112612a9857612a976127ca565b5b8135612aa8848260208601612a41565b91505092915050565b600060208284031215612ac757612ac6612530565b5b600082013567ffffffffffffffff811115612ae557612ae4612535565b5b612af184828501612a83565b91505092915050565b612b038161294d565b8114612b0e57600080fd5b50565b600081359050612b2081612afa565b92915050565b600060208284031215612b3c57612b3b612530565b5b6000612b4a84828501612b11565b91505092915050565b612b5c816125bf565b8114612b6757600080fd5b50565b600081359050612b7981612b53565b92915050565b60008060408385031215612b9657612b95612530565b5b6000612ba485828601612775565b9250506020612bb585828601612b6a565b9150509250929050565b600067ffffffffffffffff821115612bda57612bd9612986565b5b612be382612633565b9050602081019050919050565b6000612c03612bfe84612bbf565b6129e6565b905082815260208101848484011115612c1f57612c1e612981565b5b612c2a848285612a32565b509392505050565b600082601f830112612c4757612c466127ca565b5b8135612c57848260208601612bf0565b91505092915050565b60008060008060808587031215612c7a57612c79612530565b5b6000612c8887828801612775565b9450506020612c9987828801612775565b9350506040612caa878288016126c0565b925050606085013567ffffffffffffffff811115612ccb57612cca612535565b5b612cd787828801612c32565b91505092959194509250565b60008060408385031215612cfa57612cf9612530565b5b6000612d0885828601612775565b9250506020612d1985828601612775565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612d6a57607f821691505b60208210811415612d7e57612d7d612d23565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612de0602c836124a9565b9150612deb82612d84565b604082019050919050565b60006020820190508181036000830152612e0f81612dd3565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612e726021836124a9565b9150612e7d82612e16565b604082019050919050565b60006020820190508181036000830152612ea181612e65565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612f046038836124a9565b9150612f0f82612ea8565b604082019050919050565b60006020820190508181036000830152612f3381612ef7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612f748261269f565b9150612f7f8361269f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612fb457612fb3612f3a565b5b828201905092915050565b7f5472616e73616374696f6e2077696c6c20657863656564206d6178696d756d2060008201527f737570706c790000000000000000000000000000000000000000000000000000602082015250565b600061301b6026836124a9565b915061302682612fbf565b604082019050919050565b6000602082019050818103600083015261304a8161300e565b9050919050565b7f4e6f206164647265737320697320656c696769626c6520666f72206d696e746960008201527f6e67207965740000000000000000000000000000000000000000000000000000602082015250565b60006130ad6026836124a9565b91506130b882613051565b604082019050919050565b600060208201905081810360008301526130dc816130a0565b9050919050565b7f5373616c65206973206e6f74206c697665207965740000000000000000000000600082015250565b60006131196015836124a9565b9150613124826130e3565b602082019050919050565b600060208201905081810360008301526131488161310c565b9050919050565b60008160601b9050919050565b60006131678261314f565b9050919050565b60006131798261315c565b9050919050565b61319161318c82612722565b61316e565b82525050565b6000819050919050565b6131b26131ad8261269f565b613197565b82525050565b60006131c48285613180565b6014820191506131d482846131a1565b6020820191508190509392505050565b7f41646472657373206973206e6f7420656c696769626c6520666f72206d696e74600082015250565b600061321a6020836124a9565b9150613225826131e4565b602082019050919050565b600060208201905081810360008301526132498161320d565b9050919050565b7f496e76616c6964206d696e7420636f756e740000000000000000000000000000600082015250565b60006132866012836124a9565b915061329182613250565b602082019050919050565b600060208201905081810360008301526132b581613279565b9050919050565b7f5472616e73616374696f6e2077696c6c20657863656564206d6178696d756d2060008201527f4e46547320616c6c6f77656420746f206d696e74000000000000000000000000602082015250565b60006133186034836124a9565b9150613323826132bc565b604082019050919050565b600060208201905081810360008301526133478161330b565b9050919050565b60006133598261269f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561338c5761338b612f3a565b5b600182019050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006133f36031836124a9565b91506133fe82613397565b604082019050919050565b60006020820190508181036000830152613422816133e6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061345f6020836124a9565b915061346a82613429565b602082019050919050565b6000602082019050818103600083015261348e81613452565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006134f16029836124a9565b91506134fc82613495565b604082019050919050565b60006020820190508181036000830152613520816134e4565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613583602a836124a9565b915061358e82613527565b604082019050919050565b600060208201905081810360008301526135b281613576565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613615602f836124a9565b9150613620826135b9565b604082019050919050565b6000602082019050818103600083015261364481613608565b9050919050565b600081905092915050565b6000613661826125f5565b61366b818561364b565b935061367b818560208601612600565b80840191505092915050565b60006136938285613656565b915061369f8284613656565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006137076026836124a9565b9150613712826136ab565b604082019050919050565b60006020820190508181036000830152613736816136fa565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613799602c836124a9565b91506137a48261373d565b604082019050919050565b600060208201905081810360008301526137c88161378c565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061382b6029836124a9565b9150613836826137cf565b604082019050919050565b6000602082019050818103600083015261385a8161381e565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006138bd6024836124a9565b91506138c882613861565b604082019050919050565b600060208201905081810360008301526138ec816138b0565b9050919050565b60006138fe8261269f565b91506139098361269f565b92508282101561391c5761391b612f3a565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061395d6019836124a9565b915061396882613927565b602082019050919050565b6000602082019050818103600083015261398c81613950565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006139ef6032836124a9565b91506139fa82613993565b604082019050919050565b60006020820190508181036000830152613a1e816139e2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613a5f8261269f565b9150613a6a8361269f565b925082613a7a57613a79613a25565b5b828204905092915050565b6000613a908261269f565b9150613a9b8361269f565b925082613aab57613aaa613a25565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b613b00613afb8261294d565b613ae5565b82525050565b6000613b128285613aef565b602082019150613b228284613aef565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000613b5982613b32565b613b638185613b3d565b9350613b73818560208601612600565b613b7c81612633565b840191505092915050565b6000608082019050613b9c6000830187612734565b613ba96020830186612734565b613bb660408301856128a3565b8181036060830152613bc88184613b4e565b905095945050505050565b600081519050613be281612566565b92915050565b600060208284031215613bfe57613bfd612530565b5b6000613c0c84828501613bd3565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613c4b6020836124a9565b9150613c5682613c15565b602082019050919050565b60006020820190508181036000830152613c7a81613c3e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613cb7601c836124a9565b9150613cc282613c81565b602082019050919050565b60006020820190508181036000830152613ce681613caa565b905091905056fea2646970667358221220859eabbd1aed9636652f369bb71de0d13dcd561ba3c6aa97584263bbdbef394c64736f6c634300080b0033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string):

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

42993:3667:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43605:28;;;;;;;;;;:::i;:::-;;;;;;;;42993:3667;;;;29537:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30706:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32399:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31922:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44887:1103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44387:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43352:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33318:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43267:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43742:83;;;;;;;;;;;;;:::i;:::-;;33765:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44217:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30313:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43221:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29956:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9849:103;;;;;;;;;;;;;:::i;:::-;;43961:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9198:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30875:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43115:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32779:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34021:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46173:356;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31050:468;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33037:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10107:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29537:355;29684:4;29741:25;29726:40;;;:11;:40;;;;:105;;;;29798:33;29783:48;;;:11;:48;;;;29726:105;:158;;;;29848:36;29872:11;29848:23;:36::i;:::-;29726:158;29706:178;;29537:355;;;:::o;30706:100::-;30760:13;30793:5;30786:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30706:100;:::o;32399:308::-;32520:7;32567:16;32575:7;32567;:16::i;:::-;32545:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;32675:15;:24;32691:7;32675:24;;;;;;;;;;;;;;;;;;;;;32668:31;;32399:308;;;:::o;31922:411::-;32003:13;32019:23;32034:7;32019:14;:23::i;:::-;32003:39;;32067:5;32061:11;;:2;:11;;;;32053:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32161:5;32145:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;32170:37;32187:5;32194:12;:10;:12::i;:::-;32170:16;:37::i;:::-;32145:62;32123:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;32304:21;32313:2;32317:7;32304:8;:21::i;:::-;31992:341;31922:411;;:::o;44887:1103::-;43255:3;45059:6;45043:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:33;;45021:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;45175:1;45161:15;;:10;;:15;;45153:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;45238:8;;;;;;;;;;;45230:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;45305:160;45342:6;;45305:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45367:10;;45423;45435:13;45406:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45396:54;;;;;;45305:18;:160::i;:::-;45283:242;;;;;;;;;;;;:::i;:::-;;;;;;;;;45555:1;45546:6;:10;:37;;;;;45570:13;45560:6;:23;;45546:37;45538:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45687:6;45656:16;:28;45673:10;45656:28;;;;;;;;;;;;;;;;:37;;;;:::i;:::-;45639:13;:54;;45617:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;45786:14;45803:13;:11;:13::i;:::-;45786:30;;45840:6;45827:9;;:19;;;;;;;:::i;:::-;;;;;;;;45889:6;45857:16;:28;45874:10;45857:28;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;45913:9;45908:75;45928:6;45924:1;:10;45908:75;;;45956:15;45962:8;;;;:::i;:::-;;;;45956:5;:15::i;:::-;45936:3;;;;;:::i;:::-;;;;45908:75;;;;45010:980;44887:1103;;;;:::o;44387:88::-;44431:7;44458:9;;44451:16;;44387:88;:::o;43352:51::-;;;;;;;;;;;;;;;;;:::o;33318:376::-;33527:41;33546:12;:10;:12::i;:::-;33560:7;33527:18;:41::i;:::-;33505:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;33658:28;33668:4;33674:2;33678:7;33658:9;:28::i;:::-;33318:376;;;:::o;43267:25::-;;;;:::o;43742:83::-;9429:12;:10;:12::i;:::-;9418:23;;:7;:5;:7::i;:::-;:23;;;9410:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43809:8:::1;;;;;;;;;;;43808:9;43797:8;;:20;;;;;;;;;;;;;;;;;;43742:83::o:0;33765:185::-;33903:39;33920:4;33926:2;33930:7;33903:39;;;;;;;;;;;;:16;:39::i;:::-;33765:185;;;:::o;44217:101::-;9429:12;:10;:12::i;:::-;9418:23;;:7;:5;:7::i;:::-;:23;;;9410:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44303:7:::1;44288:12;:22;;;;;;;;;;;;:::i;:::-;;44217:101:::0;:::o;30313:326::-;30430:7;30455:13;30471:7;:16;30479:7;30471:16;;;;;;;;;;;;;;;;;;;;;30455:32;;30537:1;30520:19;;:5;:19;;;;30498:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;30626:5;30619:12;;;30313:326;;;:::o;43221:37::-;43255:3;43221:37;:::o;29956:295::-;30073:7;30137:1;30120:19;;:5;:19;;;;30098:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30227:9;:16;30237:5;30227:16;;;;;;;;;;;;;;;;30220:23;;29956:295;;;:::o;9849:103::-;9429:12;:10;:12::i;:::-;9418:23;;:7;:5;:7::i;:::-;:23;;;9410:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9914:30:::1;9941:1;9914:18;:30::i;:::-;9849:103::o:0;43961:106::-;9429:12;:10;:12::i;:::-;9418:23;;:7;:5;:7::i;:::-;:23;;;9410:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44048:11:::1;44035:10;:24;;;;43961:106:::0;:::o;9198:87::-;9244:7;9271:6;;;;;;;;;;;9264:13;;9198:87;:::o;30875:104::-;30931:13;30964:7;30957:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30875:104;:::o;43115:20::-;;;;;;;;;;;;;:::o;32779:187::-;32906:52;32925:12;:10;:12::i;:::-;32939:8;32949;32906:18;:52::i;:::-;32779:187;;:::o;34021:365::-;34210:41;34229:12;:10;:12::i;:::-;34243:7;34210:18;:41::i;:::-;34188:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;34339:39;34353:4;34359:2;34363:7;34372:5;34339:13;:39::i;:::-;34021:365;;;;:::o;46173:356::-;9429:12;:10;:12::i;:::-;9418:23;;:7;:5;:7::i;:::-;:23;;;9410:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43255:3:::1;46278:6;46262:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:33;;46240:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;46374:14;46391:13;:11;:13::i;:::-;46374:30;;46428:6;46415:9;;:19;;;;;;;:::i;:::-;;;;;;;;46452:9;46447:75;46467:6;46463:1;:10;46447:75;;;46495:15;46501:8;;;;:::i;:::-;;;;46495:5;:15::i;:::-;46475:3;;;;;:::i;:::-;;;;46447:75;;;;46229:300;46173:356:::0;:::o;31050:468::-;31168:13;31221:16;31229:7;31221;:16::i;:::-;31199:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;31325:21;31349:10;:8;:10::i;:::-;31325:34;;31414:1;31396:7;31390:21;:25;:120;;;;;;;;;;;;;;;;;31459:7;31468:18;:7;:16;:18::i;:::-;31442:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31390:120;31370:140;;;31050:468;;;:::o;33037:214::-;33179:4;33208:18;:25;33227:5;33208:25;;;;;;;;;;;;;;;:35;33234:8;33208:35;;;;;;;;;;;;;;;;;;;;;;;;;33201:42;;33037:214;;;;:::o;10107:238::-;9429:12;:10;:12::i;:::-;9418:23;;:7;:5;:7::i;:::-;:23;;;9410:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10230:1:::1;10210:22;;:8;:22;;;;10188:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;10309:28;10328:8;10309:18;:28::i;:::-;10107:238:::0;:::o;22124:207::-;22254:4;22298:25;22283:40;;;:11;:40;;;;22276:47;;22124:207;;;:::o;35933:127::-;35998:4;36050:1;36022:30;;:7;:16;36030:7;36022:16;;;;;;;;;;;;;;;;;;;;;:30;;;;36015:37;;35933:127;;;:::o;7901:98::-;7954:7;7981:10;7974:17;;7901:98;:::o;40056:174::-;40158:2;40131:15;:24;40147:7;40131:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40214:7;40210:2;40176:46;;40185:23;40200:7;40185:14;:23::i;:::-;40176:46;;;;;;;;;;;;40056:174;;:::o;3698:190::-;3823:4;3876;3847:25;3860:5;3867:4;3847:12;:25::i;:::-;:33;3840:40;;3698:190;;;;;:::o;46537:120::-;46588:30;46598:10;46610:7;46588:9;:30::i;:::-;46634:15;46641:7;46634:15;;;;;;:::i;:::-;;;;;;;;46537:120;:::o;36227:452::-;36356:4;36400:16;36408:7;36400;:16::i;:::-;36378:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;36499:13;36515:23;36530:7;36515:14;:23::i;:::-;36499:39;;36568:5;36557:16;;:7;:16;;;:64;;;;36614:7;36590:31;;:20;36602:7;36590:11;:20::i;:::-;:31;;;36557:64;:113;;;;36638:32;36655:5;36662:7;36638:16;:32::i;:::-;36557:113;36549:122;;;36227:452;;;;:::o;39323:615::-;39496:4;39469:31;;:23;39484:7;39469:14;:23::i;:::-;:31;;;39447:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;39602:1;39588:16;;:2;:16;;;;39580:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39658:39;39679:4;39685:2;39689:7;39658:20;:39::i;:::-;39762:29;39779:1;39783:7;39762:8;:29::i;:::-;39823:1;39804:9;:15;39814:4;39804:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39852:1;39835:9;:13;39845:2;39835:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39883:2;39864:7;:16;39872:7;39864:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39922:7;39918:2;39903:27;;39912:4;39903:27;;;;;;;;;;;;39323:615;;;:::o;10505:191::-;10579:16;10598:6;;;;;;;;;;;10579:25;;10624:8;10615:6;;:17;;;;;;;;;;;;;;;;;;10679:8;10648:40;;10669:8;10648:40;;;;;;;;;;;;10568:128;10505:191;:::o;40372:315::-;40527:8;40518:17;;:5;:17;;;;40510:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;40614:8;40576:18;:25;40595:5;40576:25;;;;;;;;;;;;;;;:35;40602:8;40576:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;40660:8;40638:41;;40653:5;40638:41;;;40670:8;40638:41;;;;;;:::i;:::-;;;;;;;;40372:315;;;:::o;35268:352::-;35425:28;35435:4;35441:2;35445:7;35425:9;:28::i;:::-;35486:48;35509:4;35515:2;35519:7;35528:5;35486:22;:48::i;:::-;35464:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;35268:352;;;;:::o;44483:113::-;44543:13;44576:12;44569:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44483:113;:::o;5433:723::-;5489:13;5719:1;5710:5;:10;5706:53;;;5737:10;;;;;;;;;;;;;;;;;;;;;5706:53;5769:12;5784:5;5769:20;;5800:14;5825:78;5840:1;5832:4;:9;5825:78;;5858:8;;;;;:::i;:::-;;;;5889:2;5881:10;;;;;:::i;:::-;;;5825:78;;;5913:19;5945:6;5935:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5913:39;;5963:154;5979:1;5970:5;:10;5963:154;;6007:1;5997:11;;;;;:::i;:::-;;;6074:2;6066:5;:10;;;;:::i;:::-;6053:2;:24;;;;:::i;:::-;6040:39;;6023:6;6030;6023:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;6103:2;6094:11;;;;;:::i;:::-;;;5963:154;;;6141:6;6127:21;;;;;5433:723;;;;:::o;4250:813::-;4360:7;4385:20;4408:4;4385:27;;4428:9;4423:603;4447:5;:12;4443:1;:16;4423:603;;;4481:20;4504:5;4510:1;4504:8;;;;;;;;:::i;:::-;;;;;;;;4481:31;;4547:12;4531;:28;4527:488;;4723:12;4737;4706:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4674:95;;;;;;4659:110;;4527:488;;;4953:12;4967;4936:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4904:95;;;;;;4889:110;;4527:488;4466:560;4461:3;;;;;:::i;:::-;;;;4423:603;;;;5043:12;5036:19;;;4250:813;;;;:::o;37021:110::-;37097:26;37107:2;37111:7;37097:26;;;;;;;;;;;;:9;:26::i;:::-;37021:110;;:::o;42804:126::-;;;;:::o;41252:980::-;41407:4;41428:15;:2;:13;;;:15::i;:::-;41424:801;;;41497:2;41481:36;;;41540:12;:10;:12::i;:::-;41575:4;41602:7;41632:5;41481:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41460:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41856:1;41839:6;:13;:18;41835:320;;;41882:108;;;;;;;;;;:::i;:::-;;;;;;;;41835:320;42105:6;42099:13;42090:6;42086:2;42082:15;42075:38;41460:710;41730:41;;;41720:51;;;:6;:51;;;;41713:58;;;;;41424:801;42209:4;42202:11;;41252:980;;;;;;;:::o;37358:321::-;37488:18;37494:2;37498:7;37488:5;:18::i;:::-;37539:54;37570:1;37574:2;37578:7;37587:5;37539:22;:54::i;:::-;37517:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;37358:321;;;:::o;11521:387::-;11581:4;11789:12;11856:7;11844:20;11836:28;;11899:1;11892:4;:8;11885:15;;;11521:387;;;:::o;38015:382::-;38109:1;38095:16;;:2;:16;;;;38087:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;38168:16;38176:7;38168;:16::i;:::-;38167:17;38159:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;38230:45;38259:1;38263:2;38267:7;38230:20;:45::i;:::-;38305:1;38288:9;:13;38298:2;38288:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38336:2;38317:7;:16;38325:7;38317:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38381:7;38377:2;38356:33;;38373:1;38356:33;;;;;;;;;;;;38015:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:169:1:-;91:11;125:6;120:3;113:19;165:4;160:3;156:14;141:29;;7:169;;;;:::o;182:168::-;322:20;318:1;310:6;306:14;299:44;182:168;:::o;356:366::-;498:3;519:67;583:2;578:3;519:67;:::i;:::-;512:74;;595:93;684:3;595:93;:::i;:::-;713:2;708:3;704:12;697:19;;356:366;;;:::o;728:419::-;894:4;932:2;921:9;917:18;909:26;;981:9;975:4;971:20;967:1;956:9;952:17;945:47;1009:131;1135:4;1009:131;:::i;:::-;1001:139;;728:419;;;:::o;1153:75::-;1186:6;1219:2;1213:9;1203:19;;1153:75;:::o;1234:117::-;1343:1;1340;1333:12;1357:117;1466:1;1463;1456:12;1480:149;1516:7;1556:66;1549:5;1545:78;1534:89;;1480:149;;;:::o;1635:120::-;1707:23;1724:5;1707:23;:::i;:::-;1700:5;1697:34;1687:62;;1745:1;1742;1735:12;1687:62;1635:120;:::o;1761:137::-;1806:5;1844:6;1831:20;1822:29;;1860:32;1886:5;1860:32;:::i;:::-;1761:137;;;;:::o;1904:327::-;1962:6;2011:2;1999:9;1990:7;1986:23;1982:32;1979:119;;;2017:79;;:::i;:::-;1979:119;2137:1;2162:52;2206:7;2197:6;2186:9;2182:22;2162:52;:::i;:::-;2152:62;;2108:116;1904:327;;;;:::o;2237:90::-;2271:7;2314:5;2307:13;2300:21;2289:32;;2237:90;;;:::o;2333:109::-;2414:21;2429:5;2414:21;:::i;:::-;2409:3;2402:34;2333:109;;:::o;2448:210::-;2535:4;2573:2;2562:9;2558:18;2550:26;;2586:65;2648:1;2637:9;2633:17;2624:6;2586:65;:::i;:::-;2448:210;;;;:::o;2664:99::-;2716:6;2750:5;2744:12;2734:22;;2664:99;;;:::o;2769:307::-;2837:1;2847:113;2861:6;2858:1;2855:13;2847:113;;;2946:1;2941:3;2937:11;2931:18;2927:1;2922:3;2918:11;2911:39;2883:2;2880:1;2876:10;2871:15;;2847:113;;;2978:6;2975:1;2972:13;2969:101;;;3058:1;3049:6;3044:3;3040:16;3033:27;2969:101;2818:258;2769:307;;;:::o;3082:102::-;3123:6;3174:2;3170:7;3165:2;3158:5;3154:14;3150:28;3140:38;;3082:102;;;:::o;3190:364::-;3278:3;3306:39;3339:5;3306:39;:::i;:::-;3361:71;3425:6;3420:3;3361:71;:::i;:::-;3354:78;;3441:52;3486:6;3481:3;3474:4;3467:5;3463:16;3441:52;:::i;:::-;3518:29;3540:6;3518:29;:::i;:::-;3513:3;3509:39;3502:46;;3282:272;3190:364;;;;:::o;3560:313::-;3673:4;3711:2;3700:9;3696:18;3688:26;;3760:9;3754:4;3750:20;3746:1;3735:9;3731:17;3724:47;3788:78;3861:4;3852:6;3788:78;:::i;:::-;3780:86;;3560:313;;;;:::o;3879:77::-;3916:7;3945:5;3934:16;;3879:77;;;:::o;3962:122::-;4035:24;4053:5;4035:24;:::i;:::-;4028:5;4025:35;4015:63;;4074:1;4071;4064:12;4015:63;3962:122;:::o;4090:139::-;4136:5;4174:6;4161:20;4152:29;;4190:33;4217:5;4190:33;:::i;:::-;4090:139;;;;:::o;4235:329::-;4294:6;4343:2;4331:9;4322:7;4318:23;4314:32;4311:119;;;4349:79;;:::i;:::-;4311:119;4469:1;4494:53;4539:7;4530:6;4519:9;4515:22;4494:53;:::i;:::-;4484:63;;4440:117;4235:329;;;;:::o;4570:126::-;4607:7;4647:42;4640:5;4636:54;4625:65;;4570:126;;;:::o;4702:96::-;4739:7;4768:24;4786:5;4768:24;:::i;:::-;4757:35;;4702:96;;;:::o;4804:118::-;4891:24;4909:5;4891:24;:::i;:::-;4886:3;4879:37;4804:118;;:::o;4928:222::-;5021:4;5059:2;5048:9;5044:18;5036:26;;5072:71;5140:1;5129:9;5125:17;5116:6;5072:71;:::i;:::-;4928:222;;;;:::o;5156:122::-;5229:24;5247:5;5229:24;:::i;:::-;5222:5;5219:35;5209:63;;5268:1;5265;5258:12;5209:63;5156:122;:::o;5284:139::-;5330:5;5368:6;5355:20;5346:29;;5384:33;5411:5;5384:33;:::i;:::-;5284:139;;;;:::o;5429:474::-;5497:6;5505;5554:2;5542:9;5533:7;5529:23;5525:32;5522:119;;;5560:79;;:::i;:::-;5522:119;5680:1;5705:53;5750:7;5741:6;5730:9;5726:22;5705:53;:::i;:::-;5695:63;;5651:117;5807:2;5833:53;5878:7;5869:6;5858:9;5854:22;5833:53;:::i;:::-;5823:63;;5778:118;5429:474;;;;;:::o;5909:117::-;6018:1;6015;6008:12;6032:117;6141:1;6138;6131:12;6155:117;6264:1;6261;6254:12;6295:568;6368:8;6378:6;6428:3;6421:4;6413:6;6409:17;6405:27;6395:122;;6436:79;;:::i;:::-;6395:122;6549:6;6536:20;6526:30;;6579:18;6571:6;6568:30;6565:117;;;6601:79;;:::i;:::-;6565:117;6715:4;6707:6;6703:17;6691:29;;6769:3;6761:4;6753:6;6749:17;6739:8;6735:32;6732:41;6729:128;;;6776:79;;:::i;:::-;6729:128;6295:568;;;;;:::o;6869:849::-;6973:6;6981;6989;6997;7046:2;7034:9;7025:7;7021:23;7017:32;7014:119;;;7052:79;;:::i;:::-;7014:119;7200:1;7189:9;7185:17;7172:31;7230:18;7222:6;7219:30;7216:117;;;7252:79;;:::i;:::-;7216:117;7365:80;7437:7;7428:6;7417:9;7413:22;7365:80;:::i;:::-;7347:98;;;;7143:312;7494:2;7520:53;7565:7;7556:6;7545:9;7541:22;7520:53;:::i;:::-;7510:63;;7465:118;7622:2;7648:53;7693:7;7684:6;7673:9;7669:22;7648:53;:::i;:::-;7638:63;;7593:118;6869:849;;;;;;;:::o;7724:118::-;7811:24;7829:5;7811:24;:::i;:::-;7806:3;7799:37;7724:118;;:::o;7848:222::-;7941:4;7979:2;7968:9;7964:18;7956:26;;7992:71;8060:1;8049:9;8045:17;8036:6;7992:71;:::i;:::-;7848:222;;;;:::o;8076:329::-;8135:6;8184:2;8172:9;8163:7;8159:23;8155:32;8152:119;;;8190:79;;:::i;:::-;8152:119;8310:1;8335:53;8380:7;8371:6;8360:9;8356:22;8335:53;:::i;:::-;8325:63;;8281:117;8076:329;;;;:::o;8411:619::-;8488:6;8496;8504;8553:2;8541:9;8532:7;8528:23;8524:32;8521:119;;;8559:79;;:::i;:::-;8521:119;8679:1;8704:53;8749:7;8740:6;8729:9;8725:22;8704:53;:::i;:::-;8694:63;;8650:117;8806:2;8832:53;8877:7;8868:6;8857:9;8853:22;8832:53;:::i;:::-;8822:63;;8777:118;8934:2;8960:53;9005:7;8996:6;8985:9;8981:22;8960:53;:::i;:::-;8950:63;;8905:118;8411:619;;;;;:::o;9036:77::-;9073:7;9102:5;9091:16;;9036:77;;;:::o;9119:118::-;9206:24;9224:5;9206:24;:::i;:::-;9201:3;9194:37;9119:118;;:::o;9243:222::-;9336:4;9374:2;9363:9;9359:18;9351:26;;9387:71;9455:1;9444:9;9440:17;9431:6;9387:71;:::i;:::-;9243:222;;;;:::o;9471:117::-;9580:1;9577;9570:12;9594:180;9642:77;9639:1;9632:88;9739:4;9736:1;9729:15;9763:4;9760:1;9753:15;9780:281;9863:27;9885:4;9863:27;:::i;:::-;9855:6;9851:40;9993:6;9981:10;9978:22;9957:18;9945:10;9942:34;9939:62;9936:88;;;10004:18;;:::i;:::-;9936:88;10044:10;10040:2;10033:22;9823:238;9780:281;;:::o;10067:129::-;10101:6;10128:20;;:::i;:::-;10118:30;;10157:33;10185:4;10177:6;10157:33;:::i;:::-;10067:129;;;:::o;10202:308::-;10264:4;10354:18;10346:6;10343:30;10340:56;;;10376:18;;:::i;:::-;10340:56;10414:29;10436:6;10414:29;:::i;:::-;10406:37;;10498:4;10492;10488:15;10480:23;;10202:308;;;:::o;10516:154::-;10600:6;10595:3;10590;10577:30;10662:1;10653:6;10648:3;10644:16;10637:27;10516:154;;;:::o;10676:412::-;10754:5;10779:66;10795:49;10837:6;10795:49;:::i;:::-;10779:66;:::i;:::-;10770:75;;10868:6;10861:5;10854:21;10906:4;10899:5;10895:16;10944:3;10935:6;10930:3;10926:16;10923:25;10920:112;;;10951:79;;:::i;:::-;10920:112;11041:41;11075:6;11070:3;11065;11041:41;:::i;:::-;10760:328;10676:412;;;;;:::o;11108:340::-;11164:5;11213:3;11206:4;11198:6;11194:17;11190:27;11180:122;;11221:79;;:::i;:::-;11180:122;11338:6;11325:20;11363:79;11438:3;11430:6;11423:4;11415:6;11411:17;11363:79;:::i;:::-;11354:88;;11170:278;11108:340;;;;:::o;11454:509::-;11523:6;11572:2;11560:9;11551:7;11547:23;11543:32;11540:119;;;11578:79;;:::i;:::-;11540:119;11726:1;11715:9;11711:17;11698:31;11756:18;11748:6;11745:30;11742:117;;;11778:79;;:::i;:::-;11742:117;11883:63;11938:7;11929:6;11918:9;11914:22;11883:63;:::i;:::-;11873:73;;11669:287;11454:509;;;;:::o;11969:122::-;12042:24;12060:5;12042:24;:::i;:::-;12035:5;12032:35;12022:63;;12081:1;12078;12071:12;12022:63;11969:122;:::o;12097:139::-;12143:5;12181:6;12168:20;12159:29;;12197:33;12224:5;12197:33;:::i;:::-;12097:139;;;;:::o;12242:329::-;12301:6;12350:2;12338:9;12329:7;12325:23;12321:32;12318:119;;;12356:79;;:::i;:::-;12318:119;12476:1;12501:53;12546:7;12537:6;12526:9;12522:22;12501:53;:::i;:::-;12491:63;;12447:117;12242:329;;;;:::o;12577:116::-;12647:21;12662:5;12647:21;:::i;:::-;12640:5;12637:32;12627:60;;12683:1;12680;12673:12;12627:60;12577:116;:::o;12699:133::-;12742:5;12780:6;12767:20;12758:29;;12796:30;12820:5;12796:30;:::i;:::-;12699:133;;;;:::o;12838:468::-;12903:6;12911;12960:2;12948:9;12939:7;12935:23;12931:32;12928:119;;;12966:79;;:::i;:::-;12928:119;13086:1;13111:53;13156:7;13147:6;13136:9;13132:22;13111:53;:::i;:::-;13101:63;;13057:117;13213:2;13239:50;13281:7;13272:6;13261:9;13257:22;13239:50;:::i;:::-;13229:60;;13184:115;12838:468;;;;;:::o;13312:307::-;13373:4;13463:18;13455:6;13452:30;13449:56;;;13485:18;;:::i;:::-;13449:56;13523:29;13545:6;13523:29;:::i;:::-;13515:37;;13607:4;13601;13597:15;13589:23;;13312:307;;;:::o;13625:410::-;13702:5;13727:65;13743:48;13784:6;13743:48;:::i;:::-;13727:65;:::i;:::-;13718:74;;13815:6;13808:5;13801:21;13853:4;13846:5;13842:16;13891:3;13882:6;13877:3;13873:16;13870:25;13867:112;;;13898:79;;:::i;:::-;13867:112;13988:41;14022:6;14017:3;14012;13988:41;:::i;:::-;13708:327;13625:410;;;;;:::o;14054:338::-;14109:5;14158:3;14151:4;14143:6;14139:17;14135:27;14125:122;;14166:79;;:::i;:::-;14125:122;14283:6;14270:20;14308:78;14382:3;14374:6;14367:4;14359:6;14355:17;14308:78;:::i;:::-;14299:87;;14115:277;14054:338;;;;:::o;14398:943::-;14493:6;14501;14509;14517;14566:3;14554:9;14545:7;14541:23;14537:33;14534:120;;;14573:79;;:::i;:::-;14534:120;14693:1;14718:53;14763:7;14754:6;14743:9;14739:22;14718:53;:::i;:::-;14708:63;;14664:117;14820:2;14846:53;14891:7;14882:6;14871:9;14867:22;14846:53;:::i;:::-;14836:63;;14791:118;14948:2;14974:53;15019:7;15010:6;14999:9;14995:22;14974:53;:::i;:::-;14964:63;;14919:118;15104:2;15093:9;15089:18;15076:32;15135:18;15127:6;15124:30;15121:117;;;15157:79;;:::i;:::-;15121:117;15262:62;15316:7;15307:6;15296:9;15292:22;15262:62;:::i;:::-;15252:72;;15047:287;14398:943;;;;;;;:::o;15347:474::-;15415:6;15423;15472:2;15460:9;15451:7;15447:23;15443:32;15440:119;;;15478:79;;:::i;:::-;15440:119;15598:1;15623:53;15668:7;15659:6;15648:9;15644:22;15623:53;:::i;:::-;15613:63;;15569:117;15725:2;15751:53;15796:7;15787:6;15776:9;15772:22;15751:53;:::i;:::-;15741:63;;15696:118;15347:474;;;;;:::o;15827:180::-;15875:77;15872:1;15865:88;15972:4;15969:1;15962:15;15996:4;15993:1;15986:15;16013:320;16057:6;16094:1;16088:4;16084:12;16074:22;;16141:1;16135:4;16131:12;16162:18;16152:81;;16218:4;16210:6;16206:17;16196:27;;16152:81;16280:2;16272:6;16269:14;16249:18;16246:38;16243:84;;;16299:18;;:::i;:::-;16243:84;16064:269;16013:320;;;:::o;16339:231::-;16479:34;16475:1;16467:6;16463:14;16456:58;16548:14;16543:2;16535:6;16531:15;16524:39;16339:231;:::o;16576:366::-;16718:3;16739:67;16803:2;16798:3;16739:67;:::i;:::-;16732:74;;16815:93;16904:3;16815:93;:::i;:::-;16933:2;16928:3;16924:12;16917:19;;16576:366;;;:::o;16948:419::-;17114:4;17152:2;17141:9;17137:18;17129:26;;17201:9;17195:4;17191:20;17187:1;17176:9;17172:17;17165:47;17229:131;17355:4;17229:131;:::i;:::-;17221:139;;16948:419;;;:::o;17373:220::-;17513:34;17509:1;17501:6;17497:14;17490:58;17582:3;17577:2;17569:6;17565:15;17558:28;17373:220;:::o;17599:366::-;17741:3;17762:67;17826:2;17821:3;17762:67;:::i;:::-;17755:74;;17838:93;17927:3;17838:93;:::i;:::-;17956:2;17951:3;17947:12;17940:19;;17599:366;;;:::o;17971:419::-;18137:4;18175:2;18164:9;18160:18;18152:26;;18224:9;18218:4;18214:20;18210:1;18199:9;18195:17;18188:47;18252:131;18378:4;18252:131;:::i;:::-;18244:139;;17971:419;;;:::o;18396:243::-;18536:34;18532:1;18524:6;18520:14;18513:58;18605:26;18600:2;18592:6;18588:15;18581:51;18396:243;:::o;18645:366::-;18787:3;18808:67;18872:2;18867:3;18808:67;:::i;:::-;18801:74;;18884:93;18973:3;18884:93;:::i;:::-;19002:2;18997:3;18993:12;18986:19;;18645:366;;;:::o;19017:419::-;19183:4;19221:2;19210:9;19206:18;19198:26;;19270:9;19264:4;19260:20;19256:1;19245:9;19241:17;19234:47;19298:131;19424:4;19298:131;:::i;:::-;19290:139;;19017:419;;;:::o;19442:180::-;19490:77;19487:1;19480:88;19587:4;19584:1;19577:15;19611:4;19608:1;19601:15;19628:305;19668:3;19687:20;19705:1;19687:20;:::i;:::-;19682:25;;19721:20;19739:1;19721:20;:::i;:::-;19716:25;;19875:1;19807:66;19803:74;19800:1;19797:81;19794:107;;;19881:18;;:::i;:::-;19794:107;19925:1;19922;19918:9;19911:16;;19628:305;;;;:::o;19939:225::-;20079:34;20075:1;20067:6;20063:14;20056:58;20148:8;20143:2;20135:6;20131:15;20124:33;19939:225;:::o;20170:366::-;20312:3;20333:67;20397:2;20392:3;20333:67;:::i;:::-;20326:74;;20409:93;20498:3;20409:93;:::i;:::-;20527:2;20522:3;20518:12;20511:19;;20170:366;;;:::o;20542:419::-;20708:4;20746:2;20735:9;20731:18;20723:26;;20795:9;20789:4;20785:20;20781:1;20770:9;20766:17;20759:47;20823:131;20949:4;20823:131;:::i;:::-;20815:139;;20542:419;;;:::o;20967:225::-;21107:34;21103:1;21095:6;21091:14;21084:58;21176:8;21171:2;21163:6;21159:15;21152:33;20967:225;:::o;21198:366::-;21340:3;21361:67;21425:2;21420:3;21361:67;:::i;:::-;21354:74;;21437:93;21526:3;21437:93;:::i;:::-;21555:2;21550:3;21546:12;21539:19;;21198:366;;;:::o;21570:419::-;21736:4;21774:2;21763:9;21759:18;21751:26;;21823:9;21817:4;21813:20;21809:1;21798:9;21794:17;21787:47;21851:131;21977:4;21851:131;:::i;:::-;21843:139;;21570:419;;;:::o;21995:171::-;22135:23;22131:1;22123:6;22119:14;22112:47;21995:171;:::o;22172:366::-;22314:3;22335:67;22399:2;22394:3;22335:67;:::i;:::-;22328:74;;22411:93;22500:3;22411:93;:::i;:::-;22529:2;22524:3;22520:12;22513:19;;22172:366;;;:::o;22544:419::-;22710:4;22748:2;22737:9;22733:18;22725:26;;22797:9;22791:4;22787:20;22783:1;22772:9;22768:17;22761:47;22825:131;22951:4;22825:131;:::i;:::-;22817:139;;22544:419;;;:::o;22969:94::-;23002:8;23050:5;23046:2;23042:14;23021:35;;22969:94;;;:::o;23069:::-;23108:7;23137:20;23151:5;23137:20;:::i;:::-;23126:31;;23069:94;;;:::o;23169:100::-;23208:7;23237:26;23257:5;23237:26;:::i;:::-;23226:37;;23169:100;;;:::o;23275:157::-;23380:45;23400:24;23418:5;23400:24;:::i;:::-;23380:45;:::i;:::-;23375:3;23368:58;23275:157;;:::o;23438:79::-;23477:7;23506:5;23495:16;;23438:79;;;:::o;23523:157::-;23628:45;23648:24;23666:5;23648:24;:::i;:::-;23628:45;:::i;:::-;23623:3;23616:58;23523:157;;:::o;23686:397::-;23826:3;23841:75;23912:3;23903:6;23841:75;:::i;:::-;23941:2;23936:3;23932:12;23925:19;;23954:75;24025:3;24016:6;23954:75;:::i;:::-;24054:2;24049:3;24045:12;24038:19;;24074:3;24067:10;;23686:397;;;;;:::o;24089:182::-;24229:34;24225:1;24217:6;24213:14;24206:58;24089:182;:::o;24277:366::-;24419:3;24440:67;24504:2;24499:3;24440:67;:::i;:::-;24433:74;;24516:93;24605:3;24516:93;:::i;:::-;24634:2;24629:3;24625:12;24618:19;;24277:366;;;:::o;24649:419::-;24815:4;24853:2;24842:9;24838:18;24830:26;;24902:9;24896:4;24892:20;24888:1;24877:9;24873:17;24866:47;24930:131;25056:4;24930:131;:::i;:::-;24922:139;;24649:419;;;:::o;25074:168::-;25214:20;25210:1;25202:6;25198:14;25191:44;25074:168;:::o;25248:366::-;25390:3;25411:67;25475:2;25470:3;25411:67;:::i;:::-;25404:74;;25487:93;25576:3;25487:93;:::i;:::-;25605:2;25600:3;25596:12;25589:19;;25248:366;;;:::o;25620:419::-;25786:4;25824:2;25813:9;25809:18;25801:26;;25873:9;25867:4;25863:20;25859:1;25848:9;25844:17;25837:47;25901:131;26027:4;25901:131;:::i;:::-;25893:139;;25620:419;;;:::o;26045:239::-;26185:34;26181:1;26173:6;26169:14;26162:58;26254:22;26249:2;26241:6;26237:15;26230:47;26045:239;:::o;26290:366::-;26432:3;26453:67;26517:2;26512:3;26453:67;:::i;:::-;26446:74;;26529:93;26618:3;26529:93;:::i;:::-;26647:2;26642:3;26638:12;26631:19;;26290:366;;;:::o;26662:419::-;26828:4;26866:2;26855:9;26851:18;26843:26;;26915:9;26909:4;26905:20;26901:1;26890:9;26886:17;26879:47;26943:131;27069:4;26943:131;:::i;:::-;26935:139;;26662:419;;;:::o;27087:233::-;27126:3;27149:24;27167:5;27149:24;:::i;:::-;27140:33;;27195:66;27188:5;27185:77;27182:103;;;27265:18;;:::i;:::-;27182:103;27312:1;27305:5;27301:13;27294:20;;27087:233;;;:::o;27326:236::-;27466:34;27462:1;27454:6;27450:14;27443:58;27535:19;27530:2;27522:6;27518:15;27511:44;27326:236;:::o;27568:366::-;27710:3;27731:67;27795:2;27790:3;27731:67;:::i;:::-;27724:74;;27807:93;27896:3;27807:93;:::i;:::-;27925:2;27920:3;27916:12;27909:19;;27568:366;;;:::o;27940:419::-;28106:4;28144:2;28133:9;28129:18;28121:26;;28193:9;28187:4;28183:20;28179:1;28168:9;28164:17;28157:47;28221:131;28347:4;28221:131;:::i;:::-;28213:139;;27940:419;;;:::o;28365:182::-;28505:34;28501:1;28493:6;28489:14;28482:58;28365:182;:::o;28553:366::-;28695:3;28716:67;28780:2;28775:3;28716:67;:::i;:::-;28709:74;;28792:93;28881:3;28792:93;:::i;:::-;28910:2;28905:3;28901:12;28894:19;;28553:366;;;:::o;28925:419::-;29091:4;29129:2;29118:9;29114:18;29106:26;;29178:9;29172:4;29168:20;29164:1;29153:9;29149:17;29142:47;29206:131;29332:4;29206:131;:::i;:::-;29198:139;;28925:419;;;:::o;29350:228::-;29490:34;29486:1;29478:6;29474:14;29467:58;29559:11;29554:2;29546:6;29542:15;29535:36;29350:228;:::o;29584:366::-;29726:3;29747:67;29811:2;29806:3;29747:67;:::i;:::-;29740:74;;29823:93;29912:3;29823:93;:::i;:::-;29941:2;29936:3;29932:12;29925:19;;29584:366;;;:::o;29956:419::-;30122:4;30160:2;30149:9;30145:18;30137:26;;30209:9;30203:4;30199:20;30195:1;30184:9;30180:17;30173:47;30237:131;30363:4;30237:131;:::i;:::-;30229:139;;29956:419;;;:::o;30381:229::-;30521:34;30517:1;30509:6;30505:14;30498:58;30590:12;30585:2;30577:6;30573:15;30566:37;30381:229;:::o;30616:366::-;30758:3;30779:67;30843:2;30838:3;30779:67;:::i;:::-;30772:74;;30855:93;30944:3;30855:93;:::i;:::-;30973:2;30968:3;30964:12;30957:19;;30616:366;;;:::o;30988:419::-;31154:4;31192:2;31181:9;31177:18;31169:26;;31241:9;31235:4;31231:20;31227:1;31216:9;31212:17;31205:47;31269:131;31395:4;31269:131;:::i;:::-;31261:139;;30988:419;;;:::o;31413:234::-;31553:34;31549:1;31541:6;31537:14;31530:58;31622:17;31617:2;31609:6;31605:15;31598:42;31413:234;:::o;31653:366::-;31795:3;31816:67;31880:2;31875:3;31816:67;:::i;:::-;31809:74;;31892:93;31981:3;31892:93;:::i;:::-;32010:2;32005:3;32001:12;31994:19;;31653:366;;;:::o;32025:419::-;32191:4;32229:2;32218:9;32214:18;32206:26;;32278:9;32272:4;32268:20;32264:1;32253:9;32249:17;32242:47;32306:131;32432:4;32306:131;:::i;:::-;32298:139;;32025:419;;;:::o;32450:148::-;32552:11;32589:3;32574:18;;32450:148;;;;:::o;32604:377::-;32710:3;32738:39;32771:5;32738:39;:::i;:::-;32793:89;32875:6;32870:3;32793:89;:::i;:::-;32786:96;;32891:52;32936:6;32931:3;32924:4;32917:5;32913:16;32891:52;:::i;:::-;32968:6;32963:3;32959:16;32952:23;;32714:267;32604:377;;;;:::o;32987:435::-;33167:3;33189:95;33280:3;33271:6;33189:95;:::i;:::-;33182:102;;33301:95;33392:3;33383:6;33301:95;:::i;:::-;33294:102;;33413:3;33406:10;;32987:435;;;;;:::o;33428:225::-;33568:34;33564:1;33556:6;33552:14;33545:58;33637:8;33632:2;33624:6;33620:15;33613:33;33428:225;:::o;33659:366::-;33801:3;33822:67;33886:2;33881:3;33822:67;:::i;:::-;33815:74;;33898:93;33987:3;33898:93;:::i;:::-;34016:2;34011:3;34007:12;34000:19;;33659:366;;;:::o;34031:419::-;34197:4;34235:2;34224:9;34220:18;34212:26;;34284:9;34278:4;34274:20;34270:1;34259:9;34255:17;34248:47;34312:131;34438:4;34312:131;:::i;:::-;34304:139;;34031:419;;;:::o;34456:231::-;34596:34;34592:1;34584:6;34580:14;34573:58;34665:14;34660:2;34652:6;34648:15;34641:39;34456:231;:::o;34693:366::-;34835:3;34856:67;34920:2;34915:3;34856:67;:::i;:::-;34849:74;;34932:93;35021:3;34932:93;:::i;:::-;35050:2;35045:3;35041:12;35034:19;;34693:366;;;:::o;35065:419::-;35231:4;35269:2;35258:9;35254:18;35246:26;;35318:9;35312:4;35308:20;35304:1;35293:9;35289:17;35282:47;35346:131;35472:4;35346:131;:::i;:::-;35338:139;;35065:419;;;:::o;35490:228::-;35630:34;35626:1;35618:6;35614:14;35607:58;35699:11;35694:2;35686:6;35682:15;35675:36;35490:228;:::o;35724:366::-;35866:3;35887:67;35951:2;35946:3;35887:67;:::i;:::-;35880:74;;35963:93;36052:3;35963:93;:::i;:::-;36081:2;36076:3;36072:12;36065:19;;35724:366;;;:::o;36096:419::-;36262:4;36300:2;36289:9;36285:18;36277:26;;36349:9;36343:4;36339:20;36335:1;36324:9;36320:17;36313:47;36377:131;36503:4;36377:131;:::i;:::-;36369:139;;36096:419;;;:::o;36521:223::-;36661:34;36657:1;36649:6;36645:14;36638:58;36730:6;36725:2;36717:6;36713:15;36706:31;36521:223;:::o;36750:366::-;36892:3;36913:67;36977:2;36972:3;36913:67;:::i;:::-;36906:74;;36989:93;37078:3;36989:93;:::i;:::-;37107:2;37102:3;37098:12;37091:19;;36750:366;;;:::o;37122:419::-;37288:4;37326:2;37315:9;37311:18;37303:26;;37375:9;37369:4;37365:20;37361:1;37350:9;37346:17;37339:47;37403:131;37529:4;37403:131;:::i;:::-;37395:139;;37122:419;;;:::o;37547:191::-;37587:4;37607:20;37625:1;37607:20;:::i;:::-;37602:25;;37641:20;37659:1;37641:20;:::i;:::-;37636:25;;37680:1;37677;37674:8;37671:34;;;37685:18;;:::i;:::-;37671:34;37730:1;37727;37723:9;37715:17;;37547:191;;;;:::o;37744:175::-;37884:27;37880:1;37872:6;37868:14;37861:51;37744:175;:::o;37925:366::-;38067:3;38088:67;38152:2;38147:3;38088:67;:::i;:::-;38081:74;;38164:93;38253:3;38164:93;:::i;:::-;38282:2;38277:3;38273:12;38266:19;;37925:366;;;:::o;38297:419::-;38463:4;38501:2;38490:9;38486:18;38478:26;;38550:9;38544:4;38540:20;38536:1;38525:9;38521:17;38514:47;38578:131;38704:4;38578:131;:::i;:::-;38570:139;;38297:419;;;:::o;38722:237::-;38862:34;38858:1;38850:6;38846:14;38839:58;38931:20;38926:2;38918:6;38914:15;38907:45;38722:237;:::o;38965:366::-;39107:3;39128:67;39192:2;39187:3;39128:67;:::i;:::-;39121:74;;39204:93;39293:3;39204:93;:::i;:::-;39322:2;39317:3;39313:12;39306:19;;38965:366;;;:::o;39337:419::-;39503:4;39541:2;39530:9;39526:18;39518:26;;39590:9;39584:4;39580:20;39576:1;39565:9;39561:17;39554:47;39618:131;39744:4;39618:131;:::i;:::-;39610:139;;39337:419;;;:::o;39762:180::-;39810:77;39807:1;39800:88;39907:4;39904:1;39897:15;39931:4;39928:1;39921:15;39948:185;39988:1;40005:20;40023:1;40005:20;:::i;:::-;40000:25;;40039:20;40057:1;40039:20;:::i;:::-;40034:25;;40078:1;40068:35;;40083:18;;:::i;:::-;40068:35;40125:1;40122;40118:9;40113:14;;39948:185;;;;:::o;40139:176::-;40171:1;40188:20;40206:1;40188:20;:::i;:::-;40183:25;;40222:20;40240:1;40222:20;:::i;:::-;40217:25;;40261:1;40251:35;;40266:18;;:::i;:::-;40251:35;40307:1;40304;40300:9;40295:14;;40139:176;;;;:::o;40321:180::-;40369:77;40366:1;40359:88;40466:4;40463:1;40456:15;40490:4;40487:1;40480:15;40507:79;40546:7;40575:5;40564:16;;40507:79;;;:::o;40592:157::-;40697:45;40717:24;40735:5;40717:24;:::i;:::-;40697:45;:::i;:::-;40692:3;40685:58;40592:157;;:::o;40755:397::-;40895:3;40910:75;40981:3;40972:6;40910:75;:::i;:::-;41010:2;41005:3;41001:12;40994:19;;41023:75;41094:3;41085:6;41023:75;:::i;:::-;41123:2;41118:3;41114:12;41107:19;;41143:3;41136:10;;40755:397;;;;;:::o;41158:98::-;41209:6;41243:5;41237:12;41227:22;;41158:98;;;:::o;41262:168::-;41345:11;41379:6;41374:3;41367:19;41419:4;41414:3;41410:14;41395:29;;41262:168;;;;:::o;41436:360::-;41522:3;41550:38;41582:5;41550:38;:::i;:::-;41604:70;41667:6;41662:3;41604:70;:::i;:::-;41597:77;;41683:52;41728:6;41723:3;41716:4;41709:5;41705:16;41683:52;:::i;:::-;41760:29;41782:6;41760:29;:::i;:::-;41755:3;41751:39;41744:46;;41526:270;41436:360;;;;:::o;41802:640::-;41997:4;42035:3;42024:9;42020:19;42012:27;;42049:71;42117:1;42106:9;42102:17;42093:6;42049:71;:::i;:::-;42130:72;42198:2;42187:9;42183:18;42174:6;42130:72;:::i;:::-;42212;42280:2;42269:9;42265:18;42256:6;42212:72;:::i;:::-;42331:9;42325:4;42321:20;42316:2;42305:9;42301:18;42294:48;42359:76;42430:4;42421:6;42359:76;:::i;:::-;42351:84;;41802:640;;;;;;;:::o;42448:141::-;42504:5;42535:6;42529:13;42520:22;;42551:32;42577:5;42551:32;:::i;:::-;42448:141;;;;:::o;42595:349::-;42664:6;42713:2;42701:9;42692:7;42688:23;42684:32;42681:119;;;42719:79;;:::i;:::-;42681:119;42839:1;42864:63;42919:7;42910:6;42899:9;42895:22;42864:63;:::i;:::-;42854:73;;42810:127;42595:349;;;;:::o;42950:182::-;43090:34;43086:1;43078:6;43074:14;43067:58;42950:182;:::o;43138:366::-;43280:3;43301:67;43365:2;43360:3;43301:67;:::i;:::-;43294:74;;43377:93;43466:3;43377:93;:::i;:::-;43495:2;43490:3;43486:12;43479:19;;43138:366;;;:::o;43510:419::-;43676:4;43714:2;43703:9;43699:18;43691:26;;43763:9;43757:4;43753:20;43749:1;43738:9;43734:17;43727:47;43791:131;43917:4;43791:131;:::i;:::-;43783:139;;43510:419;;;:::o;43935:178::-;44075:30;44071:1;44063:6;44059:14;44052:54;43935:178;:::o;44119:366::-;44261:3;44282:67;44346:2;44341:3;44282:67;:::i;:::-;44275:74;;44358:93;44447:3;44358:93;:::i;:::-;44476:2;44471:3;44467:12;44460:19;;44119:366;;;:::o;44491:419::-;44657:4;44695:2;44684:9;44680:18;44672:26;;44744:9;44738:4;44734:20;44730:1;44719:9;44715:17;44708:47;44772:131;44898:4;44772:131;:::i;:::-;44764:139;;44491:419;;;:::o

Swarm Source

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