ETH Price: $2,922.62 (-9.82%)
Gas: 23 Gwei

Token

The Night Watch NFT (MR)
 

Overview

Max Total Supply

2,007 MR

Holders

488

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
0 MR
0x626bb5bc4dd1ca5f49e313cc733138a6a631f10e
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:
TheNightWatchNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-11
*/

// SPDX-License-Identifier: GPL-3.0
// 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 (last updated v4.5.0) (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 = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b)
        private
        pure
        returns (bytes32 value)
    {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// 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 (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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

// Creator: Chiru Labs

pragma solidity ^0.8.4;

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId)
        internal
        view
        returns (TokenOwnership memory)
    {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

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

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId)
        public
        view
        override
        returns (address)
    {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _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 {
        _transfer(from, to, tokenId);
        if (
            to.isContract() &&
            !_checkContractOnERC721Received(from, to, tokenId, _data)
        ) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

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

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (
                        !_checkContractOnERC721Received(
                            address(0),
                            to,
                            updatedIndex++,
                            _data
                        )
                    ) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

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

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try
            IERC721Receiver(to).onERC721Received(
                _msgSender(),
                from,
                tokenId,
                _data
            )
        returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

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

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

contract TheNightWatchNFT is ERC721A, Ownable, ReentrancyGuard {
    using Strings for uint256;

    bytes32 public merkleRoot;
    mapping(address => bool) public whitelistClaimed;

    string public uriPrefix;
    string public uriSuffix = ".json";
    string public hiddenMetadataURI;

    uint256 public cost;
    uint256 public maxSupply;
    uint256 public maxMintAmountPerTx;
    uint256 public maxMintAmountPerWallet = 3;
    uint256 private pauseMintAfter;

    bool public paused = false;
    bool public whitelistMintEnabled = false;
    bool public revealed = true;

    mapping(address => uint256) public ownerTokenMapping;

    constructor(
        string memory _tokenName,
        string memory _tokenSymbol,
        uint256 _cost,
        uint256 _pauseMint,
        uint256 _maxSupply,
        uint256 _maxMintAmountPerTx,
        string memory _uriPrefix,
        string memory _hiddenMetadataURI
    ) ERC721A(_tokenName, _tokenSymbol) {
        setCost(_cost);
        setPauseMint(_pauseMint);
        maxSupply = _maxSupply;
        setMaxMintAmountPerTx(_maxMintAmountPerTx);
        setUriPrefix(_uriPrefix);
        sethiddenMetadataURI(_hiddenMetadataURI);
    }

    modifier mintCompliance(uint256 _mintAmount) {
        require(
            _mintAmount > 0 && _mintAmount <= maxMintAmountPerTx,
            "Invalid mint amount!"
        );
        require(
            totalSupply() + _mintAmount <= maxSupply,
            "Max supply exceeded!"
        );
        _;
    }
    modifier mintPriceCompliance(uint256 _mintAmount) {
        require(msg.value >= cost * _mintAmount, "Insufficient funds!");
        _;
    }

    function whitelistMint(uint256 _mintAmount, bytes32[] calldata _merkleProof)
        public
        payable
        mintCompliance(_mintAmount)
        mintPriceCompliance(_mintAmount)
    {
        // Verify whitelist requirements
        require(whitelistMintEnabled, "The whitelist sale is not enabled!");
        require(!whitelistClaimed[_msgSender()], "Address already claimed!");
        require(
            ownerTokenMapping[msg.sender] + _mintAmount <=
                maxMintAmountPerWallet,
            "Max NFTs minted"
        );
        bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));
        require(
            MerkleProof.verify(_merkleProof, merkleRoot, leaf),
            "Invalid proof!"
        );
        whitelistClaimed[_msgSender()] = true;
        _safeMint(_msgSender(), _mintAmount);
        ownerTokenMapping[msg.sender] += _mintAmount;
    }

    function mint(uint256 _mintAmount)
        public
        payable
        mintCompliance(_mintAmount)
        mintPriceCompliance(_mintAmount)
    {
        require(!paused, "The contract is paused!");
        require(
            ownerTokenMapping[msg.sender] + _mintAmount <=
                maxMintAmountPerWallet,
            "Max NFTs minted"
        );
        _safeMint(_msgSender(), _mintAmount);
        ownerTokenMapping[msg.sender] += _mintAmount;
        doPauseMint();
    }

    function mintForAddress(uint256 _mintAmount, address _receiver)
        public
        mintCompliance(_mintAmount)
        onlyOwner
    {
        _safeMint(_receiver, _mintAmount);

        doPauseMint();
    }

    function mintForMultipleAddresses(address[] memory _addresses)
        public
        onlyOwner
    {
        require(
            _addresses.length > 0 && _addresses.length <= maxMintAmountPerTx,
            "Invalid mint amount!"
        );
        require(
            totalSupply() + _addresses.length <= maxSupply,
            "Max supply exceeded!"
        );

        for (uint256 i = 0; i < _addresses.length; i++) {
            _safeMint(_addresses[i], 1);
            doPauseMint();
        }
    }

    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
        uint256 currentTokenId = _startTokenId();
        uint256 ownedTokenIndex = 0;
        address latestOwnerAddress;
        while (
            ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply
        ) {
            TokenOwnership memory ownership = _ownerships[currentTokenId];
            if (!ownership.burned && ownership.addr != address(0)) {
                latestOwnerAddress = ownership.addr;
            }
            if (latestOwnerAddress == _owner) {
                ownedTokenIds[ownedTokenIndex] = currentTokenId;
                ownedTokenIndex++;
            }
            currentTokenId++;
        }
        return ownedTokenIds;
    }

    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(_tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );
        if (revealed == false) {
            return hiddenMetadataURI;
        }
        string memory currentBaseURI = _baseURI();
        return
            bytes(currentBaseURI).length > 0
                ? string(
                    abi.encodePacked(
                        currentBaseURI,
                        _tokenId.toString(),
                        uriSuffix
                    )
                )
                : "";
    }

    function setRevealed(bool _state) public onlyOwner {
        revealed = _state;
    }

    function setCost(uint256 _cost) public onlyOwner {
        cost = _cost;
    }

    function setPauseMint(uint256 _amount) public onlyOwner {
        pauseMintAfter = _amount;
    }

    function doPauseMint() internal {
        if (totalSupply() >= pauseMintAfter) {
            paused = true;
            pauseMintAfter = pauseMintAfter + pauseMintAfter;
        }
    }

    function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx)
        public
        onlyOwner
    {
        maxMintAmountPerTx = _maxMintAmountPerTx;
    }

    function setMaxMintAmountPerWallet(uint256 _maxMintAmountPerWallet)
        public
        onlyOwner
    {
        maxMintAmountPerWallet = _maxMintAmountPerWallet;
    }

    function sethiddenMetadataURI(string memory _hiddenMetadataURI)
        public
        onlyOwner
    {
        hiddenMetadataURI = _hiddenMetadataURI;
    }

    function setUriPrefix(string memory _uriPrefix) public onlyOwner {
        uriPrefix = _uriPrefix;
    }

    function setUriSuffix(string memory _uriSuffix) public onlyOwner {
        uriSuffix = _uriSuffix;
    }

    function setPaused(bool _state) public onlyOwner {
        paused = _state;
    }

    function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
        merkleRoot = _merkleRoot;
    }

    function setWhitelistMintEnabled(bool _state) public onlyOwner {
        whitelistMintEnabled = _state;
    }

    function withdraw() public onlyOwner nonReentrant {
        (bool os, ) = payable(owner()).call{value: address(this).balance}("");
        require(os);
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"uint256","name":"_pauseMint","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"},{"internalType":"string","name":"_uriPrefix","type":"string"},{"internalType":"string","name":"_hiddenMetadataURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"mintForMultipleAddresses","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":[{"internalType":"address","name":"","type":"address"}],"name":"ownerTokenMapping","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerWallet","type":"uint256"}],"name":"setMaxMintAmountPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setPauseMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setWhitelistMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataURI","type":"string"}],"name":"sethiddenMetadataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d908051906020019062000051929190620005db565b5060036012556000601460006101000a81548160ff0219169083151502179055506000601460016101000a81548160ff0219169083151502179055506001601460026101000a81548160ff021916908315150217905550348015620000b557600080fd5b5060405162005c4638038062005c468339818101604052810190620000db919062000720565b87878160029080519060200190620000f5929190620005db565b5080600390805190602001906200010e929190620005db565b506200011f620001b960201b60201c565b6000819055505050620001476200013b620001c260201b60201c565b620001ca60201b60201c565b600160098190555062000160866200029060201b60201c565b62000171856200032960201b60201c565b836010819055506200018983620003c260201b60201c565b6200019a826200045b60201b60201c565b620001ab816200050660201b60201c565b505050505050505062000a90565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002a0620001c260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002c6620005b160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200031f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000316906200088c565b60405180910390fd5b80600f8190555050565b62000339620001c260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200035f620005b160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003b8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003af906200088c565b60405180910390fd5b8060138190555050565b620003d2620001c260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003f8620005b160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000451576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000448906200088c565b60405180910390fd5b8060118190555050565b6200046b620001c260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000491620005b160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620004ea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004e1906200088c565b60405180910390fd5b80600c908051906020019062000502929190620005db565b5050565b62000516620001c260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200053c620005b160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000595576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200058c906200088c565b60405180910390fd5b80600e9080519060200190620005ad929190620005db565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620005e9906200095e565b90600052602060002090601f0160209004810192826200060d576000855562000659565b82601f106200062857805160ff191683800117855562000659565b8280016001018555821562000659579182015b82811115620006585782518255916020019190600101906200063b565b5b5090506200066891906200066c565b5090565b5b80821115620006875760008160009055506001016200066d565b5090565b6000620006a26200069c84620008d7565b620008ae565b905082815260208101848484011115620006c157620006c062000a2d565b5b620006ce84828562000928565b509392505050565b600082601f830112620006ee57620006ed62000a28565b5b8151620007008482602086016200068b565b91505092915050565b6000815190506200071a8162000a76565b92915050565b600080600080600080600080610100898b03121562000744576200074362000a37565b5b600089015167ffffffffffffffff81111562000765576200076462000a32565b5b620007738b828c01620006d6565b985050602089015167ffffffffffffffff81111562000797576200079662000a32565b5b620007a58b828c01620006d6565b9750506040620007b88b828c0162000709565b9650506060620007cb8b828c0162000709565b9550506080620007de8b828c0162000709565b94505060a0620007f18b828c0162000709565b93505060c089015167ffffffffffffffff81111562000815576200081462000a32565b5b620008238b828c01620006d6565b92505060e089015167ffffffffffffffff81111562000847576200084662000a32565b5b620008558b828c01620006d6565b9150509295985092959890939650565b6000620008746020836200090d565b9150620008818262000a4d565b602082019050919050565b60006020820190508181036000830152620008a78162000865565b9050919050565b6000620008ba620008cd565b9050620008c8828262000994565b919050565b6000604051905090565b600067ffffffffffffffff821115620008f557620008f4620009f9565b5b620009008262000a3c565b9050602081019050919050565b600082825260208201905092915050565b6000819050919050565b60005b83811015620009485780820151818401526020810190506200092b565b8381111562000958576000848401525b50505050565b600060028204905060018216806200097757607f821691505b602082108114156200098e576200098d620009ca565b5b50919050565b6200099f8262000a3c565b810181811067ffffffffffffffff82111715620009c157620009c0620009f9565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b62000a81816200091e565b811462000a8d57600080fd5b50565b6151a68062000aa06000396000f3fe6080604052600436106102885760003560e01c8063715018a61161015a578063ba9e12f7116100c1578063d5abeb011161007a578063d5abeb0114610988578063db4bec44146109b3578063e0a80853146109f0578063e985e9c514610a19578063efbd73f414610a56578063f2fde38b14610a7f57610288565b8063ba9e12f714610873578063bc951b911461089e578063c87b56dd146108c9578063c99f774f14610906578063ccfc83f314610943578063d2cab0561461096c57610288565b806395d89b411161011357806395d89b4114610788578063a0712d68146107b3578063a22cb465146107cf578063b071401b146107f8578063b767a09814610821578063b88d4fde1461084a57610288565b8063715018a6146106a0578063766b7d09146106b75780637cb64759146106e05780637ec4a659146107095780638da5cb5b1461073257806394354fd01461075d57610288565b80632eb4a7ab116101fe5780635503a0e8116101b75780635503a0e81461057a5780635c975abb146105a557806362b99ad4146105d05780636352211e146105fb5780636caede3d1461063857806370a082311461066357610288565b80632eb4a7ab1461047e5780633ccfd60b146104a957806342842e0e146104c0578063438b6300146104e957806344a0d68a14610526578063518302271461054f57610288565b8063139fad6011610250578063139fad601461038457806313faede6146103ad57806316ba10e0146103d857806316c38b3c1461040157806318160ddd1461042a57806323b872dd1461045557610288565b80630175b8e91461028d57806301ffc9a7146102b657806306fdde03146102f3578063081812fc1461031e578063095ea7b31461035b575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af91906141e5565b610aa8565b005b3480156102c257600080fd5b506102dd60048036038101906102d89190614142565b610b2e565b6040516102ea919061475d565b60405180910390f35b3480156102ff57600080fd5b50610308610c10565b6040516103159190614793565b60405180910390f35b34801561032a57600080fd5b50610345600480360381019061034091906141e5565b610ca2565b60405161035291906146d4565b60405180910390f35b34801561036757600080fd5b50610382600480360381019061037d919061405f565b610d1e565b005b34801561039057600080fd5b506103ab60048036038101906103a6919061419c565b610e29565b005b3480156103b957600080fd5b506103c2610ebf565b6040516103cf9190614935565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa919061419c565b610ec5565b005b34801561040d57600080fd5b50610428600480360381019061042391906140e8565b610f5b565b005b34801561043657600080fd5b5061043f610ff4565b60405161044c9190614935565b60405180910390f35b34801561046157600080fd5b5061047c60048036038101906104779190613f49565b61100b565b005b34801561048a57600080fd5b5061049361101b565b6040516104a09190614778565b60405180910390f35b3480156104b557600080fd5b506104be611021565b005b3480156104cc57600080fd5b506104e760048036038101906104e29190613f49565b611173565b005b3480156104f557600080fd5b50610510600480360381019061050b9190613edc565b611193565b60405161051d919061473b565b60405180910390f35b34801561053257600080fd5b5061054d600480360381019061054891906141e5565b6113ae565b005b34801561055b57600080fd5b50610564611434565b604051610571919061475d565b60405180910390f35b34801561058657600080fd5b5061058f611447565b60405161059c9190614793565b60405180910390f35b3480156105b157600080fd5b506105ba6114d5565b6040516105c7919061475d565b60405180910390f35b3480156105dc57600080fd5b506105e56114e8565b6040516105f29190614793565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d91906141e5565b611576565b60405161062f91906146d4565b60405180910390f35b34801561064457600080fd5b5061064d61158c565b60405161065a919061475d565b60405180910390f35b34801561066f57600080fd5b5061068a60048036038101906106859190613edc565b61159f565b6040516106979190614935565b60405180910390f35b3480156106ac57600080fd5b506106b561166f565b005b3480156106c357600080fd5b506106de60048036038101906106d991906141e5565b6116f7565b005b3480156106ec57600080fd5b5061070760048036038101906107029190614115565b61177d565b005b34801561071557600080fd5b50610730600480360381019061072b919061419c565b611803565b005b34801561073e57600080fd5b50610747611899565b60405161075491906146d4565b60405180910390f35b34801561076957600080fd5b506107726118c3565b60405161077f9190614935565b60405180910390f35b34801561079457600080fd5b5061079d6118c9565b6040516107aa9190614793565b60405180910390f35b6107cd60048036038101906107c891906141e5565b61195b565b005b3480156107db57600080fd5b506107f660048036038101906107f1919061401f565b611ba8565b005b34801561080457600080fd5b5061081f600480360381019061081a91906141e5565b611d20565b005b34801561082d57600080fd5b50610848600480360381019061084391906140e8565b611da6565b005b34801561085657600080fd5b50610871600480360381019061086c9190613f9c565b611e3f565b005b34801561087f57600080fd5b50610888611ebb565b6040516108959190614793565b60405180910390f35b3480156108aa57600080fd5b506108b3611f49565b6040516108c09190614935565b60405180910390f35b3480156108d557600080fd5b506108f060048036038101906108eb91906141e5565b611f4f565b6040516108fd9190614793565b60405180910390f35b34801561091257600080fd5b5061092d60048036038101906109289190613edc565b6120a8565b60405161093a9190614935565b60405180910390f35b34801561094f57600080fd5b5061096a6004803603810190610965919061409f565b6120c0565b005b61098660048036038101906109819190614252565b612237565b005b34801561099457600080fd5b5061099d612630565b6040516109aa9190614935565b60405180910390f35b3480156109bf57600080fd5b506109da60048036038101906109d59190613edc565b612636565b6040516109e7919061475d565b60405180910390f35b3480156109fc57600080fd5b50610a176004803603810190610a1291906140e8565b612656565b005b348015610a2557600080fd5b50610a406004803603810190610a3b9190613f09565b6126ef565b604051610a4d919061475d565b60405180910390f35b348015610a6257600080fd5b50610a7d6004803603810190610a789190614212565b612783565b005b348015610a8b57600080fd5b50610aa66004803603810190610aa19190613edc565b6128bf565b005b610ab06129b7565b73ffffffffffffffffffffffffffffffffffffffff16610ace611899565b73ffffffffffffffffffffffffffffffffffffffff1614610b24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1b90614835565b60405180910390fd5b8060138190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bf957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c095750610c08826129bf565b5b9050919050565b606060028054610c1f90614c74565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4b90614c74565b8015610c985780601f10610c6d57610100808354040283529160200191610c98565b820191906000526020600020905b815481529060010190602001808311610c7b57829003601f168201915b5050505050905090565b6000610cad82612a29565b610ce3576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d2982611576565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d91576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610db06129b7565b73ffffffffffffffffffffffffffffffffffffffff1614158015610de25750610de081610ddb6129b7565b6126ef565b155b15610e19576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e24838383612a77565b505050565b610e316129b7565b73ffffffffffffffffffffffffffffffffffffffff16610e4f611899565b73ffffffffffffffffffffffffffffffffffffffff1614610ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9c90614835565b60405180910390fd5b80600e9080519060200190610ebb929190613ba4565b5050565b600f5481565b610ecd6129b7565b73ffffffffffffffffffffffffffffffffffffffff16610eeb611899565b73ffffffffffffffffffffffffffffffffffffffff1614610f41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3890614835565b60405180910390fd5b80600d9080519060200190610f57929190613ba4565b5050565b610f636129b7565b73ffffffffffffffffffffffffffffffffffffffff16610f81611899565b73ffffffffffffffffffffffffffffffffffffffff1614610fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fce90614835565b60405180910390fd5b80601460006101000a81548160ff02191690831515021790555050565b6000610ffe612b29565b6001546000540303905090565b611016838383612b32565b505050565b600a5481565b6110296129b7565b73ffffffffffffffffffffffffffffffffffffffff16611047611899565b73ffffffffffffffffffffffffffffffffffffffff161461109d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109490614835565b60405180910390fd5b600260095414156110e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110da906148f5565b60405180910390fd5b600260098190555060006110f5611899565b73ffffffffffffffffffffffffffffffffffffffff1647604051611118906146bf565b60006040518083038185875af1925050503d8060008114611155576040519150601f19603f3d011682016040523d82523d6000602084013e61115a565b606091505b505090508061116857600080fd5b506001600981905550565b61118e83838360405180602001604052806000815250611e3f565b505050565b606060006111a08361159f565b905060008167ffffffffffffffff8111156111be576111bd614e31565b5b6040519080825280602002602001820160405280156111ec5781602001602082028036833780820191505090505b50905060006111f9612b29565b90506000805b848210801561121057506010548311155b156113a1576000600460008581526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115801561131d5750600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614155b1561132a57806000015191505b8773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561138d578385848151811061137257611371614e02565b5b602002602001018181525050828061138990614cd7565b9350505b838061139890614cd7565b945050506111ff565b8395505050505050919050565b6113b66129b7565b73ffffffffffffffffffffffffffffffffffffffff166113d4611899565b73ffffffffffffffffffffffffffffffffffffffff161461142a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142190614835565b60405180910390fd5b80600f8190555050565b601460029054906101000a900460ff1681565b600d805461145490614c74565b80601f016020809104026020016040519081016040528092919081815260200182805461148090614c74565b80156114cd5780601f106114a2576101008083540402835291602001916114cd565b820191906000526020600020905b8154815290600101906020018083116114b057829003601f168201915b505050505081565b601460009054906101000a900460ff1681565b600c80546114f590614c74565b80601f016020809104026020016040519081016040528092919081815260200182805461152190614c74565b801561156e5780601f106115435761010080835404028352916020019161156e565b820191906000526020600020905b81548152906001019060200180831161155157829003601f168201915b505050505081565b600061158182612fe8565b600001519050919050565b601460019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611607576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6116776129b7565b73ffffffffffffffffffffffffffffffffffffffff16611695611899565b73ffffffffffffffffffffffffffffffffffffffff16146116eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e290614835565b60405180910390fd5b6116f56000613277565b565b6116ff6129b7565b73ffffffffffffffffffffffffffffffffffffffff1661171d611899565b73ffffffffffffffffffffffffffffffffffffffff1614611773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176a90614835565b60405180910390fd5b8060128190555050565b6117856129b7565b73ffffffffffffffffffffffffffffffffffffffff166117a3611899565b73ffffffffffffffffffffffffffffffffffffffff16146117f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f090614835565b60405180910390fd5b80600a8190555050565b61180b6129b7565b73ffffffffffffffffffffffffffffffffffffffff16611829611899565b73ffffffffffffffffffffffffffffffffffffffff161461187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614835565b60405180910390fd5b80600c9080519060200190611895929190613ba4565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60115481565b6060600380546118d890614c74565b80601f016020809104026020016040519081016040528092919081815260200182805461190490614c74565b80156119515780601f1061192657610100808354040283529160200191611951565b820191906000526020600020905b81548152906001019060200180831161193457829003601f168201915b5050505050905090565b8060008111801561196e57506011548111155b6119ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a4906147f5565b60405180910390fd5b601054816119b9610ff4565b6119c39190614a9f565b1115611a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fb906148b5565b60405180910390fd5b8180600f54611a139190614b26565b341015611a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4c90614915565b60405180910390fd5b601460009054906101000a900460ff1615611aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9c90614855565b60405180910390fd5b60125483601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611af39190614a9f565b1115611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b90614815565b60405180910390fd5b611b45611b3f6129b7565b8461333d565b82601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b949190614a9f565b92505081905550611ba361335b565b505050565b611bb06129b7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c15576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611c226129b7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ccf6129b7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d14919061475d565b60405180910390a35050565b611d286129b7565b73ffffffffffffffffffffffffffffffffffffffff16611d46611899565b73ffffffffffffffffffffffffffffffffffffffff1614611d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9390614835565b60405180910390fd5b8060118190555050565b611dae6129b7565b73ffffffffffffffffffffffffffffffffffffffff16611dcc611899565b73ffffffffffffffffffffffffffffffffffffffff1614611e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1990614835565b60405180910390fd5b80601460016101000a81548160ff02191690831515021790555050565b611e4a848484612b32565b611e698373ffffffffffffffffffffffffffffffffffffffff1661339f565b8015611e7e5750611e7c848484846133c2565b155b15611eb5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600e8054611ec890614c74565b80601f0160208091040260200160405190810160405280929190818152602001828054611ef490614c74565b8015611f415780601f10611f1657610100808354040283529160200191611f41565b820191906000526020600020905b815481529060010190602001808311611f2457829003601f168201915b505050505081565b60125481565b6060611f5a82612a29565b611f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9090614895565b60405180910390fd5b60001515601460029054906101000a900460ff161515141561204757600e8054611fc290614c74565b80601f0160208091040260200160405190810160405280929190818152602001828054611fee90614c74565b801561203b5780601f106120105761010080835404028352916020019161203b565b820191906000526020600020905b81548152906001019060200180831161201e57829003601f168201915b505050505090506120a3565b6000612051613522565b90506000815111612071576040518060200160405280600081525061209f565b8061207b846135b4565b600d60405160200161208f9392919061468e565b6040516020818303038152906040525b9150505b919050565b60156020528060005260406000206000915090505481565b6120c86129b7565b73ffffffffffffffffffffffffffffffffffffffff166120e6611899565b73ffffffffffffffffffffffffffffffffffffffff161461213c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213390614835565b60405180910390fd5b600081511180156121505750601154815111155b61218f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612186906147f5565b60405180910390fd5b601054815161219c610ff4565b6121a69190614a9f565b11156121e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121de906148b5565b60405180910390fd5b60005b81518110156122335761221882828151811061220957612208614e02565b5b6020026020010151600161333d565b61222061335b565b808061222b90614cd7565b9150506121ea565b5050565b8260008111801561224a57506011548111155b612289576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612280906147f5565b60405180910390fd5b60105481612295610ff4565b61229f9190614a9f565b11156122e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d7906148b5565b60405180910390fd5b8380600f546122ef9190614b26565b341015612331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232890614915565b60405180910390fd5b601460019054906101000a900460ff16612380576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612377906148d5565b60405180910390fd5b600b600061238c6129b7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240b90614875565b60405180910390fd5b60125485601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546124629190614a9f565b11156124a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249a90614815565b60405180910390fd5b60006124ad6129b7565b6040516020016124bd9190614673565b604051602081830303815290604052805190602001209050612523858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5483613715565b612562576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612559906147b5565b60405180910390fd5b6001600b60006125706129b7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506125d26125cc6129b7565b8761333d565b85601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126219190614a9f565b92505081905550505050505050565b60105481565b600b6020528060005260406000206000915054906101000a900460ff1681565b61265e6129b7565b73ffffffffffffffffffffffffffffffffffffffff1661267c611899565b73ffffffffffffffffffffffffffffffffffffffff16146126d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c990614835565b60405180910390fd5b80601460026101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8160008111801561279657506011548111155b6127d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127cc906147f5565b60405180910390fd5b601054816127e1610ff4565b6127eb9190614a9f565b111561282c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612823906148b5565b60405180910390fd5b6128346129b7565b73ffffffffffffffffffffffffffffffffffffffff16612852611899565b73ffffffffffffffffffffffffffffffffffffffff16146128a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289f90614835565b60405180910390fd5b6128b2828461333d565b6128ba61335b565b505050565b6128c76129b7565b73ffffffffffffffffffffffffffffffffffffffff166128e5611899565b73ffffffffffffffffffffffffffffffffffffffff161461293b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293290614835565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156129ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a2906147d5565b60405180910390fd5b6129b481613277565b50565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081612a34612b29565b11158015612a43575060005482105b8015612a70575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000612b3d82612fe8565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ba8576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612bc96129b7565b73ffffffffffffffffffffffffffffffffffffffff161480612bf85750612bf785612bf26129b7565b6126ef565b5b80612c3d5750612c066129b7565b73ffffffffffffffffffffffffffffffffffffffff16612c2584610ca2565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612c76576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612cdd576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cea858585600161372c565b612cf660008487612a77565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612f76576000548214612f7557878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612fe18585856001613732565b5050505050565b612ff0613c2a565b600082905080612ffe612b29565b1115801561300d575060005481105b15613240576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161323e57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613122578092505050613272565b5b60011561323d57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613238578092505050613272565b613123565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613357828260405180602001604052806000815250613738565b5050565b601354613366610ff4565b1061339d576001601460006101000a81548160ff0219169083151502179055506013546013546133969190614a9f565b6013819055505b565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133e86129b7565b8786866040518563ffffffff1660e01b815260040161340a94939291906146ef565b602060405180830381600087803b15801561342457600080fd5b505af192505050801561345557506040513d601f19601f82011682018060405250810190613452919061416f565b60015b6134cf573d8060008114613485576040519150601f19603f3d011682016040523d82523d6000602084013e61348a565b606091505b506000815114156134c7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c805461353190614c74565b80601f016020809104026020016040519081016040528092919081815260200182805461355d90614c74565b80156135aa5780601f1061357f576101008083540402835291602001916135aa565b820191906000526020600020905b81548152906001019060200180831161358d57829003601f168201915b5050505050905090565b606060008214156135fc576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613710565b600082905060005b6000821461362e57808061361790614cd7565b915050600a826136279190614af5565b9150613604565b60008167ffffffffffffffff81111561364a57613649614e31565b5b6040519080825280601f01601f19166020018201604052801561367c5781602001600182028036833780820191505090505b5090505b60008514613709576001826136959190614b80565b9150600a856136a49190614d44565b60306136b09190614a9f565b60f81b8183815181106136c6576136c5614e02565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856137029190614af5565b9450613680565b8093505050505b919050565b600082613722858461374a565b1490509392505050565b50505050565b50505050565b61374583838360016137bf565b505050565b60008082905060005b84518110156137b457600085828151811061377157613770614e02565b5b602002602001015190508083116137935761378c8382613b8d565b92506137a0565b61379d8184613b8d565b92505b5080806137ac90614cd7565b915050613753565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561382c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613867576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613874600086838761372c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015613a3e5750613a3d8773ffffffffffffffffffffffffffffffffffffffff1661339f565b5b15613b04575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613ab360008884806001019550886133c2565b613ae9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415613a44578260005414613aff57600080fd5b613b70565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613b05575b816000819055505050613b866000868387613732565b5050505050565b600082600052816020526040600020905092915050565b828054613bb090614c74565b90600052602060002090601f016020900481019282613bd25760008555613c19565b82601f10613beb57805160ff1916838001178555613c19565b82800160010185558215613c19579182015b82811115613c18578251825591602001919060010190613bfd565b5b509050613c269190613c6d565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613c86576000816000905550600101613c6e565b5090565b6000613c9d613c9884614975565b614950565b90508083825260208201905082856020860282011115613cc057613cbf614e6a565b5b60005b85811015613cf05781613cd68882613d7e565b845260208401935060208301925050600181019050613cc3565b5050509392505050565b6000613d0d613d08846149a1565b614950565b905082815260208101848484011115613d2957613d28614e6f565b5b613d34848285614c32565b509392505050565b6000613d4f613d4a846149d2565b614950565b905082815260208101848484011115613d6b57613d6a614e6f565b5b613d76848285614c32565b509392505050565b600081359050613d8d816150fd565b92915050565b600082601f830112613da857613da7614e65565b5b8135613db8848260208601613c8a565b91505092915050565b60008083601f840112613dd757613dd6614e65565b5b8235905067ffffffffffffffff811115613df457613df3614e60565b5b602083019150836020820283011115613e1057613e0f614e6a565b5b9250929050565b600081359050613e2681615114565b92915050565b600081359050613e3b8161512b565b92915050565b600081359050613e5081615142565b92915050565b600081519050613e6581615142565b92915050565b600082601f830112613e8057613e7f614e65565b5b8135613e90848260208601613cfa565b91505092915050565b600082601f830112613eae57613ead614e65565b5b8135613ebe848260208601613d3c565b91505092915050565b600081359050613ed681615159565b92915050565b600060208284031215613ef257613ef1614e79565b5b6000613f0084828501613d7e565b91505092915050565b60008060408385031215613f2057613f1f614e79565b5b6000613f2e85828601613d7e565b9250506020613f3f85828601613d7e565b9150509250929050565b600080600060608486031215613f6257613f61614e79565b5b6000613f7086828701613d7e565b9350506020613f8186828701613d7e565b9250506040613f9286828701613ec7565b9150509250925092565b60008060008060808587031215613fb657613fb5614e79565b5b6000613fc487828801613d7e565b9450506020613fd587828801613d7e565b9350506040613fe687828801613ec7565b925050606085013567ffffffffffffffff81111561400757614006614e74565b5b61401387828801613e6b565b91505092959194509250565b6000806040838503121561403657614035614e79565b5b600061404485828601613d7e565b925050602061405585828601613e17565b9150509250929050565b6000806040838503121561407657614075614e79565b5b600061408485828601613d7e565b925050602061409585828601613ec7565b9150509250929050565b6000602082840312156140b5576140b4614e79565b5b600082013567ffffffffffffffff8111156140d3576140d2614e74565b5b6140df84828501613d93565b91505092915050565b6000602082840312156140fe576140fd614e79565b5b600061410c84828501613e17565b91505092915050565b60006020828403121561412b5761412a614e79565b5b600061413984828501613e2c565b91505092915050565b60006020828403121561415857614157614e79565b5b600061416684828501613e41565b91505092915050565b60006020828403121561418557614184614e79565b5b600061419384828501613e56565b91505092915050565b6000602082840312156141b2576141b1614e79565b5b600082013567ffffffffffffffff8111156141d0576141cf614e74565b5b6141dc84828501613e99565b91505092915050565b6000602082840312156141fb576141fa614e79565b5b600061420984828501613ec7565b91505092915050565b6000806040838503121561422957614228614e79565b5b600061423785828601613ec7565b925050602061424885828601613d7e565b9150509250929050565b60008060006040848603121561426b5761426a614e79565b5b600061427986828701613ec7565b935050602084013567ffffffffffffffff81111561429a57614299614e74565b5b6142a686828701613dc1565b92509250509250925092565b60006142be8383614655565b60208301905092915050565b6142d381614bb4565b82525050565b6142ea6142e582614bb4565b614d20565b82525050565b60006142fb82614a28565b6143058185614a56565b935061431083614a03565b8060005b8381101561434157815161432888826142b2565b975061433383614a49565b925050600181019050614314565b5085935050505092915050565b61435781614bc6565b82525050565b61436681614bd2565b82525050565b600061437782614a33565b6143818185614a67565b9350614391818560208601614c41565b61439a81614e7e565b840191505092915050565b60006143b082614a3e565b6143ba8185614a83565b93506143ca818560208601614c41565b6143d381614e7e565b840191505092915050565b60006143e982614a3e565b6143f38185614a94565b9350614403818560208601614c41565b80840191505092915050565b6000815461441c81614c74565b6144268186614a94565b94506001821660008114614441576001811461445257614485565b60ff19831686528186019350614485565b61445b85614a13565b60005b8381101561447d5781548189015260018201915060208101905061445e565b838801955050505b50505092915050565b600061449b600e83614a83565b91506144a682614e9c565b602082019050919050565b60006144be602683614a83565b91506144c982614ec5565b604082019050919050565b60006144e1601483614a83565b91506144ec82614f14565b602082019050919050565b6000614504600f83614a83565b915061450f82614f3d565b602082019050919050565b6000614527602083614a83565b915061453282614f66565b602082019050919050565b600061454a601783614a83565b915061455582614f8f565b602082019050919050565b600061456d601883614a83565b915061457882614fb8565b602082019050919050565b6000614590602f83614a83565b915061459b82614fe1565b604082019050919050565b60006145b3600083614a78565b91506145be82615030565b600082019050919050565b60006145d6601483614a83565b91506145e182615033565b602082019050919050565b60006145f9602283614a83565b91506146048261505c565b604082019050919050565b600061461c601f83614a83565b9150614627826150ab565b602082019050919050565b600061463f601383614a83565b915061464a826150d4565b602082019050919050565b61465e81614c28565b82525050565b61466d81614c28565b82525050565b600061467f82846142d9565b60148201915081905092915050565b600061469a82866143de565b91506146a682856143de565b91506146b2828461440f565b9150819050949350505050565b60006146ca826145a6565b9150819050919050565b60006020820190506146e960008301846142ca565b92915050565b600060808201905061470460008301876142ca565b61471160208301866142ca565b61471e6040830185614664565b8181036060830152614730818461436c565b905095945050505050565b6000602082019050818103600083015261475581846142f0565b905092915050565b6000602082019050614772600083018461434e565b92915050565b600060208201905061478d600083018461435d565b92915050565b600060208201905081810360008301526147ad81846143a5565b905092915050565b600060208201905081810360008301526147ce8161448e565b9050919050565b600060208201905081810360008301526147ee816144b1565b9050919050565b6000602082019050818103600083015261480e816144d4565b9050919050565b6000602082019050818103600083015261482e816144f7565b9050919050565b6000602082019050818103600083015261484e8161451a565b9050919050565b6000602082019050818103600083015261486e8161453d565b9050919050565b6000602082019050818103600083015261488e81614560565b9050919050565b600060208201905081810360008301526148ae81614583565b9050919050565b600060208201905081810360008301526148ce816145c9565b9050919050565b600060208201905081810360008301526148ee816145ec565b9050919050565b6000602082019050818103600083015261490e8161460f565b9050919050565b6000602082019050818103600083015261492e81614632565b9050919050565b600060208201905061494a6000830184614664565b92915050565b600061495a61496b565b90506149668282614ca6565b919050565b6000604051905090565b600067ffffffffffffffff8211156149905761498f614e31565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156149bc576149bb614e31565b5b6149c582614e7e565b9050602081019050919050565b600067ffffffffffffffff8211156149ed576149ec614e31565b5b6149f682614e7e565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614aaa82614c28565b9150614ab583614c28565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614aea57614ae9614d75565b5b828201905092915050565b6000614b0082614c28565b9150614b0b83614c28565b925082614b1b57614b1a614da4565b5b828204905092915050565b6000614b3182614c28565b9150614b3c83614c28565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b7557614b74614d75565b5b828202905092915050565b6000614b8b82614c28565b9150614b9683614c28565b925082821015614ba957614ba8614d75565b5b828203905092915050565b6000614bbf82614c08565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c5f578082015181840152602081019050614c44565b83811115614c6e576000848401525b50505050565b60006002820490506001821680614c8c57607f821691505b60208210811415614ca057614c9f614dd3565b5b50919050565b614caf82614e7e565b810181811067ffffffffffffffff82111715614cce57614ccd614e31565b5b80604052505050565b6000614ce282614c28565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d1557614d14614d75565b5b600182019050919050565b6000614d2b82614d32565b9050919050565b6000614d3d82614e8f565b9050919050565b6000614d4f82614c28565b9150614d5a83614c28565b925082614d6a57614d69614da4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f4d6178204e465473206d696e7465640000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4164647265737320616c726561647920636c61696d6564210000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f5468652077686974656c6973742073616c65206973206e6f7420656e61626c6560008201527f6421000000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b61510681614bb4565b811461511157600080fd5b50565b61511d81614bc6565b811461512857600080fd5b50565b61513481614bd2565b811461513f57600080fd5b50565b61514b81614bdc565b811461515657600080fd5b50565b61516281614c28565b811461516d57600080fd5b5056fea26469706673582212202ae601f77d21aac6c9dfa98d606d3eca03aed1913dffaf2225129a4eaab2ad9964736f6c6343000807003300000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000007d00000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000013546865204e69676874205761746368204e46540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024d520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f6261667962656963366b69723732687a63716773366534786678737962696e61746a67666977357671676b7a74656e716f646a67653433783477612f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f6261667962656963366b69723732687a63716773366534786678737962696e61746a67666977357671676b7a74656e716f646a67653433783477612f0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102885760003560e01c8063715018a61161015a578063ba9e12f7116100c1578063d5abeb011161007a578063d5abeb0114610988578063db4bec44146109b3578063e0a80853146109f0578063e985e9c514610a19578063efbd73f414610a56578063f2fde38b14610a7f57610288565b8063ba9e12f714610873578063bc951b911461089e578063c87b56dd146108c9578063c99f774f14610906578063ccfc83f314610943578063d2cab0561461096c57610288565b806395d89b411161011357806395d89b4114610788578063a0712d68146107b3578063a22cb465146107cf578063b071401b146107f8578063b767a09814610821578063b88d4fde1461084a57610288565b8063715018a6146106a0578063766b7d09146106b75780637cb64759146106e05780637ec4a659146107095780638da5cb5b1461073257806394354fd01461075d57610288565b80632eb4a7ab116101fe5780635503a0e8116101b75780635503a0e81461057a5780635c975abb146105a557806362b99ad4146105d05780636352211e146105fb5780636caede3d1461063857806370a082311461066357610288565b80632eb4a7ab1461047e5780633ccfd60b146104a957806342842e0e146104c0578063438b6300146104e957806344a0d68a14610526578063518302271461054f57610288565b8063139fad6011610250578063139fad601461038457806313faede6146103ad57806316ba10e0146103d857806316c38b3c1461040157806318160ddd1461042a57806323b872dd1461045557610288565b80630175b8e91461028d57806301ffc9a7146102b657806306fdde03146102f3578063081812fc1461031e578063095ea7b31461035b575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af91906141e5565b610aa8565b005b3480156102c257600080fd5b506102dd60048036038101906102d89190614142565b610b2e565b6040516102ea919061475d565b60405180910390f35b3480156102ff57600080fd5b50610308610c10565b6040516103159190614793565b60405180910390f35b34801561032a57600080fd5b50610345600480360381019061034091906141e5565b610ca2565b60405161035291906146d4565b60405180910390f35b34801561036757600080fd5b50610382600480360381019061037d919061405f565b610d1e565b005b34801561039057600080fd5b506103ab60048036038101906103a6919061419c565b610e29565b005b3480156103b957600080fd5b506103c2610ebf565b6040516103cf9190614935565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa919061419c565b610ec5565b005b34801561040d57600080fd5b50610428600480360381019061042391906140e8565b610f5b565b005b34801561043657600080fd5b5061043f610ff4565b60405161044c9190614935565b60405180910390f35b34801561046157600080fd5b5061047c60048036038101906104779190613f49565b61100b565b005b34801561048a57600080fd5b5061049361101b565b6040516104a09190614778565b60405180910390f35b3480156104b557600080fd5b506104be611021565b005b3480156104cc57600080fd5b506104e760048036038101906104e29190613f49565b611173565b005b3480156104f557600080fd5b50610510600480360381019061050b9190613edc565b611193565b60405161051d919061473b565b60405180910390f35b34801561053257600080fd5b5061054d600480360381019061054891906141e5565b6113ae565b005b34801561055b57600080fd5b50610564611434565b604051610571919061475d565b60405180910390f35b34801561058657600080fd5b5061058f611447565b60405161059c9190614793565b60405180910390f35b3480156105b157600080fd5b506105ba6114d5565b6040516105c7919061475d565b60405180910390f35b3480156105dc57600080fd5b506105e56114e8565b6040516105f29190614793565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d91906141e5565b611576565b60405161062f91906146d4565b60405180910390f35b34801561064457600080fd5b5061064d61158c565b60405161065a919061475d565b60405180910390f35b34801561066f57600080fd5b5061068a60048036038101906106859190613edc565b61159f565b6040516106979190614935565b60405180910390f35b3480156106ac57600080fd5b506106b561166f565b005b3480156106c357600080fd5b506106de60048036038101906106d991906141e5565b6116f7565b005b3480156106ec57600080fd5b5061070760048036038101906107029190614115565b61177d565b005b34801561071557600080fd5b50610730600480360381019061072b919061419c565b611803565b005b34801561073e57600080fd5b50610747611899565b60405161075491906146d4565b60405180910390f35b34801561076957600080fd5b506107726118c3565b60405161077f9190614935565b60405180910390f35b34801561079457600080fd5b5061079d6118c9565b6040516107aa9190614793565b60405180910390f35b6107cd60048036038101906107c891906141e5565b61195b565b005b3480156107db57600080fd5b506107f660048036038101906107f1919061401f565b611ba8565b005b34801561080457600080fd5b5061081f600480360381019061081a91906141e5565b611d20565b005b34801561082d57600080fd5b50610848600480360381019061084391906140e8565b611da6565b005b34801561085657600080fd5b50610871600480360381019061086c9190613f9c565b611e3f565b005b34801561087f57600080fd5b50610888611ebb565b6040516108959190614793565b60405180910390f35b3480156108aa57600080fd5b506108b3611f49565b6040516108c09190614935565b60405180910390f35b3480156108d557600080fd5b506108f060048036038101906108eb91906141e5565b611f4f565b6040516108fd9190614793565b60405180910390f35b34801561091257600080fd5b5061092d60048036038101906109289190613edc565b6120a8565b60405161093a9190614935565b60405180910390f35b34801561094f57600080fd5b5061096a6004803603810190610965919061409f565b6120c0565b005b61098660048036038101906109819190614252565b612237565b005b34801561099457600080fd5b5061099d612630565b6040516109aa9190614935565b60405180910390f35b3480156109bf57600080fd5b506109da60048036038101906109d59190613edc565b612636565b6040516109e7919061475d565b60405180910390f35b3480156109fc57600080fd5b50610a176004803603810190610a1291906140e8565b612656565b005b348015610a2557600080fd5b50610a406004803603810190610a3b9190613f09565b6126ef565b604051610a4d919061475d565b60405180910390f35b348015610a6257600080fd5b50610a7d6004803603810190610a789190614212565b612783565b005b348015610a8b57600080fd5b50610aa66004803603810190610aa19190613edc565b6128bf565b005b610ab06129b7565b73ffffffffffffffffffffffffffffffffffffffff16610ace611899565b73ffffffffffffffffffffffffffffffffffffffff1614610b24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1b90614835565b60405180910390fd5b8060138190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bf957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c095750610c08826129bf565b5b9050919050565b606060028054610c1f90614c74565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4b90614c74565b8015610c985780601f10610c6d57610100808354040283529160200191610c98565b820191906000526020600020905b815481529060010190602001808311610c7b57829003601f168201915b5050505050905090565b6000610cad82612a29565b610ce3576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d2982611576565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d91576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610db06129b7565b73ffffffffffffffffffffffffffffffffffffffff1614158015610de25750610de081610ddb6129b7565b6126ef565b155b15610e19576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e24838383612a77565b505050565b610e316129b7565b73ffffffffffffffffffffffffffffffffffffffff16610e4f611899565b73ffffffffffffffffffffffffffffffffffffffff1614610ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9c90614835565b60405180910390fd5b80600e9080519060200190610ebb929190613ba4565b5050565b600f5481565b610ecd6129b7565b73ffffffffffffffffffffffffffffffffffffffff16610eeb611899565b73ffffffffffffffffffffffffffffffffffffffff1614610f41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3890614835565b60405180910390fd5b80600d9080519060200190610f57929190613ba4565b5050565b610f636129b7565b73ffffffffffffffffffffffffffffffffffffffff16610f81611899565b73ffffffffffffffffffffffffffffffffffffffff1614610fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fce90614835565b60405180910390fd5b80601460006101000a81548160ff02191690831515021790555050565b6000610ffe612b29565b6001546000540303905090565b611016838383612b32565b505050565b600a5481565b6110296129b7565b73ffffffffffffffffffffffffffffffffffffffff16611047611899565b73ffffffffffffffffffffffffffffffffffffffff161461109d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109490614835565b60405180910390fd5b600260095414156110e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110da906148f5565b60405180910390fd5b600260098190555060006110f5611899565b73ffffffffffffffffffffffffffffffffffffffff1647604051611118906146bf565b60006040518083038185875af1925050503d8060008114611155576040519150601f19603f3d011682016040523d82523d6000602084013e61115a565b606091505b505090508061116857600080fd5b506001600981905550565b61118e83838360405180602001604052806000815250611e3f565b505050565b606060006111a08361159f565b905060008167ffffffffffffffff8111156111be576111bd614e31565b5b6040519080825280602002602001820160405280156111ec5781602001602082028036833780820191505090505b50905060006111f9612b29565b90506000805b848210801561121057506010548311155b156113a1576000600460008581526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115801561131d5750600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614155b1561132a57806000015191505b8773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561138d578385848151811061137257611371614e02565b5b602002602001018181525050828061138990614cd7565b9350505b838061139890614cd7565b945050506111ff565b8395505050505050919050565b6113b66129b7565b73ffffffffffffffffffffffffffffffffffffffff166113d4611899565b73ffffffffffffffffffffffffffffffffffffffff161461142a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142190614835565b60405180910390fd5b80600f8190555050565b601460029054906101000a900460ff1681565b600d805461145490614c74565b80601f016020809104026020016040519081016040528092919081815260200182805461148090614c74565b80156114cd5780601f106114a2576101008083540402835291602001916114cd565b820191906000526020600020905b8154815290600101906020018083116114b057829003601f168201915b505050505081565b601460009054906101000a900460ff1681565b600c80546114f590614c74565b80601f016020809104026020016040519081016040528092919081815260200182805461152190614c74565b801561156e5780601f106115435761010080835404028352916020019161156e565b820191906000526020600020905b81548152906001019060200180831161155157829003601f168201915b505050505081565b600061158182612fe8565b600001519050919050565b601460019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611607576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6116776129b7565b73ffffffffffffffffffffffffffffffffffffffff16611695611899565b73ffffffffffffffffffffffffffffffffffffffff16146116eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e290614835565b60405180910390fd5b6116f56000613277565b565b6116ff6129b7565b73ffffffffffffffffffffffffffffffffffffffff1661171d611899565b73ffffffffffffffffffffffffffffffffffffffff1614611773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176a90614835565b60405180910390fd5b8060128190555050565b6117856129b7565b73ffffffffffffffffffffffffffffffffffffffff166117a3611899565b73ffffffffffffffffffffffffffffffffffffffff16146117f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f090614835565b60405180910390fd5b80600a8190555050565b61180b6129b7565b73ffffffffffffffffffffffffffffffffffffffff16611829611899565b73ffffffffffffffffffffffffffffffffffffffff161461187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614835565b60405180910390fd5b80600c9080519060200190611895929190613ba4565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60115481565b6060600380546118d890614c74565b80601f016020809104026020016040519081016040528092919081815260200182805461190490614c74565b80156119515780601f1061192657610100808354040283529160200191611951565b820191906000526020600020905b81548152906001019060200180831161193457829003601f168201915b5050505050905090565b8060008111801561196e57506011548111155b6119ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a4906147f5565b60405180910390fd5b601054816119b9610ff4565b6119c39190614a9f565b1115611a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fb906148b5565b60405180910390fd5b8180600f54611a139190614b26565b341015611a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4c90614915565b60405180910390fd5b601460009054906101000a900460ff1615611aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9c90614855565b60405180910390fd5b60125483601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611af39190614a9f565b1115611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b90614815565b60405180910390fd5b611b45611b3f6129b7565b8461333d565b82601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b949190614a9f565b92505081905550611ba361335b565b505050565b611bb06129b7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c15576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611c226129b7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ccf6129b7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d14919061475d565b60405180910390a35050565b611d286129b7565b73ffffffffffffffffffffffffffffffffffffffff16611d46611899565b73ffffffffffffffffffffffffffffffffffffffff1614611d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9390614835565b60405180910390fd5b8060118190555050565b611dae6129b7565b73ffffffffffffffffffffffffffffffffffffffff16611dcc611899565b73ffffffffffffffffffffffffffffffffffffffff1614611e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1990614835565b60405180910390fd5b80601460016101000a81548160ff02191690831515021790555050565b611e4a848484612b32565b611e698373ffffffffffffffffffffffffffffffffffffffff1661339f565b8015611e7e5750611e7c848484846133c2565b155b15611eb5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600e8054611ec890614c74565b80601f0160208091040260200160405190810160405280929190818152602001828054611ef490614c74565b8015611f415780601f10611f1657610100808354040283529160200191611f41565b820191906000526020600020905b815481529060010190602001808311611f2457829003601f168201915b505050505081565b60125481565b6060611f5a82612a29565b611f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9090614895565b60405180910390fd5b60001515601460029054906101000a900460ff161515141561204757600e8054611fc290614c74565b80601f0160208091040260200160405190810160405280929190818152602001828054611fee90614c74565b801561203b5780601f106120105761010080835404028352916020019161203b565b820191906000526020600020905b81548152906001019060200180831161201e57829003601f168201915b505050505090506120a3565b6000612051613522565b90506000815111612071576040518060200160405280600081525061209f565b8061207b846135b4565b600d60405160200161208f9392919061468e565b6040516020818303038152906040525b9150505b919050565b60156020528060005260406000206000915090505481565b6120c86129b7565b73ffffffffffffffffffffffffffffffffffffffff166120e6611899565b73ffffffffffffffffffffffffffffffffffffffff161461213c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213390614835565b60405180910390fd5b600081511180156121505750601154815111155b61218f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612186906147f5565b60405180910390fd5b601054815161219c610ff4565b6121a69190614a9f565b11156121e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121de906148b5565b60405180910390fd5b60005b81518110156122335761221882828151811061220957612208614e02565b5b6020026020010151600161333d565b61222061335b565b808061222b90614cd7565b9150506121ea565b5050565b8260008111801561224a57506011548111155b612289576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612280906147f5565b60405180910390fd5b60105481612295610ff4565b61229f9190614a9f565b11156122e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d7906148b5565b60405180910390fd5b8380600f546122ef9190614b26565b341015612331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232890614915565b60405180910390fd5b601460019054906101000a900460ff16612380576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612377906148d5565b60405180910390fd5b600b600061238c6129b7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240b90614875565b60405180910390fd5b60125485601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546124629190614a9f565b11156124a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249a90614815565b60405180910390fd5b60006124ad6129b7565b6040516020016124bd9190614673565b604051602081830303815290604052805190602001209050612523858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5483613715565b612562576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612559906147b5565b60405180910390fd5b6001600b60006125706129b7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506125d26125cc6129b7565b8761333d565b85601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126219190614a9f565b92505081905550505050505050565b60105481565b600b6020528060005260406000206000915054906101000a900460ff1681565b61265e6129b7565b73ffffffffffffffffffffffffffffffffffffffff1661267c611899565b73ffffffffffffffffffffffffffffffffffffffff16146126d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c990614835565b60405180910390fd5b80601460026101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8160008111801561279657506011548111155b6127d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127cc906147f5565b60405180910390fd5b601054816127e1610ff4565b6127eb9190614a9f565b111561282c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612823906148b5565b60405180910390fd5b6128346129b7565b73ffffffffffffffffffffffffffffffffffffffff16612852611899565b73ffffffffffffffffffffffffffffffffffffffff16146128a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289f90614835565b60405180910390fd5b6128b2828461333d565b6128ba61335b565b505050565b6128c76129b7565b73ffffffffffffffffffffffffffffffffffffffff166128e5611899565b73ffffffffffffffffffffffffffffffffffffffff161461293b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293290614835565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156129ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a2906147d5565b60405180910390fd5b6129b481613277565b50565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081612a34612b29565b11158015612a43575060005482105b8015612a70575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000612b3d82612fe8565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ba8576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612bc96129b7565b73ffffffffffffffffffffffffffffffffffffffff161480612bf85750612bf785612bf26129b7565b6126ef565b5b80612c3d5750612c066129b7565b73ffffffffffffffffffffffffffffffffffffffff16612c2584610ca2565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612c76576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612cdd576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cea858585600161372c565b612cf660008487612a77565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612f76576000548214612f7557878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612fe18585856001613732565b5050505050565b612ff0613c2a565b600082905080612ffe612b29565b1115801561300d575060005481105b15613240576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161323e57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613122578092505050613272565b5b60011561323d57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613238578092505050613272565b613123565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613357828260405180602001604052806000815250613738565b5050565b601354613366610ff4565b1061339d576001601460006101000a81548160ff0219169083151502179055506013546013546133969190614a9f565b6013819055505b565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133e86129b7565b8786866040518563ffffffff1660e01b815260040161340a94939291906146ef565b602060405180830381600087803b15801561342457600080fd5b505af192505050801561345557506040513d601f19601f82011682018060405250810190613452919061416f565b60015b6134cf573d8060008114613485576040519150601f19603f3d011682016040523d82523d6000602084013e61348a565b606091505b506000815114156134c7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c805461353190614c74565b80601f016020809104026020016040519081016040528092919081815260200182805461355d90614c74565b80156135aa5780601f1061357f576101008083540402835291602001916135aa565b820191906000526020600020905b81548152906001019060200180831161358d57829003601f168201915b5050505050905090565b606060008214156135fc576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613710565b600082905060005b6000821461362e57808061361790614cd7565b915050600a826136279190614af5565b9150613604565b60008167ffffffffffffffff81111561364a57613649614e31565b5b6040519080825280601f01601f19166020018201604052801561367c5781602001600182028036833780820191505090505b5090505b60008514613709576001826136959190614b80565b9150600a856136a49190614d44565b60306136b09190614a9f565b60f81b8183815181106136c6576136c5614e02565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856137029190614af5565b9450613680565b8093505050505b919050565b600082613722858461374a565b1490509392505050565b50505050565b50505050565b61374583838360016137bf565b505050565b60008082905060005b84518110156137b457600085828151811061377157613770614e02565b5b602002602001015190508083116137935761378c8382613b8d565b92506137a0565b61379d8184613b8d565b92505b5080806137ac90614cd7565b915050613753565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561382c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613867576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613874600086838761372c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015613a3e5750613a3d8773ffffffffffffffffffffffffffffffffffffffff1661339f565b5b15613b04575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613ab360008884806001019550886133c2565b613ae9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415613a44578260005414613aff57600080fd5b613b70565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613b05575b816000819055505050613b866000868387613732565b5050505050565b600082600052816020526040600020905092915050565b828054613bb090614c74565b90600052602060002090601f016020900481019282613bd25760008555613c19565b82601f10613beb57805160ff1916838001178555613c19565b82800160010185558215613c19579182015b82811115613c18578251825591602001919060010190613bfd565b5b509050613c269190613c6d565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613c86576000816000905550600101613c6e565b5090565b6000613c9d613c9884614975565b614950565b90508083825260208201905082856020860282011115613cc057613cbf614e6a565b5b60005b85811015613cf05781613cd68882613d7e565b845260208401935060208301925050600181019050613cc3565b5050509392505050565b6000613d0d613d08846149a1565b614950565b905082815260208101848484011115613d2957613d28614e6f565b5b613d34848285614c32565b509392505050565b6000613d4f613d4a846149d2565b614950565b905082815260208101848484011115613d6b57613d6a614e6f565b5b613d76848285614c32565b509392505050565b600081359050613d8d816150fd565b92915050565b600082601f830112613da857613da7614e65565b5b8135613db8848260208601613c8a565b91505092915050565b60008083601f840112613dd757613dd6614e65565b5b8235905067ffffffffffffffff811115613df457613df3614e60565b5b602083019150836020820283011115613e1057613e0f614e6a565b5b9250929050565b600081359050613e2681615114565b92915050565b600081359050613e3b8161512b565b92915050565b600081359050613e5081615142565b92915050565b600081519050613e6581615142565b92915050565b600082601f830112613e8057613e7f614e65565b5b8135613e90848260208601613cfa565b91505092915050565b600082601f830112613eae57613ead614e65565b5b8135613ebe848260208601613d3c565b91505092915050565b600081359050613ed681615159565b92915050565b600060208284031215613ef257613ef1614e79565b5b6000613f0084828501613d7e565b91505092915050565b60008060408385031215613f2057613f1f614e79565b5b6000613f2e85828601613d7e565b9250506020613f3f85828601613d7e565b9150509250929050565b600080600060608486031215613f6257613f61614e79565b5b6000613f7086828701613d7e565b9350506020613f8186828701613d7e565b9250506040613f9286828701613ec7565b9150509250925092565b60008060008060808587031215613fb657613fb5614e79565b5b6000613fc487828801613d7e565b9450506020613fd587828801613d7e565b9350506040613fe687828801613ec7565b925050606085013567ffffffffffffffff81111561400757614006614e74565b5b61401387828801613e6b565b91505092959194509250565b6000806040838503121561403657614035614e79565b5b600061404485828601613d7e565b925050602061405585828601613e17565b9150509250929050565b6000806040838503121561407657614075614e79565b5b600061408485828601613d7e565b925050602061409585828601613ec7565b9150509250929050565b6000602082840312156140b5576140b4614e79565b5b600082013567ffffffffffffffff8111156140d3576140d2614e74565b5b6140df84828501613d93565b91505092915050565b6000602082840312156140fe576140fd614e79565b5b600061410c84828501613e17565b91505092915050565b60006020828403121561412b5761412a614e79565b5b600061413984828501613e2c565b91505092915050565b60006020828403121561415857614157614e79565b5b600061416684828501613e41565b91505092915050565b60006020828403121561418557614184614e79565b5b600061419384828501613e56565b91505092915050565b6000602082840312156141b2576141b1614e79565b5b600082013567ffffffffffffffff8111156141d0576141cf614e74565b5b6141dc84828501613e99565b91505092915050565b6000602082840312156141fb576141fa614e79565b5b600061420984828501613ec7565b91505092915050565b6000806040838503121561422957614228614e79565b5b600061423785828601613ec7565b925050602061424885828601613d7e565b9150509250929050565b60008060006040848603121561426b5761426a614e79565b5b600061427986828701613ec7565b935050602084013567ffffffffffffffff81111561429a57614299614e74565b5b6142a686828701613dc1565b92509250509250925092565b60006142be8383614655565b60208301905092915050565b6142d381614bb4565b82525050565b6142ea6142e582614bb4565b614d20565b82525050565b60006142fb82614a28565b6143058185614a56565b935061431083614a03565b8060005b8381101561434157815161432888826142b2565b975061433383614a49565b925050600181019050614314565b5085935050505092915050565b61435781614bc6565b82525050565b61436681614bd2565b82525050565b600061437782614a33565b6143818185614a67565b9350614391818560208601614c41565b61439a81614e7e565b840191505092915050565b60006143b082614a3e565b6143ba8185614a83565b93506143ca818560208601614c41565b6143d381614e7e565b840191505092915050565b60006143e982614a3e565b6143f38185614a94565b9350614403818560208601614c41565b80840191505092915050565b6000815461441c81614c74565b6144268186614a94565b94506001821660008114614441576001811461445257614485565b60ff19831686528186019350614485565b61445b85614a13565b60005b8381101561447d5781548189015260018201915060208101905061445e565b838801955050505b50505092915050565b600061449b600e83614a83565b91506144a682614e9c565b602082019050919050565b60006144be602683614a83565b91506144c982614ec5565b604082019050919050565b60006144e1601483614a83565b91506144ec82614f14565b602082019050919050565b6000614504600f83614a83565b915061450f82614f3d565b602082019050919050565b6000614527602083614a83565b915061453282614f66565b602082019050919050565b600061454a601783614a83565b915061455582614f8f565b602082019050919050565b600061456d601883614a83565b915061457882614fb8565b602082019050919050565b6000614590602f83614a83565b915061459b82614fe1565b604082019050919050565b60006145b3600083614a78565b91506145be82615030565b600082019050919050565b60006145d6601483614a83565b91506145e182615033565b602082019050919050565b60006145f9602283614a83565b91506146048261505c565b604082019050919050565b600061461c601f83614a83565b9150614627826150ab565b602082019050919050565b600061463f601383614a83565b915061464a826150d4565b602082019050919050565b61465e81614c28565b82525050565b61466d81614c28565b82525050565b600061467f82846142d9565b60148201915081905092915050565b600061469a82866143de565b91506146a682856143de565b91506146b2828461440f565b9150819050949350505050565b60006146ca826145a6565b9150819050919050565b60006020820190506146e960008301846142ca565b92915050565b600060808201905061470460008301876142ca565b61471160208301866142ca565b61471e6040830185614664565b8181036060830152614730818461436c565b905095945050505050565b6000602082019050818103600083015261475581846142f0565b905092915050565b6000602082019050614772600083018461434e565b92915050565b600060208201905061478d600083018461435d565b92915050565b600060208201905081810360008301526147ad81846143a5565b905092915050565b600060208201905081810360008301526147ce8161448e565b9050919050565b600060208201905081810360008301526147ee816144b1565b9050919050565b6000602082019050818103600083015261480e816144d4565b9050919050565b6000602082019050818103600083015261482e816144f7565b9050919050565b6000602082019050818103600083015261484e8161451a565b9050919050565b6000602082019050818103600083015261486e8161453d565b9050919050565b6000602082019050818103600083015261488e81614560565b9050919050565b600060208201905081810360008301526148ae81614583565b9050919050565b600060208201905081810360008301526148ce816145c9565b9050919050565b600060208201905081810360008301526148ee816145ec565b9050919050565b6000602082019050818103600083015261490e8161460f565b9050919050565b6000602082019050818103600083015261492e81614632565b9050919050565b600060208201905061494a6000830184614664565b92915050565b600061495a61496b565b90506149668282614ca6565b919050565b6000604051905090565b600067ffffffffffffffff8211156149905761498f614e31565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156149bc576149bb614e31565b5b6149c582614e7e565b9050602081019050919050565b600067ffffffffffffffff8211156149ed576149ec614e31565b5b6149f682614e7e565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614aaa82614c28565b9150614ab583614c28565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614aea57614ae9614d75565b5b828201905092915050565b6000614b0082614c28565b9150614b0b83614c28565b925082614b1b57614b1a614da4565b5b828204905092915050565b6000614b3182614c28565b9150614b3c83614c28565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b7557614b74614d75565b5b828202905092915050565b6000614b8b82614c28565b9150614b9683614c28565b925082821015614ba957614ba8614d75565b5b828203905092915050565b6000614bbf82614c08565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c5f578082015181840152602081019050614c44565b83811115614c6e576000848401525b50505050565b60006002820490506001821680614c8c57607f821691505b60208210811415614ca057614c9f614dd3565b5b50919050565b614caf82614e7e565b810181811067ffffffffffffffff82111715614cce57614ccd614e31565b5b80604052505050565b6000614ce282614c28565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d1557614d14614d75565b5b600182019050919050565b6000614d2b82614d32565b9050919050565b6000614d3d82614e8f565b9050919050565b6000614d4f82614c28565b9150614d5a83614c28565b925082614d6a57614d69614da4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f4d6178204e465473206d696e7465640000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4164647265737320616c726561647920636c61696d6564210000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f5468652077686974656c6973742073616c65206973206e6f7420656e61626c6560008201527f6421000000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b61510681614bb4565b811461511157600080fd5b50565b61511d81614bc6565b811461512857600080fd5b50565b61513481614bd2565b811461513f57600080fd5b50565b61514b81614bdc565b811461515657600080fd5b50565b61516281614c28565b811461516d57600080fd5b5056fea26469706673582212202ae601f77d21aac6c9dfa98d606d3eca03aed1913dffaf2225129a4eaab2ad9964736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000007d00000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000013546865204e69676874205761746368204e46540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024d520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f6261667962656963366b69723732687a63716773366534786678737962696e61746a67666977357671676b7a74656e716f646a67653433783477612f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f6261667962656963366b69723732687a63716773366534786678737962696e61746a67666977357671676b7a74656e716f646a67653433783477612f0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _tokenName (string): The Night Watch NFT
Arg [1] : _tokenSymbol (string): MR
Arg [2] : _cost (uint256): 10000000000000
Arg [3] : _pauseMint (uint256): 2000
Arg [4] : _maxSupply (uint256): 8000
Arg [5] : _maxMintAmountPerTx (uint256): 3
Arg [6] : _uriPrefix (string): ipfs://bafybeic6kir72hzcqgs6e4xfxsybinatjgfiw5vqgkztenqodjge43x4wa/
Arg [7] : _hiddenMetadataURI (string): ipfs://bafybeic6kir72hzcqgs6e4xfxsybinatjgfiw5vqgkztenqodjge43x4wa/

-----Encoded View---------------
20 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [2] : 000000000000000000000000000000000000000000000000000009184e72a000
Arg [3] : 00000000000000000000000000000000000000000000000000000000000007d0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000001f40
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000200
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000013
Arg [9] : 546865204e69676874205761746368204e465400000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [11] : 4d52000000000000000000000000000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [13] : 697066733a2f2f6261667962656963366b69723732687a637167733665347866
Arg [14] : 78737962696e61746a67666977357671676b7a74656e716f646a676534337834
Arg [15] : 77612f0000000000000000000000000000000000000000000000000000000000
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [17] : 697066733a2f2f6261667962656963366b69723732687a637167733665347866
Arg [18] : 78737962696e61746a67666977357671676b7a74656e716f646a676534337834
Arg [19] : 77612f0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

51361:7515:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57221:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32942:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36137:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37737:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37300:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57876:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51664:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58159:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58273:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32191:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38725:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51465:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58595:160;;;;;;;;;;;;;:::i;:::-;;38966:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55256:934;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57133:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51928:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51584:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51848:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51554:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35945:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51881:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33361:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10024:103;;;;;;;;;;;;;:::i;:::-;;57693:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58364:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58045:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9373:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51721:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36306:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53986:502;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38054:319;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57526:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58476:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39222:406;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51624:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51761:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56307:723;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51964:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54723:525;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53073:905;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51690:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51497:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57038:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38444:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54496:219;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10282:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57221:99;9604:12;:10;:12::i;:::-;9593:23;;:7;:5;:7::i;:::-;:23;;;9585:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57305:7:::1;57288:14;:24;;;;57221:99:::0;:::o;32942:355::-;33089:4;33146:25;33131:40;;;:11;:40;;;;:105;;;;33203:33;33188:48;;;:11;:48;;;;33131:105;:158;;;;33253:36;33277:11;33253:23;:36::i;:::-;33131:158;33111:178;;32942:355;;;:::o;36137:100::-;36191:13;36224:5;36217:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36137:100;:::o;37737:245::-;37841:7;37871:16;37879:7;37871;:16::i;:::-;37866:64;;37896:34;;;;;;;;;;;;;;37866:64;37950:15;:24;37966:7;37950:24;;;;;;;;;;;;;;;;;;;;;37943:31;;37737:245;;;:::o;37300:371::-;37373:13;37389:24;37405:7;37389:15;:24::i;:::-;37373:40;;37434:5;37428:11;;:2;:11;;;37424:48;;;37448:24;;;;;;;;;;;;;;37424:48;37505:5;37489:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;37515:37;37532:5;37539:12;:10;:12::i;:::-;37515:16;:37::i;:::-;37514:38;37489:63;37485:138;;;37576:35;;;;;;;;;;;;;;37485:138;37635:28;37644:2;37648:7;37657:5;37635:8;:28::i;:::-;37362:309;37300:371;;:::o;57876:161::-;9604:12;:10;:12::i;:::-;9593:23;;:7;:5;:7::i;:::-;:23;;;9585:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58011:18:::1;57991:17;:38;;;;;;;;;;;;:::i;:::-;;57876:161:::0;:::o;51664:19::-;;;;:::o;58159:106::-;9604:12;:10;:12::i;:::-;9593:23;;:7;:5;:7::i;:::-;:23;;;9585:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58247:10:::1;58235:9;:22;;;;;;;;;;;;:::i;:::-;;58159:106:::0;:::o;58273:83::-;9604:12;:10;:12::i;:::-;9593:23;;:7;:5;:7::i;:::-;:23;;;9585:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58342:6:::1;58333;;:15;;;;;;;;;;;;;;;;;;58273:83:::0;:::o;32191:303::-;32235:7;32460:15;:13;:15::i;:::-;32445:12;;32429:13;;:28;:46;32422:53;;32191:303;:::o;38725:170::-;38859:28;38869:4;38875:2;38879:7;38859:9;:28::i;:::-;38725:170;;;:::o;51465:25::-;;;;:::o;58595:160::-;9604:12;:10;:12::i;:::-;9593:23;;:7;:5;:7::i;:::-;:23;;;9585:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1847:1:::1;2445:7;;:19;;2437:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1847:1;2578:7;:18;;;;58657:7:::2;58678;:5;:7::i;:::-;58670:21;;58699;58670:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58656:69;;;58744:2;58736:11;;;::::0;::::2;;58645:110;1803:1:::1;2757:7;:22;;;;58595:160::o:0;38966:185::-;39104:39;39121:4;39127:2;39131:7;39104:39;;;;;;;;;;;;:16;:39::i;:::-;38966:185;;;:::o;55256:934::-;55343:16;55377:23;55403:17;55413:6;55403:9;:17::i;:::-;55377:43;;55431:30;55478:15;55464:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55431:63;;55505:22;55530:15;:13;:15::i;:::-;55505:40;;55556:23;55594:26;55631:521;55670:15;55652;:33;:64;;;;;55707:9;;55689:14;:27;;55652:64;55631:521;;;55743:31;55777:11;:27;55789:14;55777:27;;;;;;;;;;;55743:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55824:9;:16;;;55823:17;:49;;;;;55870:1;55844:28;;:9;:14;;;:28;;;;55823:49;55819:125;;;55914:9;:14;;;55893:35;;55819:125;55984:6;55962:28;;:18;:28;;;55958:152;;;56044:14;56011:13;56025:15;56011:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;56077:17;;;;;:::i;:::-;;;;55958:152;56124:16;;;;;:::i;:::-;;;;55728:424;55631:521;;;56169:13;56162:20;;;;;;;55256:934;;;:::o;57133:80::-;9604:12;:10;:12::i;:::-;9593:23;;:7;:5;:7::i;:::-;:23;;;9585:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57200:5:::1;57193:4;:12;;;;57133:80:::0;:::o;51928:27::-;;;;;;;;;;;;;:::o;51584:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51848:26::-;;;;;;;;;;;;;:::o;51554:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35945:125::-;36009:7;36036:21;36049:7;36036:12;:21::i;:::-;:26;;;36029:33;;35945:125;;;:::o;51881:40::-;;;;;;;;;;;;;:::o;33361:206::-;33425:7;33466:1;33449:19;;:5;:19;;;33445:60;;;33477:28;;;;;;;;;;;;;;33445:60;33531:12;:19;33544:5;33531:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;33523:36;;33516:43;;33361:206;;;:::o;10024:103::-;9604:12;:10;:12::i;:::-;9593:23;;:7;:5;:7::i;:::-;:23;;;9585:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10089:30:::1;10116:1;10089:18;:30::i;:::-;10024:103::o:0;57693:175::-;9604:12;:10;:12::i;:::-;9593:23;;:7;:5;:7::i;:::-;:23;;;9585:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57837:23:::1;57812:22;:48;;;;57693:175:::0;:::o;58364:104::-;9604:12;:10;:12::i;:::-;9593:23;;:7;:5;:7::i;:::-;:23;;;9585:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58449:11:::1;58436:10;:24;;;;58364:104:::0;:::o;58045:106::-;9604:12;:10;:12::i;:::-;9593:23;;:7;:5;:7::i;:::-;:23;;;9585:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58133:10:::1;58121:9;:22;;;;;;;;;;;;:::i;:::-;;58045:106:::0;:::o;9373:87::-;9419:7;9446:6;;;;;;;;;;;9439:13;;9373:87;:::o;51721:33::-;;;;:::o;36306:104::-;36362:13;36395:7;36388:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36306:104;:::o;53986:502::-;54078:11;52688:1;52674:11;:15;:52;;;;;52708:18;;52693:11;:33;;52674:52;52652:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;52838:9;;52823:11;52807:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;52785:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;54120:11:::1;53010;53003:4;;:18;;;;:::i;:::-;52990:9;:31;;52982:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;54158:6:::2;;;;;;;;;;;54157:7;54149:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;54289:22;;54257:11;54225:17;:29;54243:10;54225:29;;;;;;;;;;;;;;;;:43;;;;:::i;:::-;:86;;54203:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;54365:36;54375:12;:10;:12::i;:::-;54389:11;54365:9;:36::i;:::-;54445:11;54412:17;:29;54430:10;54412:29;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;54467:13;:11;:13::i;:::-;52906:1:::1;53986:502:::0;;:::o;38054:319::-;38197:12;:10;:12::i;:::-;38185:24;;:8;:24;;;38181:54;;;38218:17;;;;;;;;;;;;;;38181:54;38293:8;38248:18;:32;38267:12;:10;:12::i;:::-;38248:32;;;;;;;;;;;;;;;:42;38281:8;38248:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;38346:8;38317:48;;38332:12;:10;:12::i;:::-;38317:48;;;38356:8;38317:48;;;;;;:::i;:::-;;;;;;;;38054:319;;:::o;57526:159::-;9604:12;:10;:12::i;:::-;9593:23;;:7;:5;:7::i;:::-;:23;;;9585:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57658:19:::1;57637:18;:40;;;;57526:159:::0;:::o;58476:111::-;9604:12;:10;:12::i;:::-;9593:23;;:7;:5;:7::i;:::-;:23;;;9585:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58573:6:::1;58550:20;;:29;;;;;;;;;;;;;;;;;;58476:111:::0;:::o;39222:406::-;39389:28;39399:4;39405:2;39409:7;39389:9;:28::i;:::-;39446:15;:2;:13;;;:15::i;:::-;:89;;;;;39479:56;39510:4;39516:2;39520:7;39529:5;39479:30;:56::i;:::-;39478:57;39446:89;39428:193;;;39569:40;;;;;;;;;;;;;;39428:193;39222:406;;;;:::o;51624:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51761:41::-;;;;:::o;56307:723::-;56426:13;56479:17;56487:8;56479:7;:17::i;:::-;56457:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;56598:5;56586:17;;:8;;;;;;;;;;;:17;;;56582:74;;;56627:17;56620:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56582:74;56666:28;56697:10;:8;:10::i;:::-;56666:41;;56769:1;56744:14;56738:28;:32;:284;;;;;;;;;;;;;;;;;56862:14;56903:19;:8;:17;:19::i;:::-;56949:9;56819:162;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56738:284;56718:304;;;56307:723;;;;:::o;51964:52::-;;;;;;;;;;;;;;;;;:::o;54723:525::-;9604:12;:10;:12::i;:::-;9593:23;;:7;:5;:7::i;:::-;:23;;;9585:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54879:1:::1;54859:10;:17;:21;:64;;;;;54905:18;;54884:10;:17;:39;;54859:64;54837:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;55041:9;;55020:10;:17;55004:13;:11;:13::i;:::-;:33;;;;:::i;:::-;:46;;54982:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;55116:9;55111:130;55135:10;:17;55131:1;:21;55111:130;;;55174:27;55184:10;55195:1;55184:13;;;;;;;;:::i;:::-;;;;;;;;55199:1;55174:9;:27::i;:::-;55216:13;:11;:13::i;:::-;55154:3;;;;;:::i;:::-;;;;55111:130;;;;54723:525:::0;:::o;53073:905::-;53207:11;52688:1;52674:11;:15;:52;;;;;52708:18;;52693:11;:33;;52674:52;52652:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;52838:9;;52823:11;52807:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;52785:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;53249:11:::1;53010;53003:4;;:18;;;;:::i;:::-;52990:9;:31;;52982:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;53328:20:::2;;;;;;;;;;;53320:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;53407:16;:30;53424:12;:10;:12::i;:::-;53407:30;;;;;;;;;;;;;;;;;;;;;;;;;53406:31;53398:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53563:22;;53531:11;53499:17;:29;53517:10;53499:29;;;;;;;;;;;;;;;;:43;;;;:::i;:::-;:86;;53477:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;53639:12;53681;:10;:12::i;:::-;53664:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;53654:41;;;;;;53639:56;;53728:50;53747:12;;53728:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53761:10;;53773:4;53728:18;:50::i;:::-;53706:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;53864:4;53831:16;:30;53848:12;:10;:12::i;:::-;53831:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;53879:36;53889:12;:10;:12::i;:::-;53903:11;53879:9;:36::i;:::-;53959:11;53926:17;:29;53944:10;53926:29;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;53267:711;52906:1:::1;53073:905:::0;;;;:::o;51690:24::-;;;;:::o;51497:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;57038:87::-;9604:12;:10;:12::i;:::-;9593:23;;:7;:5;:7::i;:::-;:23;;;9585:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57111:6:::1;57100:8;;:17;;;;;;;;;;;;;;;;;;57038:87:::0;:::o;38444:214::-;38586:4;38615:18;:25;38634:5;38615:25;;;;;;;;;;;;;;;:35;38641:8;38615:35;;;;;;;;;;;;;;;;;;;;;;;;;38608:42;;38444:214;;;;:::o;54496:219::-;54600:11;52688:1;52674:11;:15;:52;;;;;52708:18;;52693:11;:33;;52674:52;52652:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;52838:9;;52823:11;52807:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;52785:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;9604:12:::1;:10;:12::i;:::-;9593:23;;:7;:5;:7::i;:::-;:23;;;9585:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54648:33:::2;54658:9;54669:11;54648:9;:33::i;:::-;54694:13;:11;:13::i;:::-;54496:219:::0;;;:::o;10282:238::-;9604:12;:10;:12::i;:::-;9593:23;;:7;:5;:7::i;:::-;:23;;;9585:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10405:1:::1;10385:22;;:8;:22;;;;10363:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;10484:28;10503:8;10484:18;:28::i;:::-;10282:238:::0;:::o;8076:98::-;8129:7;8156:10;8149:17;;8076:98;:::o;22651:207::-;22781:4;22825:25;22810:40;;;:11;:40;;;;22803:47;;22651:207;;;:::o;39883:213::-;39940:4;39996:7;39977:15;:13;:15::i;:::-;:26;;:66;;;;;40030:13;;40020:7;:23;39977:66;:111;;;;;40061:11;:20;40073:7;40061:20;;;;;;;;;;;:27;;;;;;;;;;;;40060:28;39977:111;39957:131;;39883:213;;;:::o;48270:196::-;48412:2;48385:15;:24;48401:7;48385:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;48450:7;48446:2;48430:28;;48439:5;48430:28;;;;;;;;;;;;48270:196;;;:::o;56198:101::-;56263:7;56290:1;56283:8;;56198:101;:::o;43213:2130::-;43328:35;43366:21;43379:7;43366:12;:21::i;:::-;43328:59;;43426:4;43404:26;;:13;:18;;;:26;;;43400:67;;43439:28;;;;;;;;;;;;;;43400:67;43480:22;43522:4;43506:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;43543:36;43560:4;43566:12;:10;:12::i;:::-;43543:16;:36::i;:::-;43506:73;:126;;;;43620:12;:10;:12::i;:::-;43596:36;;:20;43608:7;43596:11;:20::i;:::-;:36;;;43506:126;43480:153;;43651:17;43646:66;;43677:35;;;;;;;;;;;;;;43646:66;43741:1;43727:16;;:2;:16;;;43723:52;;;43752:23;;;;;;;;;;;;;;43723:52;43788:43;43810:4;43816:2;43820:7;43829:1;43788:21;:43::i;:::-;43896:35;43913:1;43917:7;43926:4;43896:8;:35::i;:::-;44257:1;44227:12;:18;44240:4;44227:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44301:1;44273:12;:16;44286:2;44273:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44319:31;44353:11;:20;44365:7;44353:20;;;;;;;;;;;44319:54;;44404:2;44388:8;:13;;;:18;;;;;;;;;;;;;;;;;;44454:15;44421:8;:23;;;:49;;;;;;;;;;;;;;;;;;44722:19;44754:1;44744:7;:11;44722:33;;44770:31;44804:11;:24;44816:11;44804:24;;;;;;;;;;;44770:58;;44872:1;44847:27;;:8;:13;;;;;;;;;;;;:27;;;44843:384;;;45057:13;;45042:11;:28;45038:174;;45111:4;45095:8;:13;;;:20;;;;;;;;;;;;;;;;;;45164:13;:28;;;45138:8;:23;;;:54;;;;;;;;;;;;;;;;;;45038:174;44843:384;44202:1036;;;45274:7;45270:2;45255:27;;45264:4;45255:27;;;;;;;;;;;;45293:42;45314:4;45320:2;45324:7;45333:1;45293:20;:42::i;:::-;43317:2026;;43213:2130;;;:::o;34742:1141::-;34831:21;;:::i;:::-;34870:12;34885:7;34870:22;;34953:4;34934:15;:13;:15::i;:::-;:23;;:47;;;;;34968:13;;34961:4;:20;34934:47;34930:886;;;35002:31;35036:11;:17;35048:4;35036:17;;;;;;;;;;;35002:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35077:9;:16;;;35072:729;;35148:1;35122:28;;:9;:14;;;:28;;;35118:101;;35186:9;35179:16;;;;;;35118:101;35521:261;35528:4;35521:261;;;35561:6;;;;;;;;35606:11;:17;35618:4;35606:17;;;;;;;;;;;35594:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35680:1;35654:28;;:9;:14;;;:28;;;35650:109;;35722:9;35715:16;;;;;;35650:109;35521:261;;;35072:729;34983:833;34930:886;35844:31;;;;;;;;;;;;;;34742:1141;;;;:::o;10680:191::-;10754:16;10773:6;;;;;;;;;;;10754:25;;10799:8;10790:6;;:17;;;;;;;;;;;;;;;;;;10854:8;10823:40;;10844:8;10823:40;;;;;;;;;;;;10743:128;10680:191;:::o;40104:104::-;40173:27;40183:2;40187:8;40173:27;;;;;;;;;;;;:9;:27::i;:::-;40104:104;;:::o;57328:190::-;57392:14;;57375:13;:11;:13::i;:::-;:31;57371:140;;57432:4;57423:6;;:13;;;;;;;;;;;;;;;;;;57485:14;;57468;;:31;;;;:::i;:::-;57451:14;:48;;;;57371:140;57328:190::o;12109:326::-;12169:4;12426:1;12404:7;:19;;;:23;12397:30;;12109:326;;;:::o;48958:772::-;49121:4;49171:2;49155:36;;;49210:12;:10;:12::i;:::-;49241:4;49264:7;49290:5;49155:155;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;49138:585;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49498:1;49481:6;:13;:18;49477:235;;;49527:40;;;;;;;;;;;;;;49477:235;49670:6;49664:13;49655:6;49651:2;49647:15;49640:38;49138:585;49376:45;;;49366:55;;;:6;:55;;;;49359:62;;;48958:772;;;;;;:::o;58763:110::-;58823:13;58856:9;58849:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58763:110;:::o;5608:723::-;5664:13;5894:1;5885:5;:10;5881:53;;;5912:10;;;;;;;;;;;;;;;;;;;;;5881:53;5944:12;5959:5;5944:20;;5975:14;6000:78;6015:1;6007:4;:9;6000:78;;6033:8;;;;;:::i;:::-;;;;6064:2;6056:10;;;;;:::i;:::-;;;6000:78;;;6088:19;6120:6;6110:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6088:39;;6138:154;6154:1;6145:5;:10;6138:154;;6182:1;6172:11;;;;;:::i;:::-;;;6249:2;6241:5;:10;;;;:::i;:::-;6228:2;:24;;;;:::i;:::-;6215:39;;6198:6;6205;6198:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;6278:2;6269:11;;;;;:::i;:::-;;;6138:154;;;6316:6;6302:21;;;;;5608:723;;;;:::o;3715:190::-;3840:4;3893;3864:25;3877:5;3884:4;3864:12;:25::i;:::-;:33;3857:40;;3715:190;;;;;:::o;50378:159::-;;;;;:::o;51196:158::-;;;;;:::o;40571:163::-;40694:32;40700:2;40704:8;40714:5;40721:4;40694:5;:32::i;:::-;40571:163;;;:::o;4267:707::-;4377:7;4402:20;4425:4;4402:27;;4445:9;4440:497;4464:5;:12;4460:1;:16;4440:497;;;4498:20;4521:5;4527:1;4521:8;;;;;;;;:::i;:::-;;;;;;;;4498:31;;4564:12;4548;:28;4544:382;;4691:42;4706:12;4720;4691:14;:42::i;:::-;4676:57;;4544:382;;;4868:42;4883:12;4897;4868:14;:42::i;:::-;4853:57;;4544:382;4483:454;4478:3;;;;;:::i;:::-;;;;4440:497;;;;4954:12;4947:19;;;4267:707;;;;:::o;40993:1966::-;41132:20;41155:13;;41132:36;;41197:1;41183:16;;:2;:16;;;41179:48;;;41208:19;;;;;;;;;;;;;;41179:48;41254:1;41242:8;:13;41238:44;;;41264:18;;;;;;;;;;;;;;41238:44;41295:61;41325:1;41329:2;41333:12;41347:8;41295:21;:61::i;:::-;41668:8;41633:12;:16;41646:2;41633:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41732:8;41692:12;:16;41705:2;41692:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41791:2;41758:11;:25;41770:12;41758:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;41858:15;41808:11;:25;41820:12;41808:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;41891:20;41914:12;41891:35;;41941:11;41970:8;41955:12;:23;41941:37;;41999:4;:23;;;;;42007:15;:2;:13;;;:15::i;:::-;41999:23;41995:832;;;42043:505;42099:12;42095:2;42074:38;;42091:1;42074:38;;;;;;;;;;;;42166:212;42235:1;42268:2;42301:14;;;;;;42346:5;42166:30;:212::i;:::-;42135:365;;42436:40;;;;;;;;;;;;;;42135:365;42543:3;42527:12;:19;;42043:505;;42629:12;42612:13;;:29;42608:43;;42643:8;;;42608:43;41995:832;;;42692:120;42748:14;;;;;;42744:2;42723:40;;42740:1;42723:40;;;;;;;;;;;;42807:3;42791:12;:19;;42692:120;;41995:832;42857:12;42841:13;:28;;;;41608:1273;;42891:60;42920:1;42924:2;42928:12;42942:8;42891:20;:60::i;:::-;41121:1838;40993:1966;;;;:::o;4982:256::-;5077:13;5145:1;5139:4;5132:15;5174:1;5168:4;5161:15;5215:4;5209;5199:21;5190:30;;4982:256;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2141:568::-;2214:8;2224:6;2274:3;2267:4;2259:6;2255:17;2251:27;2241:122;;2282:79;;:::i;:::-;2241:122;2395:6;2382:20;2372:30;;2425:18;2417:6;2414:30;2411:117;;;2447:79;;:::i;:::-;2411:117;2561:4;2553:6;2549:17;2537:29;;2615:3;2607:4;2599:6;2595:17;2585:8;2581:32;2578:41;2575:128;;;2622:79;;:::i;:::-;2575:128;2141:568;;;;;:::o;2715:133::-;2758:5;2796:6;2783:20;2774:29;;2812:30;2836:5;2812:30;:::i;:::-;2715:133;;;;:::o;2854:139::-;2900:5;2938:6;2925:20;2916:29;;2954:33;2981:5;2954:33;:::i;:::-;2854:139;;;;:::o;2999:137::-;3044:5;3082:6;3069:20;3060:29;;3098:32;3124:5;3098:32;:::i;:::-;2999:137;;;;:::o;3142:141::-;3198:5;3229:6;3223:13;3214:22;;3245:32;3271:5;3245:32;:::i;:::-;3142:141;;;;:::o;3302:338::-;3357:5;3406:3;3399:4;3391:6;3387:17;3383:27;3373:122;;3414:79;;:::i;:::-;3373:122;3531:6;3518:20;3556:78;3630:3;3622:6;3615:4;3607:6;3603:17;3556:78;:::i;:::-;3547:87;;3363:277;3302:338;;;;:::o;3660:340::-;3716:5;3765:3;3758:4;3750:6;3746:17;3742:27;3732:122;;3773:79;;:::i;:::-;3732:122;3890:6;3877:20;3915:79;3990:3;3982:6;3975:4;3967:6;3963:17;3915:79;:::i;:::-;3906:88;;3722:278;3660:340;;;;:::o;4006:139::-;4052:5;4090:6;4077:20;4068:29;;4106:33;4133:5;4106:33;:::i;:::-;4006:139;;;;:::o;4151:329::-;4210:6;4259:2;4247:9;4238:7;4234:23;4230:32;4227:119;;;4265:79;;:::i;:::-;4227:119;4385:1;4410:53;4455:7;4446:6;4435:9;4431:22;4410:53;:::i;:::-;4400:63;;4356:117;4151:329;;;;:::o;4486:474::-;4554:6;4562;4611:2;4599:9;4590:7;4586:23;4582:32;4579:119;;;4617:79;;:::i;:::-;4579:119;4737:1;4762:53;4807:7;4798:6;4787:9;4783:22;4762:53;:::i;:::-;4752:63;;4708:117;4864:2;4890:53;4935:7;4926:6;4915:9;4911:22;4890:53;:::i;:::-;4880:63;;4835:118;4486:474;;;;;:::o;4966:619::-;5043:6;5051;5059;5108:2;5096:9;5087:7;5083:23;5079:32;5076:119;;;5114:79;;:::i;:::-;5076:119;5234:1;5259:53;5304:7;5295:6;5284:9;5280:22;5259:53;:::i;:::-;5249:63;;5205:117;5361:2;5387:53;5432:7;5423:6;5412:9;5408:22;5387:53;:::i;:::-;5377:63;;5332:118;5489:2;5515:53;5560:7;5551:6;5540:9;5536:22;5515:53;:::i;:::-;5505:63;;5460:118;4966:619;;;;;:::o;5591:943::-;5686:6;5694;5702;5710;5759:3;5747:9;5738:7;5734:23;5730:33;5727:120;;;5766:79;;:::i;:::-;5727:120;5886:1;5911:53;5956:7;5947:6;5936:9;5932:22;5911:53;:::i;:::-;5901:63;;5857:117;6013:2;6039:53;6084:7;6075:6;6064:9;6060:22;6039:53;:::i;:::-;6029:63;;5984:118;6141:2;6167:53;6212:7;6203:6;6192:9;6188:22;6167:53;:::i;:::-;6157:63;;6112:118;6297:2;6286:9;6282:18;6269:32;6328:18;6320:6;6317:30;6314:117;;;6350:79;;:::i;:::-;6314:117;6455:62;6509:7;6500:6;6489:9;6485:22;6455:62;:::i;:::-;6445:72;;6240:287;5591:943;;;;;;;:::o;6540:468::-;6605:6;6613;6662:2;6650:9;6641:7;6637:23;6633:32;6630:119;;;6668:79;;:::i;:::-;6630:119;6788:1;6813:53;6858:7;6849:6;6838:9;6834:22;6813:53;:::i;:::-;6803:63;;6759:117;6915:2;6941:50;6983:7;6974:6;6963:9;6959:22;6941:50;:::i;:::-;6931:60;;6886:115;6540:468;;;;;:::o;7014:474::-;7082:6;7090;7139:2;7127:9;7118:7;7114:23;7110:32;7107:119;;;7145:79;;:::i;:::-;7107:119;7265:1;7290:53;7335:7;7326:6;7315:9;7311:22;7290:53;:::i;:::-;7280:63;;7236:117;7392:2;7418:53;7463:7;7454:6;7443:9;7439:22;7418:53;:::i;:::-;7408:63;;7363:118;7014:474;;;;;:::o;7494:539::-;7578:6;7627:2;7615:9;7606:7;7602:23;7598:32;7595:119;;;7633:79;;:::i;:::-;7595:119;7781:1;7770:9;7766:17;7753:31;7811:18;7803:6;7800:30;7797:117;;;7833:79;;:::i;:::-;7797:117;7938:78;8008:7;7999:6;7988:9;7984:22;7938:78;:::i;:::-;7928:88;;7724:302;7494:539;;;;:::o;8039:323::-;8095:6;8144:2;8132:9;8123:7;8119:23;8115:32;8112:119;;;8150:79;;:::i;:::-;8112:119;8270:1;8295:50;8337:7;8328:6;8317:9;8313:22;8295:50;:::i;:::-;8285:60;;8241:114;8039:323;;;;:::o;8368:329::-;8427:6;8476:2;8464:9;8455:7;8451:23;8447:32;8444:119;;;8482:79;;:::i;:::-;8444:119;8602:1;8627:53;8672:7;8663:6;8652:9;8648:22;8627:53;:::i;:::-;8617:63;;8573:117;8368:329;;;;:::o;8703:327::-;8761:6;8810:2;8798:9;8789:7;8785:23;8781:32;8778:119;;;8816:79;;:::i;:::-;8778:119;8936:1;8961:52;9005:7;8996:6;8985:9;8981:22;8961:52;:::i;:::-;8951:62;;8907:116;8703:327;;;;:::o;9036:349::-;9105:6;9154:2;9142:9;9133:7;9129:23;9125:32;9122:119;;;9160:79;;:::i;:::-;9122:119;9280:1;9305:63;9360:7;9351:6;9340:9;9336:22;9305:63;:::i;:::-;9295:73;;9251:127;9036:349;;;;:::o;9391:509::-;9460:6;9509:2;9497:9;9488:7;9484:23;9480:32;9477:119;;;9515:79;;:::i;:::-;9477:119;9663:1;9652:9;9648:17;9635:31;9693:18;9685:6;9682:30;9679:117;;;9715:79;;:::i;:::-;9679:117;9820:63;9875:7;9866:6;9855:9;9851:22;9820:63;:::i;:::-;9810:73;;9606:287;9391:509;;;;:::o;9906:329::-;9965:6;10014:2;10002:9;9993:7;9989:23;9985:32;9982:119;;;10020:79;;:::i;:::-;9982:119;10140:1;10165:53;10210:7;10201:6;10190:9;10186:22;10165:53;:::i;:::-;10155:63;;10111:117;9906:329;;;;:::o;10241:474::-;10309:6;10317;10366:2;10354:9;10345:7;10341:23;10337:32;10334:119;;;10372:79;;:::i;:::-;10334:119;10492:1;10517:53;10562:7;10553:6;10542:9;10538:22;10517:53;:::i;:::-;10507:63;;10463:117;10619:2;10645:53;10690:7;10681:6;10670:9;10666:22;10645:53;:::i;:::-;10635:63;;10590:118;10241:474;;;;;:::o;10721:704::-;10816:6;10824;10832;10881:2;10869:9;10860:7;10856:23;10852:32;10849:119;;;10887:79;;:::i;:::-;10849:119;11007:1;11032:53;11077:7;11068:6;11057:9;11053:22;11032:53;:::i;:::-;11022:63;;10978:117;11162:2;11151:9;11147:18;11134:32;11193:18;11185:6;11182:30;11179:117;;;11215:79;;:::i;:::-;11179:117;11328:80;11400:7;11391:6;11380:9;11376:22;11328:80;:::i;:::-;11310:98;;;;11105:313;10721:704;;;;;:::o;11431:179::-;11500:10;11521:46;11563:3;11555:6;11521:46;:::i;:::-;11599:4;11594:3;11590:14;11576:28;;11431:179;;;;:::o;11616:118::-;11703:24;11721:5;11703:24;:::i;:::-;11698:3;11691:37;11616:118;;:::o;11740:157::-;11845:45;11865:24;11883:5;11865:24;:::i;:::-;11845:45;:::i;:::-;11840:3;11833:58;11740:157;;:::o;11933:732::-;12052:3;12081:54;12129:5;12081:54;:::i;:::-;12151:86;12230:6;12225:3;12151:86;:::i;:::-;12144:93;;12261:56;12311:5;12261:56;:::i;:::-;12340:7;12371:1;12356:284;12381:6;12378:1;12375:13;12356:284;;;12457:6;12451:13;12484:63;12543:3;12528:13;12484:63;:::i;:::-;12477:70;;12570:60;12623:6;12570:60;:::i;:::-;12560:70;;12416:224;12403:1;12400;12396:9;12391:14;;12356:284;;;12360:14;12656:3;12649:10;;12057:608;;;11933:732;;;;:::o;12671:109::-;12752:21;12767:5;12752:21;:::i;:::-;12747:3;12740:34;12671:109;;:::o;12786:118::-;12873:24;12891:5;12873:24;:::i;:::-;12868:3;12861:37;12786:118;;:::o;12910:360::-;12996:3;13024:38;13056:5;13024:38;:::i;:::-;13078:70;13141:6;13136:3;13078:70;:::i;:::-;13071:77;;13157:52;13202:6;13197:3;13190:4;13183:5;13179:16;13157:52;:::i;:::-;13234:29;13256:6;13234:29;:::i;:::-;13229:3;13225:39;13218:46;;13000:270;12910:360;;;;:::o;13276:364::-;13364:3;13392:39;13425:5;13392:39;:::i;:::-;13447:71;13511:6;13506:3;13447:71;:::i;:::-;13440:78;;13527:52;13572:6;13567:3;13560:4;13553:5;13549:16;13527:52;:::i;:::-;13604:29;13626:6;13604:29;:::i;:::-;13599:3;13595:39;13588:46;;13368:272;13276:364;;;;:::o;13646:377::-;13752:3;13780:39;13813:5;13780:39;:::i;:::-;13835:89;13917:6;13912:3;13835:89;:::i;:::-;13828:96;;13933:52;13978:6;13973:3;13966:4;13959:5;13955:16;13933:52;:::i;:::-;14010:6;14005:3;14001:16;13994:23;;13756:267;13646:377;;;;:::o;14053:845::-;14156:3;14193:5;14187:12;14222:36;14248:9;14222:36;:::i;:::-;14274:89;14356:6;14351:3;14274:89;:::i;:::-;14267:96;;14394:1;14383:9;14379:17;14410:1;14405:137;;;;14556:1;14551:341;;;;14372:520;;14405:137;14489:4;14485:9;14474;14470:25;14465:3;14458:38;14525:6;14520:3;14516:16;14509:23;;14405:137;;14551:341;14618:38;14650:5;14618:38;:::i;:::-;14678:1;14692:154;14706:6;14703:1;14700:13;14692:154;;;14780:7;14774:14;14770:1;14765:3;14761:11;14754:35;14830:1;14821:7;14817:15;14806:26;;14728:4;14725:1;14721:12;14716:17;;14692:154;;;14875:6;14870:3;14866:16;14859:23;;14558:334;;14372:520;;14160:738;;14053:845;;;;:::o;14904:366::-;15046:3;15067:67;15131:2;15126:3;15067:67;:::i;:::-;15060:74;;15143:93;15232:3;15143:93;:::i;:::-;15261:2;15256:3;15252:12;15245:19;;14904:366;;;:::o;15276:::-;15418:3;15439:67;15503:2;15498:3;15439:67;:::i;:::-;15432:74;;15515:93;15604:3;15515:93;:::i;:::-;15633:2;15628:3;15624:12;15617:19;;15276:366;;;:::o;15648:::-;15790:3;15811:67;15875:2;15870:3;15811:67;:::i;:::-;15804:74;;15887:93;15976:3;15887:93;:::i;:::-;16005:2;16000:3;15996:12;15989:19;;15648:366;;;:::o;16020:::-;16162:3;16183:67;16247:2;16242:3;16183:67;:::i;:::-;16176:74;;16259:93;16348:3;16259:93;:::i;:::-;16377:2;16372:3;16368:12;16361:19;;16020:366;;;:::o;16392:::-;16534:3;16555:67;16619:2;16614:3;16555:67;:::i;:::-;16548:74;;16631:93;16720:3;16631:93;:::i;:::-;16749:2;16744:3;16740:12;16733:19;;16392:366;;;:::o;16764:::-;16906:3;16927:67;16991:2;16986:3;16927:67;:::i;:::-;16920:74;;17003:93;17092:3;17003:93;:::i;:::-;17121:2;17116:3;17112:12;17105:19;;16764:366;;;:::o;17136:::-;17278:3;17299:67;17363:2;17358:3;17299:67;:::i;:::-;17292:74;;17375:93;17464:3;17375:93;:::i;:::-;17493:2;17488:3;17484:12;17477:19;;17136:366;;;:::o;17508:::-;17650:3;17671:67;17735:2;17730:3;17671:67;:::i;:::-;17664:74;;17747:93;17836:3;17747:93;:::i;:::-;17865:2;17860:3;17856:12;17849:19;;17508:366;;;:::o;17880:398::-;18039:3;18060:83;18141:1;18136:3;18060:83;:::i;:::-;18053:90;;18152:93;18241:3;18152:93;:::i;:::-;18270:1;18265:3;18261:11;18254:18;;17880:398;;;:::o;18284:366::-;18426:3;18447:67;18511:2;18506:3;18447:67;:::i;:::-;18440:74;;18523:93;18612:3;18523:93;:::i;:::-;18641:2;18636:3;18632:12;18625:19;;18284:366;;;:::o;18656:::-;18798:3;18819:67;18883:2;18878:3;18819:67;:::i;:::-;18812:74;;18895:93;18984:3;18895:93;:::i;:::-;19013:2;19008:3;19004:12;18997:19;;18656:366;;;:::o;19028:::-;19170:3;19191:67;19255:2;19250:3;19191:67;:::i;:::-;19184:74;;19267:93;19356:3;19267:93;:::i;:::-;19385:2;19380:3;19376:12;19369:19;;19028:366;;;:::o;19400:::-;19542:3;19563:67;19627:2;19622:3;19563:67;:::i;:::-;19556:74;;19639:93;19728:3;19639:93;:::i;:::-;19757:2;19752:3;19748:12;19741:19;;19400:366;;;:::o;19772:108::-;19849:24;19867:5;19849:24;:::i;:::-;19844:3;19837:37;19772:108;;:::o;19886:118::-;19973:24;19991:5;19973:24;:::i;:::-;19968:3;19961:37;19886:118;;:::o;20010:256::-;20122:3;20137:75;20208:3;20199:6;20137:75;:::i;:::-;20237:2;20232:3;20228:12;20221:19;;20257:3;20250:10;;20010:256;;;;:::o;20272:589::-;20497:3;20519:95;20610:3;20601:6;20519:95;:::i;:::-;20512:102;;20631:95;20722:3;20713:6;20631:95;:::i;:::-;20624:102;;20743:92;20831:3;20822:6;20743:92;:::i;:::-;20736:99;;20852:3;20845:10;;20272:589;;;;;;:::o;20867:379::-;21051:3;21073:147;21216:3;21073:147;:::i;:::-;21066:154;;21237:3;21230:10;;20867:379;;;:::o;21252:222::-;21345:4;21383:2;21372:9;21368:18;21360:26;;21396:71;21464:1;21453:9;21449:17;21440:6;21396:71;:::i;:::-;21252:222;;;;:::o;21480:640::-;21675:4;21713:3;21702:9;21698:19;21690:27;;21727:71;21795:1;21784:9;21780:17;21771:6;21727:71;:::i;:::-;21808:72;21876:2;21865:9;21861:18;21852:6;21808:72;:::i;:::-;21890;21958:2;21947:9;21943:18;21934:6;21890:72;:::i;:::-;22009:9;22003:4;21999:20;21994:2;21983:9;21979:18;21972:48;22037:76;22108:4;22099:6;22037:76;:::i;:::-;22029:84;;21480:640;;;;;;;:::o;22126:373::-;22269:4;22307:2;22296:9;22292:18;22284:26;;22356:9;22350:4;22346:20;22342:1;22331:9;22327:17;22320:47;22384:108;22487:4;22478:6;22384:108;:::i;:::-;22376:116;;22126:373;;;;:::o;22505:210::-;22592:4;22630:2;22619:9;22615:18;22607:26;;22643:65;22705:1;22694:9;22690:17;22681:6;22643:65;:::i;:::-;22505:210;;;;:::o;22721:222::-;22814:4;22852:2;22841:9;22837:18;22829:26;;22865:71;22933:1;22922:9;22918:17;22909:6;22865:71;:::i;:::-;22721:222;;;;:::o;22949:313::-;23062:4;23100:2;23089:9;23085:18;23077:26;;23149:9;23143:4;23139:20;23135:1;23124:9;23120:17;23113:47;23177:78;23250:4;23241:6;23177:78;:::i;:::-;23169:86;;22949:313;;;;:::o;23268:419::-;23434:4;23472:2;23461:9;23457:18;23449:26;;23521:9;23515:4;23511:20;23507:1;23496:9;23492:17;23485:47;23549:131;23675:4;23549:131;:::i;:::-;23541:139;;23268:419;;;:::o;23693:::-;23859:4;23897:2;23886:9;23882:18;23874:26;;23946:9;23940:4;23936:20;23932:1;23921:9;23917:17;23910:47;23974:131;24100:4;23974:131;:::i;:::-;23966:139;;23693:419;;;:::o;24118:::-;24284:4;24322:2;24311:9;24307:18;24299:26;;24371:9;24365:4;24361:20;24357:1;24346:9;24342:17;24335:47;24399:131;24525:4;24399:131;:::i;:::-;24391:139;;24118:419;;;:::o;24543:::-;24709:4;24747:2;24736:9;24732:18;24724:26;;24796:9;24790:4;24786:20;24782:1;24771:9;24767:17;24760:47;24824:131;24950:4;24824:131;:::i;:::-;24816:139;;24543:419;;;:::o;24968:::-;25134:4;25172:2;25161:9;25157:18;25149:26;;25221:9;25215:4;25211:20;25207:1;25196:9;25192:17;25185:47;25249:131;25375:4;25249:131;:::i;:::-;25241:139;;24968:419;;;:::o;25393:::-;25559:4;25597:2;25586:9;25582:18;25574:26;;25646:9;25640:4;25636:20;25632:1;25621:9;25617:17;25610:47;25674:131;25800:4;25674:131;:::i;:::-;25666:139;;25393:419;;;:::o;25818:::-;25984:4;26022:2;26011:9;26007:18;25999:26;;26071:9;26065:4;26061:20;26057:1;26046:9;26042:17;26035:47;26099:131;26225:4;26099:131;:::i;:::-;26091:139;;25818:419;;;:::o;26243:::-;26409:4;26447:2;26436:9;26432:18;26424:26;;26496:9;26490:4;26486:20;26482:1;26471:9;26467:17;26460:47;26524:131;26650:4;26524:131;:::i;:::-;26516:139;;26243:419;;;:::o;26668:::-;26834:4;26872:2;26861:9;26857:18;26849:26;;26921:9;26915:4;26911:20;26907:1;26896:9;26892:17;26885:47;26949:131;27075:4;26949:131;:::i;:::-;26941:139;;26668:419;;;:::o;27093:::-;27259:4;27297:2;27286:9;27282:18;27274:26;;27346:9;27340:4;27336:20;27332:1;27321:9;27317:17;27310:47;27374:131;27500:4;27374:131;:::i;:::-;27366:139;;27093:419;;;:::o;27518:::-;27684:4;27722:2;27711:9;27707:18;27699:26;;27771:9;27765:4;27761:20;27757:1;27746:9;27742:17;27735:47;27799:131;27925:4;27799:131;:::i;:::-;27791:139;;27518:419;;;:::o;27943:::-;28109:4;28147:2;28136:9;28132:18;28124:26;;28196:9;28190:4;28186:20;28182:1;28171:9;28167:17;28160:47;28224:131;28350:4;28224:131;:::i;:::-;28216:139;;27943:419;;;:::o;28368:222::-;28461:4;28499:2;28488:9;28484:18;28476:26;;28512:71;28580:1;28569:9;28565:17;28556:6;28512:71;:::i;:::-;28368:222;;;;:::o;28596:129::-;28630:6;28657:20;;:::i;:::-;28647:30;;28686:33;28714:4;28706:6;28686:33;:::i;:::-;28596:129;;;:::o;28731:75::-;28764:6;28797:2;28791:9;28781:19;;28731:75;:::o;28812:311::-;28889:4;28979:18;28971:6;28968:30;28965:56;;;29001:18;;:::i;:::-;28965:56;29051:4;29043:6;29039:17;29031:25;;29111:4;29105;29101:15;29093:23;;28812:311;;;:::o;29129:307::-;29190:4;29280:18;29272:6;29269:30;29266:56;;;29302:18;;:::i;:::-;29266:56;29340:29;29362:6;29340:29;:::i;:::-;29332:37;;29424:4;29418;29414:15;29406:23;;29129:307;;;:::o;29442:308::-;29504:4;29594:18;29586:6;29583:30;29580:56;;;29616:18;;:::i;:::-;29580:56;29654:29;29676:6;29654:29;:::i;:::-;29646:37;;29738:4;29732;29728:15;29720:23;;29442:308;;;:::o;29756:132::-;29823:4;29846:3;29838:11;;29876:4;29871:3;29867:14;29859:22;;29756:132;;;:::o;29894:141::-;29943:4;29966:3;29958:11;;29989:3;29986:1;29979:14;30023:4;30020:1;30010:18;30002:26;;29894:141;;;:::o;30041:114::-;30108:6;30142:5;30136:12;30126:22;;30041:114;;;:::o;30161:98::-;30212:6;30246:5;30240:12;30230:22;;30161:98;;;:::o;30265:99::-;30317:6;30351:5;30345:12;30335:22;;30265:99;;;:::o;30370:113::-;30440:4;30472;30467:3;30463:14;30455:22;;30370:113;;;:::o;30489:184::-;30588:11;30622:6;30617:3;30610:19;30662:4;30657:3;30653:14;30638:29;;30489:184;;;;:::o;30679:168::-;30762:11;30796:6;30791:3;30784:19;30836:4;30831:3;30827:14;30812:29;;30679:168;;;;:::o;30853:147::-;30954:11;30991:3;30976:18;;30853:147;;;;:::o;31006:169::-;31090:11;31124:6;31119:3;31112:19;31164:4;31159:3;31155:14;31140:29;;31006:169;;;;:::o;31181:148::-;31283:11;31320:3;31305:18;;31181:148;;;;:::o;31335:305::-;31375:3;31394:20;31412:1;31394:20;:::i;:::-;31389:25;;31428:20;31446:1;31428:20;:::i;:::-;31423:25;;31582:1;31514:66;31510:74;31507:1;31504:81;31501:107;;;31588:18;;:::i;:::-;31501:107;31632:1;31629;31625:9;31618:16;;31335:305;;;;:::o;31646:185::-;31686:1;31703:20;31721:1;31703:20;:::i;:::-;31698:25;;31737:20;31755:1;31737:20;:::i;:::-;31732:25;;31776:1;31766:35;;31781:18;;:::i;:::-;31766:35;31823:1;31820;31816:9;31811:14;;31646:185;;;;:::o;31837:348::-;31877:7;31900:20;31918:1;31900:20;:::i;:::-;31895:25;;31934:20;31952:1;31934:20;:::i;:::-;31929:25;;32122:1;32054:66;32050:74;32047:1;32044:81;32039:1;32032:9;32025:17;32021:105;32018:131;;;32129:18;;:::i;:::-;32018:131;32177:1;32174;32170:9;32159:20;;31837:348;;;;:::o;32191:191::-;32231:4;32251:20;32269:1;32251:20;:::i;:::-;32246:25;;32285:20;32303:1;32285:20;:::i;:::-;32280:25;;32324:1;32321;32318:8;32315:34;;;32329:18;;:::i;:::-;32315:34;32374:1;32371;32367:9;32359:17;;32191:191;;;;:::o;32388:96::-;32425:7;32454:24;32472:5;32454:24;:::i;:::-;32443:35;;32388:96;;;:::o;32490:90::-;32524:7;32567:5;32560:13;32553:21;32542:32;;32490:90;;;:::o;32586:77::-;32623:7;32652:5;32641:16;;32586:77;;;:::o;32669:149::-;32705:7;32745:66;32738:5;32734:78;32723:89;;32669:149;;;:::o;32824:126::-;32861:7;32901:42;32894:5;32890:54;32879:65;;32824:126;;;:::o;32956:77::-;32993:7;33022:5;33011:16;;32956:77;;;:::o;33039:154::-;33123:6;33118:3;33113;33100:30;33185:1;33176:6;33171:3;33167:16;33160:27;33039:154;;;:::o;33199:307::-;33267:1;33277:113;33291:6;33288:1;33285:13;33277:113;;;33376:1;33371:3;33367:11;33361:18;33357:1;33352:3;33348:11;33341:39;33313:2;33310:1;33306:10;33301:15;;33277:113;;;33408:6;33405:1;33402:13;33399:101;;;33488:1;33479:6;33474:3;33470:16;33463:27;33399:101;33248:258;33199:307;;;:::o;33512:320::-;33556:6;33593:1;33587:4;33583:12;33573:22;;33640:1;33634:4;33630:12;33661:18;33651:81;;33717:4;33709:6;33705:17;33695:27;;33651:81;33779:2;33771:6;33768:14;33748:18;33745:38;33742:84;;;33798:18;;:::i;:::-;33742:84;33563:269;33512:320;;;:::o;33838:281::-;33921:27;33943:4;33921:27;:::i;:::-;33913:6;33909:40;34051:6;34039:10;34036:22;34015:18;34003:10;34000:34;33997:62;33994:88;;;34062:18;;:::i;:::-;33994:88;34102:10;34098:2;34091:22;33881:238;33838:281;;:::o;34125:233::-;34164:3;34187:24;34205:5;34187:24;:::i;:::-;34178:33;;34233:66;34226:5;34223:77;34220:103;;;34303:18;;:::i;:::-;34220:103;34350:1;34343:5;34339:13;34332:20;;34125:233;;;:::o;34364:100::-;34403:7;34432:26;34452:5;34432:26;:::i;:::-;34421:37;;34364:100;;;:::o;34470:94::-;34509:7;34538:20;34552:5;34538:20;:::i;:::-;34527:31;;34470:94;;;:::o;34570:176::-;34602:1;34619:20;34637:1;34619:20;:::i;:::-;34614:25;;34653:20;34671:1;34653:20;:::i;:::-;34648:25;;34692:1;34682:35;;34697:18;;:::i;:::-;34682:35;34738:1;34735;34731:9;34726:14;;34570:176;;;;:::o;34752:180::-;34800:77;34797:1;34790:88;34897:4;34894:1;34887:15;34921:4;34918:1;34911:15;34938:180;34986:77;34983:1;34976:88;35083:4;35080:1;35073:15;35107:4;35104:1;35097:15;35124:180;35172:77;35169:1;35162:88;35269:4;35266:1;35259:15;35293:4;35290:1;35283:15;35310:180;35358:77;35355:1;35348:88;35455:4;35452:1;35445:15;35479:4;35476:1;35469:15;35496:180;35544:77;35541:1;35534:88;35641:4;35638:1;35631:15;35665:4;35662:1;35655:15;35682:117;35791:1;35788;35781:12;35805:117;35914:1;35911;35904:12;35928:117;36037:1;36034;36027:12;36051:117;36160:1;36157;36150:12;36174:117;36283:1;36280;36273:12;36297:117;36406:1;36403;36396:12;36420:102;36461:6;36512:2;36508:7;36503:2;36496:5;36492:14;36488:28;36478:38;;36420:102;;;:::o;36528:94::-;36561:8;36609:5;36605:2;36601:14;36580:35;;36528:94;;;:::o;36628:164::-;36768:16;36764:1;36756:6;36752:14;36745:40;36628:164;:::o;36798:225::-;36938:34;36934:1;36926:6;36922:14;36915:58;37007:8;37002:2;36994:6;36990:15;36983:33;36798:225;:::o;37029:170::-;37169:22;37165:1;37157:6;37153:14;37146:46;37029:170;:::o;37205:165::-;37345:17;37341:1;37333:6;37329:14;37322:41;37205:165;:::o;37376:182::-;37516:34;37512:1;37504:6;37500:14;37493:58;37376:182;:::o;37564:173::-;37704:25;37700:1;37692:6;37688:14;37681:49;37564:173;:::o;37743:174::-;37883:26;37879:1;37871:6;37867:14;37860:50;37743:174;:::o;37923:234::-;38063:34;38059:1;38051:6;38047:14;38040:58;38132:17;38127:2;38119:6;38115:15;38108:42;37923:234;:::o;38163:114::-;;:::o;38283:170::-;38423:22;38419:1;38411:6;38407:14;38400:46;38283:170;:::o;38459:221::-;38599:34;38595:1;38587:6;38583:14;38576:58;38668:4;38663:2;38655:6;38651:15;38644:29;38459:221;:::o;38686:181::-;38826:33;38822:1;38814:6;38810:14;38803:57;38686:181;:::o;38873:169::-;39013:21;39009:1;39001:6;38997:14;38990:45;38873:169;:::o;39048:122::-;39121:24;39139:5;39121:24;:::i;:::-;39114:5;39111:35;39101:63;;39160:1;39157;39150:12;39101:63;39048:122;:::o;39176:116::-;39246:21;39261:5;39246:21;:::i;:::-;39239:5;39236:32;39226:60;;39282:1;39279;39272:12;39226:60;39176:116;:::o;39298:122::-;39371:24;39389:5;39371:24;:::i;:::-;39364:5;39361:35;39351:63;;39410:1;39407;39400:12;39351:63;39298:122;:::o;39426:120::-;39498:23;39515:5;39498:23;:::i;:::-;39491:5;39488:34;39478:62;;39536:1;39533;39526:12;39478:62;39426:120;:::o;39552:122::-;39625:24;39643:5;39625:24;:::i;:::-;39618:5;39615:35;39605:63;;39664:1;39661;39654:12;39605:63;39552:122;:::o

Swarm Source

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