ETH Price: $2,522.06 (+1.25%)

Token

The Big Sweep (TBS)
 

Overview

Max Total Supply

84 TBS

Holders

54

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
web3post.eth
Balance
1 TBS
0xbae0f07de520ebdf520c35364de4c15ebe72d662
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:
BIGSWEEP

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree 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.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
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 Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle 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++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // 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);
    }

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

// File: @openzeppelin/contracts/utils/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 (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.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
                /// @solidity memory-safe-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 (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/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 (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

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


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

pragma solidity ^0.8.0;



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

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


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/BigSweep.sol


pragma solidity ^0.8.2;






contract BIGSWEEP is ERC721, ERC721Enumerable, ERC721Burnable, Ownable {

    uint256 public maxSupply = 420;
    uint256 public price = 0.1 ether;
    uint256 public maxPerWalletPublic = 3;
    uint256 public maxPerWalletWhitelist = 2;
    uint256 public publicStartTime; 
    uint256 public whitelistStartTime;
    bytes32 public merkleRoot;
 
    string internal baseTokenURI;

    mapping(address => uint256) public _public;
    mapping(address => uint256) public _whitelist;

    constructor() ERC721("The Big Sweep", "TBS") {}

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

    function mint(uint256 _numOfTokens) public payable {
        uint256 supply = totalSupply();

        require(block.timestamp >= publicStartTime && publicStartTime != 0, "Public Sale is not active");
        require(_public[msg.sender] + _numOfTokens <= maxPerWalletPublic, "Exceeded max available to purchase");
        require(supply + _numOfTokens <= maxSupply, "Sold out!");
        require(price * _numOfTokens <= msg.value,"Ethereum amount sent is not correct");

        _public[msg.sender] += _numOfTokens;

        for (uint256 i = 0; i < _numOfTokens; i++) {
            _safeMint(msg.sender, supply  + i);
        }
    }

    function mintWhitelist(uint256 _numOfTokens, bytes32[] memory _merkleProof) public payable {
        uint256 supply = totalSupply(); 

        require(block.timestamp >= whitelistStartTime && whitelistStartTime != 0 && block.timestamp <= publicStartTime, "Whitelist Sale is not active");
        require(_whitelist[msg.sender] + _numOfTokens <= maxPerWalletWhitelist, "Exceeded max available to purchase");
        require(supply + _numOfTokens <= maxSupply, "Sold out!");
        require(price * _numOfTokens <= msg.value, "Ethereum amount sent is not correct");
 
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), "Not whitelisted");

        _whitelist[msg.sender] += _numOfTokens;

        for (uint256 i = 0; i < _numOfTokens; i++) {
            _safeMint(msg.sender, supply + i);
        }
    }

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

    function setMaxPerWallet(uint256 newMaxPerWalletPublic, uint256 newMaxPerWalletWhitelist) external onlyOwner {
        maxPerWalletPublic = newMaxPerWalletPublic;
        maxPerWalletWhitelist = newMaxPerWalletWhitelist;
    }

    function setStartTimes(uint256 newWhitelistStartTime, uint256 newPublicStartTime) external onlyOwner {
        whitelistStartTime = newWhitelistStartTime;
        publicStartTime = newPublicStartTime;
    }
  
    function setMerkleRoot(bytes32 newMerkleRoot) external onlyOwner {
        merkleRoot = newMerkleRoot;
    }
   
    function setBaseTokenURI(string memory baseURI) public onlyOwner {
        baseTokenURI = baseURI;
    }

    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, "Contract balance should be more then zero");
        payable(address(msg.sender)).transfer(balance);
    }

    // Standard functions to be overridden in ERC721Enumerable
    function supportsInterface(bytes4 _interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(_interfaceId);
    }

    function _beforeTokenTransfer(
        address _from,
        address _to,
        uint256 _tokenId
    ) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(_from, _to, _tokenId);
    }
}

// Contract developed by Allo GmbH
// [email protected]

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_public","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_whitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWalletPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWalletWhitelist","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":"_numOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numOfTokens","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxPerWalletPublic","type":"uint256"},{"internalType":"uint256","name":"newMaxPerWalletWhitelist","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newMerkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newWhitelistStartTime","type":"uint256"},{"internalType":"uint256","name":"newPublicStartTime","type":"uint256"}],"name":"setStartTimes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526101a4600b5567016345785d8a0000600c556003600d556002600e553480156200002d57600080fd5b506040518060400160405280600d81526020017f54686520426967205377656570000000000000000000000000000000000000008152506040518060400160405280600381526020017f54425300000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000b2929190620001c2565b508060019080519060200190620000cb929190620001c2565b505050620000ee620000e2620000f460201b60201c565b620000fc60201b60201c565b620002d7565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001d09062000272565b90600052602060002090601f016020900481019282620001f4576000855562000240565b82601f106200020f57805160ff191683800117855562000240565b8280016001018555821562000240579182015b828111156200023f57825182559160200191906001019062000222565b5b5090506200024f919062000253565b5090565b5b808211156200026e57600081600090555060010162000254565b5090565b600060028204905060018216806200028b57607f821691505b60208210811415620002a257620002a1620002a8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61455b80620002e76000396000f3fe60806040526004361061021a5760003560e01c806370a0823111610123578063a0712d68116100ab578063cfdb63ac1161006f578063cfdb63ac146107b5578063d5abeb01146107f2578063e985e9c51461081d578063f2fde38b1461085a578063fbf5c17c146108835761021a565b8063a0712d68146106df578063a22cb465146106fb578063b029a51414610724578063b88d4fde1461074f578063c87b56dd146107785761021a565b80638da5cb5b116100f25780638da5cb5b1461060a57806391b7f5ed146106355780639292caaf1461065e57806395d89b4114610689578063a035b1fe146106b45761021a565b806370a0823114610550578063715018a61461058d5780637cb64759146105a45780638499410e146105cd5761021a565b806330176e13116101a657806342966c681161017557806342966c68146104595780634f6ccce71461048257806356ad15f6146104bf5780635fd1bbc4146104e85780636352211e146105135761021a565b806330176e13146103c557806336a4e19b146103ee5780633ccfd60b1461041957806342842e0e146104305761021a565b8063095ea7b3116101ed578063095ea7b3146102e057806318160ddd1461030957806323b872dd146103345780632eb4a7ab1461035d5780632f745c59146103885761021a565b806301ffc9a71461021f578063061431a81461025c57806306fdde0314610278578063081812fc146102a3575b600080fd5b34801561022b57600080fd5b50610246600480360381019061024191906130e4565b6108ac565b60405161025391906136ee565b60405180910390f35b610276600480360381019061027191906131b4565b6108be565b005b34801561028457600080fd5b5061028d610b62565b60405161029a9190613724565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c59190613187565b610bf4565b6040516102d79190613687565b60405180910390f35b3480156102ec57600080fd5b5061030760048036038101906103029190613077565b610c3a565b005b34801561031557600080fd5b5061031e610d52565b60405161032b9190613a06565b60405180910390f35b34801561034057600080fd5b5061035b60048036038101906103569190612f61565b610d5f565b005b34801561036957600080fd5b50610372610dbf565b60405161037f9190613709565b60405180910390f35b34801561039457600080fd5b506103af60048036038101906103aa9190613077565b610dc5565b6040516103bc9190613a06565b60405180910390f35b3480156103d157600080fd5b506103ec60048036038101906103e7919061313e565b610e6a565b005b3480156103fa57600080fd5b50610403610e8c565b6040516104109190613a06565b60405180910390f35b34801561042557600080fd5b5061042e610e92565b005b34801561043c57600080fd5b5061045760048036038101906104529190612f61565b610f2c565b005b34801561046557600080fd5b50610480600480360381019061047b9190613187565b610f4c565b005b34801561048e57600080fd5b506104a960048036038101906104a49190613187565b610fa8565b6040516104b69190613a06565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e19190613210565b611019565b005b3480156104f457600080fd5b506104fd611033565b60405161050a9190613a06565b60405180910390f35b34801561051f57600080fd5b5061053a60048036038101906105359190613187565b611039565b6040516105479190613687565b60405180910390f35b34801561055c57600080fd5b5061057760048036038101906105729190612ef4565b6110eb565b6040516105849190613a06565b60405180910390f35b34801561059957600080fd5b506105a26111a3565b005b3480156105b057600080fd5b506105cb60048036038101906105c691906130b7565b6111b7565b005b3480156105d957600080fd5b506105f460048036038101906105ef9190612ef4565b6111c9565b6040516106019190613a06565b60405180910390f35b34801561061657600080fd5b5061061f6111e1565b60405161062c9190613687565b60405180910390f35b34801561064157600080fd5b5061065c60048036038101906106579190613187565b61120b565b005b34801561066a57600080fd5b5061067361121d565b6040516106809190613a06565b60405180910390f35b34801561069557600080fd5b5061069e611223565b6040516106ab9190613724565b60405180910390f35b3480156106c057600080fd5b506106c96112b5565b6040516106d69190613a06565b60405180910390f35b6106f960048036038101906106f49190613187565b6112bb565b005b34801561070757600080fd5b50610722600480360381019061071d9190613037565b6114d8565b005b34801561073057600080fd5b506107396114ee565b6040516107469190613a06565b60405180910390f35b34801561075b57600080fd5b5061077660048036038101906107719190612fb4565b6114f4565b005b34801561078457600080fd5b5061079f600480360381019061079a9190613187565b611556565b6040516107ac9190613724565b60405180910390f35b3480156107c157600080fd5b506107dc60048036038101906107d79190612ef4565b6115be565b6040516107e99190613a06565b60405180910390f35b3480156107fe57600080fd5b506108076115d6565b6040516108149190613a06565b60405180910390f35b34801561082957600080fd5b50610844600480360381019061083f9190612f21565b6115dc565b60405161085191906136ee565b60405180910390f35b34801561086657600080fd5b50610881600480360381019061087c9190612ef4565b611670565b005b34801561088f57600080fd5b506108aa60048036038101906108a59190613210565b6116f4565b005b60006108b78261170e565b9050919050565b60006108c8610d52565b905060105442101580156108df5750600060105414155b80156108ed5750600f544211155b61092c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092390613886565b60405180910390fd5b600e5483601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461097a9190613b17565b11156109bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b290613986565b60405180910390fd5b600b5483826109ca9190613b17565b1115610a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a02906139e6565b60405180910390fd5b3483600c54610a1a9190613b9e565b1115610a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5290613746565b60405180910390fd5b600033604051602001610a6e9190613648565b604051602081830303815290604052805190602001209050610a938360115483611788565b610ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac9906138c6565b60405180910390fd5b83601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b219190613b17565b9250508190555060005b84811015610b5b57610b48338285610b439190613b17565b61179f565b8080610b5390613d4f565b915050610b2b565b5050505050565b606060008054610b7190613cec565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9d90613cec565b8015610bea5780601f10610bbf57610100808354040283529160200191610bea565b820191906000526020600020905b815481529060010190602001808311610bcd57829003601f168201915b5050505050905090565b6000610bff826117bd565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c4582611039565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cad90613966565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cd5611808565b73ffffffffffffffffffffffffffffffffffffffff161480610d045750610d0381610cfe611808565b6115dc565b5b610d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3a906138e6565b60405180910390fd5b610d4d8383611810565b505050565b6000600880549050905090565b610d70610d6a611808565b826118c9565b610daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da6906139c6565b60405180910390fd5b610dba83838361195e565b505050565b60115481565b6000610dd0836110eb565b8210610e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0890613766565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e72611bc5565b8060129080519060200190610e88929190612c55565b5050565b600e5481565b610e9a611bc5565b600047905060008111610ee2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed990613826565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f28573d6000803e3d6000fd5b5050565b610f47838383604051806020016040528060008152506114f4565b505050565b610f5d610f57611808565b826118c9565b610f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f93906139c6565b60405180910390fd5b610fa581611c43565b50565b6000610fb2610d52565b8210610ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fea906139a6565b60405180910390fd5b6008828154811061100757611006613ea9565b5b90600052602060002001549050919050565b611021611bc5565b81600d8190555080600e819055505050565b600f5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d990613946565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561115c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611153906138a6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111ab611bc5565b6111b56000611d60565b565b6111bf611bc5565b8060118190555050565b60136020528060005260406000206000915090505481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611213611bc5565b80600c8190555050565b60105481565b60606001805461123290613cec565b80601f016020809104026020016040519081016040528092919081815260200182805461125e90613cec565b80156112ab5780601f10611280576101008083540402835291602001916112ab565b820191906000526020600020905b81548152906001019060200180831161128e57829003601f168201915b5050505050905090565b600c5481565b60006112c5610d52565b9050600f5442101580156112dc57506000600f5414155b61131b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131290613806565b60405180910390fd5b600d5482601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113699190613b17565b11156113aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a190613986565b60405180910390fd5b600b5482826113b99190613b17565b11156113fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f1906139e6565b60405180910390fd5b3482600c546114099190613b9e565b111561144a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144190613746565b60405180910390fd5b81601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114999190613b17565b9250508190555060005b828110156114d3576114c03382846114bb9190613b17565b61179f565b80806114cb90613d4f565b9150506114a3565b505050565b6114ea6114e3611808565b8383611e26565b5050565b600d5481565b6115056114ff611808565b836118c9565b611544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153b906139c6565b60405180910390fd5b61155084848484611f93565b50505050565b6060611561826117bd565b600061156b611fef565b9050600081511161158b57604051806020016040528060008152506115b6565b8061159584612081565b6040516020016115a6929190613663565b6040516020818303038152906040525b915050919050565b60146020528060005260406000206000915090505481565b600b5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611678611bc5565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116df906137a6565b60405180910390fd5b6116f181611d60565b50565b6116fc611bc5565b8160108190555080600f819055505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806117815750611780826121e2565b5b9050919050565b60008261179585846122c4565b1490509392505050565b6117b982826040518060200160405280600081525061231a565b5050565b6117c681612375565b611805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fc90613946565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661188383611039565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806118d583611039565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611917575061191681856115dc565b5b8061195557508373ffffffffffffffffffffffffffffffffffffffff1661193d84610bf4565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661197e82611039565b73ffffffffffffffffffffffffffffffffffffffff16146119d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cb906137c6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3b90613846565b60405180910390fd5b611a4f8383836123e1565b611a5a600082611810565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611aaa9190613bf8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b019190613b17565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611bc08383836123f1565b505050565b611bcd611808565b73ffffffffffffffffffffffffffffffffffffffff16611beb6111e1565b73ffffffffffffffffffffffffffffffffffffffff1614611c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3890613926565b60405180910390fd5b565b6000611c4e82611039565b9050611c5c816000846123e1565b611c67600083611810565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cb79190613bf8565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d5c816000846123f1565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8c90613866565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f8691906136ee565b60405180910390a3505050565b611f9e84848461195e565b611faa848484846123f6565b611fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe090613786565b60405180910390fd5b50505050565b606060128054611ffe90613cec565b80601f016020809104026020016040519081016040528092919081815260200182805461202a90613cec565b80156120775780601f1061204c57610100808354040283529160200191612077565b820191906000526020600020905b81548152906001019060200180831161205a57829003601f168201915b5050505050905090565b606060008214156120c9576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506121dd565b600082905060005b600082146120fb5780806120e490613d4f565b915050600a826120f49190613b6d565b91506120d1565b60008167ffffffffffffffff81111561211757612116613ed8565b5b6040519080825280601f01601f1916602001820160405280156121495781602001600182028036833780820191505090505b5090505b600085146121d6576001826121629190613bf8565b9150600a856121719190613dbc565b603061217d9190613b17565b60f81b81838151811061219357612192613ea9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121cf9190613b6d565b945061214d565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806122ad57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806122bd57506122bc8261258d565b5b9050919050565b60008082905060005b845181101561230f576122fa828683815181106122ed576122ec613ea9565b5b60200260200101516125f7565b9150808061230790613d4f565b9150506122cd565b508091505092915050565b6123248383612622565b61233160008484846123f6565b612370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236790613786565b60405180910390fd5b505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6123ec8383836127fc565b505050565b505050565b60006124178473ffffffffffffffffffffffffffffffffffffffff16612910565b15612580578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612440611808565b8786866040518563ffffffff1660e01b815260040161246294939291906136a2565b602060405180830381600087803b15801561247c57600080fd5b505af19250505080156124ad57506040513d601f19601f820116820180604052508101906124aa9190613111565b60015b612530573d80600081146124dd576040519150601f19603f3d011682016040523d82523d6000602084013e6124e2565b606091505b50600081511415612528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251f90613786565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612585565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081831061260f5761260a8284612933565b61261a565b6126198383612933565b5b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612692576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268990613906565b60405180910390fd5b61269b81612375565b156126db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d2906137e6565b60405180910390fd5b6126e7600083836123e1565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127379190613b17565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127f8600083836123f1565b5050565b61280783838361294a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561284a576128458161294f565b612889565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612888576128878382612998565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128cc576128c781612b05565b61290b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461290a576129098282612bd6565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016129a5846110eb565b6129af9190613bf8565b9050600060076000848152602001908152602001600020549050818114612a94576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612b199190613bf8565b9050600060096000848152602001908152602001600020549050600060088381548110612b4957612b48613ea9565b5b906000526020600020015490508060088381548110612b6b57612b6a613ea9565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612bba57612bb9613e7a565b5b6001900381819060005260206000200160009055905550505050565b6000612be1836110eb565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612c6190613cec565b90600052602060002090601f016020900481019282612c835760008555612cca565b82601f10612c9c57805160ff1916838001178555612cca565b82800160010185558215612cca579182015b82811115612cc9578251825591602001919060010190612cae565b5b509050612cd79190612cdb565b5090565b5b80821115612cf4576000816000905550600101612cdc565b5090565b6000612d0b612d0684613a46565b613a21565b90508083825260208201905082856020860282011115612d2e57612d2d613f0c565b5b60005b85811015612d5e5781612d448882612e44565b845260208401935060208301925050600181019050612d31565b5050509392505050565b6000612d7b612d7684613a72565b613a21565b905082815260208101848484011115612d9757612d96613f11565b5b612da2848285613caa565b509392505050565b6000612dbd612db884613aa3565b613a21565b905082815260208101848484011115612dd957612dd8613f11565b5b612de4848285613caa565b509392505050565b600081359050612dfb816144b2565b92915050565b600082601f830112612e1657612e15613f07565b5b8135612e26848260208601612cf8565b91505092915050565b600081359050612e3e816144c9565b92915050565b600081359050612e53816144e0565b92915050565b600081359050612e68816144f7565b92915050565b600081519050612e7d816144f7565b92915050565b600082601f830112612e9857612e97613f07565b5b8135612ea8848260208601612d68565b91505092915050565b600082601f830112612ec657612ec5613f07565b5b8135612ed6848260208601612daa565b91505092915050565b600081359050612eee8161450e565b92915050565b600060208284031215612f0a57612f09613f1b565b5b6000612f1884828501612dec565b91505092915050565b60008060408385031215612f3857612f37613f1b565b5b6000612f4685828601612dec565b9250506020612f5785828601612dec565b9150509250929050565b600080600060608486031215612f7a57612f79613f1b565b5b6000612f8886828701612dec565b9350506020612f9986828701612dec565b9250506040612faa86828701612edf565b9150509250925092565b60008060008060808587031215612fce57612fcd613f1b565b5b6000612fdc87828801612dec565b9450506020612fed87828801612dec565b9350506040612ffe87828801612edf565b925050606085013567ffffffffffffffff81111561301f5761301e613f16565b5b61302b87828801612e83565b91505092959194509250565b6000806040838503121561304e5761304d613f1b565b5b600061305c85828601612dec565b925050602061306d85828601612e2f565b9150509250929050565b6000806040838503121561308e5761308d613f1b565b5b600061309c85828601612dec565b92505060206130ad85828601612edf565b9150509250929050565b6000602082840312156130cd576130cc613f1b565b5b60006130db84828501612e44565b91505092915050565b6000602082840312156130fa576130f9613f1b565b5b600061310884828501612e59565b91505092915050565b60006020828403121561312757613126613f1b565b5b600061313584828501612e6e565b91505092915050565b60006020828403121561315457613153613f1b565b5b600082013567ffffffffffffffff81111561317257613171613f16565b5b61317e84828501612eb1565b91505092915050565b60006020828403121561319d5761319c613f1b565b5b60006131ab84828501612edf565b91505092915050565b600080604083850312156131cb576131ca613f1b565b5b60006131d985828601612edf565b925050602083013567ffffffffffffffff8111156131fa576131f9613f16565b5b61320685828601612e01565b9150509250929050565b6000806040838503121561322757613226613f1b565b5b600061323585828601612edf565b925050602061324685828601612edf565b9150509250929050565b61325981613c2c565b82525050565b61327061326b82613c2c565b613d98565b82525050565b61327f81613c3e565b82525050565b61328e81613c4a565b82525050565b600061329f82613ad4565b6132a98185613aea565b93506132b9818560208601613cb9565b6132c281613f20565b840191505092915050565b60006132d882613adf565b6132e28185613afb565b93506132f2818560208601613cb9565b6132fb81613f20565b840191505092915050565b600061331182613adf565b61331b8185613b0c565b935061332b818560208601613cb9565b80840191505092915050565b6000613344602383613afb565b915061334f82613f3e565b604082019050919050565b6000613367602b83613afb565b915061337282613f8d565b604082019050919050565b600061338a603283613afb565b915061339582613fdc565b604082019050919050565b60006133ad602683613afb565b91506133b88261402b565b604082019050919050565b60006133d0602583613afb565b91506133db8261407a565b604082019050919050565b60006133f3601c83613afb565b91506133fe826140c9565b602082019050919050565b6000613416601983613afb565b9150613421826140f2565b602082019050919050565b6000613439602983613afb565b91506134448261411b565b604082019050919050565b600061345c602483613afb565b91506134678261416a565b604082019050919050565b600061347f601983613afb565b915061348a826141b9565b602082019050919050565b60006134a2601c83613afb565b91506134ad826141e2565b602082019050919050565b60006134c5602983613afb565b91506134d08261420b565b604082019050919050565b60006134e8600f83613afb565b91506134f38261425a565b602082019050919050565b600061350b603e83613afb565b915061351682614283565b604082019050919050565b600061352e602083613afb565b9150613539826142d2565b602082019050919050565b6000613551602083613afb565b915061355c826142fb565b602082019050919050565b6000613574601883613afb565b915061357f82614324565b602082019050919050565b6000613597602183613afb565b91506135a28261434d565b604082019050919050565b60006135ba602283613afb565b91506135c58261439c565b604082019050919050565b60006135dd602c83613afb565b91506135e8826143eb565b604082019050919050565b6000613600602e83613afb565b915061360b8261443a565b604082019050919050565b6000613623600983613afb565b915061362e82614489565b602082019050919050565b61364281613ca0565b82525050565b6000613654828461325f565b60148201915081905092915050565b600061366f8285613306565b915061367b8284613306565b91508190509392505050565b600060208201905061369c6000830184613250565b92915050565b60006080820190506136b76000830187613250565b6136c46020830186613250565b6136d16040830185613639565b81810360608301526136e38184613294565b905095945050505050565b60006020820190506137036000830184613276565b92915050565b600060208201905061371e6000830184613285565b92915050565b6000602082019050818103600083015261373e81846132cd565b905092915050565b6000602082019050818103600083015261375f81613337565b9050919050565b6000602082019050818103600083015261377f8161335a565b9050919050565b6000602082019050818103600083015261379f8161337d565b9050919050565b600060208201905081810360008301526137bf816133a0565b9050919050565b600060208201905081810360008301526137df816133c3565b9050919050565b600060208201905081810360008301526137ff816133e6565b9050919050565b6000602082019050818103600083015261381f81613409565b9050919050565b6000602082019050818103600083015261383f8161342c565b9050919050565b6000602082019050818103600083015261385f8161344f565b9050919050565b6000602082019050818103600083015261387f81613472565b9050919050565b6000602082019050818103600083015261389f81613495565b9050919050565b600060208201905081810360008301526138bf816134b8565b9050919050565b600060208201905081810360008301526138df816134db565b9050919050565b600060208201905081810360008301526138ff816134fe565b9050919050565b6000602082019050818103600083015261391f81613521565b9050919050565b6000602082019050818103600083015261393f81613544565b9050919050565b6000602082019050818103600083015261395f81613567565b9050919050565b6000602082019050818103600083015261397f8161358a565b9050919050565b6000602082019050818103600083015261399f816135ad565b9050919050565b600060208201905081810360008301526139bf816135d0565b9050919050565b600060208201905081810360008301526139df816135f3565b9050919050565b600060208201905081810360008301526139ff81613616565b9050919050565b6000602082019050613a1b6000830184613639565b92915050565b6000613a2b613a3c565b9050613a378282613d1e565b919050565b6000604051905090565b600067ffffffffffffffff821115613a6157613a60613ed8565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613a8d57613a8c613ed8565b5b613a9682613f20565b9050602081019050919050565b600067ffffffffffffffff821115613abe57613abd613ed8565b5b613ac782613f20565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b2282613ca0565b9150613b2d83613ca0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b6257613b61613ded565b5b828201905092915050565b6000613b7882613ca0565b9150613b8383613ca0565b925082613b9357613b92613e1c565b5b828204905092915050565b6000613ba982613ca0565b9150613bb483613ca0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bed57613bec613ded565b5b828202905092915050565b6000613c0382613ca0565b9150613c0e83613ca0565b925082821015613c2157613c20613ded565b5b828203905092915050565b6000613c3782613c80565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613cd7578082015181840152602081019050613cbc565b83811115613ce6576000848401525b50505050565b60006002820490506001821680613d0457607f821691505b60208210811415613d1857613d17613e4b565b5b50919050565b613d2782613f20565b810181811067ffffffffffffffff82111715613d4657613d45613ed8565b5b80604052505050565b6000613d5a82613ca0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d8d57613d8c613ded565b5b600182019050919050565b6000613da382613daa565b9050919050565b6000613db582613f31565b9050919050565b6000613dc782613ca0565b9150613dd283613ca0565b925082613de257613de1613e1c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f457468657265756d20616d6f756e742073656e74206973206e6f7420636f727260008201527f6563740000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5075626c69632053616c65206973206e6f742061637469766500000000000000600082015250565b7f436f6e74726163742062616c616e63652073686f756c64206265206d6f72652060008201527f7468656e207a65726f0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f57686974656c6973742053616c65206973206e6f742061637469766500000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565646564206d617820617661696c61626c6520746f2070757263686160008201527f7365000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f536f6c64206f7574210000000000000000000000000000000000000000000000600082015250565b6144bb81613c2c565b81146144c657600080fd5b50565b6144d281613c3e565b81146144dd57600080fd5b50565b6144e981613c4a565b81146144f457600080fd5b50565b61450081613c54565b811461450b57600080fd5b50565b61451781613ca0565b811461452257600080fd5b5056fea26469706673582212204f4c144f9ff949cc7cf32988ad81e8811203bfc7368cc2c615696a03ed546b6564736f6c63430008070033

Deployed Bytecode

0x60806040526004361061021a5760003560e01c806370a0823111610123578063a0712d68116100ab578063cfdb63ac1161006f578063cfdb63ac146107b5578063d5abeb01146107f2578063e985e9c51461081d578063f2fde38b1461085a578063fbf5c17c146108835761021a565b8063a0712d68146106df578063a22cb465146106fb578063b029a51414610724578063b88d4fde1461074f578063c87b56dd146107785761021a565b80638da5cb5b116100f25780638da5cb5b1461060a57806391b7f5ed146106355780639292caaf1461065e57806395d89b4114610689578063a035b1fe146106b45761021a565b806370a0823114610550578063715018a61461058d5780637cb64759146105a45780638499410e146105cd5761021a565b806330176e13116101a657806342966c681161017557806342966c68146104595780634f6ccce71461048257806356ad15f6146104bf5780635fd1bbc4146104e85780636352211e146105135761021a565b806330176e13146103c557806336a4e19b146103ee5780633ccfd60b1461041957806342842e0e146104305761021a565b8063095ea7b3116101ed578063095ea7b3146102e057806318160ddd1461030957806323b872dd146103345780632eb4a7ab1461035d5780632f745c59146103885761021a565b806301ffc9a71461021f578063061431a81461025c57806306fdde0314610278578063081812fc146102a3575b600080fd5b34801561022b57600080fd5b50610246600480360381019061024191906130e4565b6108ac565b60405161025391906136ee565b60405180910390f35b610276600480360381019061027191906131b4565b6108be565b005b34801561028457600080fd5b5061028d610b62565b60405161029a9190613724565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c59190613187565b610bf4565b6040516102d79190613687565b60405180910390f35b3480156102ec57600080fd5b5061030760048036038101906103029190613077565b610c3a565b005b34801561031557600080fd5b5061031e610d52565b60405161032b9190613a06565b60405180910390f35b34801561034057600080fd5b5061035b60048036038101906103569190612f61565b610d5f565b005b34801561036957600080fd5b50610372610dbf565b60405161037f9190613709565b60405180910390f35b34801561039457600080fd5b506103af60048036038101906103aa9190613077565b610dc5565b6040516103bc9190613a06565b60405180910390f35b3480156103d157600080fd5b506103ec60048036038101906103e7919061313e565b610e6a565b005b3480156103fa57600080fd5b50610403610e8c565b6040516104109190613a06565b60405180910390f35b34801561042557600080fd5b5061042e610e92565b005b34801561043c57600080fd5b5061045760048036038101906104529190612f61565b610f2c565b005b34801561046557600080fd5b50610480600480360381019061047b9190613187565b610f4c565b005b34801561048e57600080fd5b506104a960048036038101906104a49190613187565b610fa8565b6040516104b69190613a06565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e19190613210565b611019565b005b3480156104f457600080fd5b506104fd611033565b60405161050a9190613a06565b60405180910390f35b34801561051f57600080fd5b5061053a60048036038101906105359190613187565b611039565b6040516105479190613687565b60405180910390f35b34801561055c57600080fd5b5061057760048036038101906105729190612ef4565b6110eb565b6040516105849190613a06565b60405180910390f35b34801561059957600080fd5b506105a26111a3565b005b3480156105b057600080fd5b506105cb60048036038101906105c691906130b7565b6111b7565b005b3480156105d957600080fd5b506105f460048036038101906105ef9190612ef4565b6111c9565b6040516106019190613a06565b60405180910390f35b34801561061657600080fd5b5061061f6111e1565b60405161062c9190613687565b60405180910390f35b34801561064157600080fd5b5061065c60048036038101906106579190613187565b61120b565b005b34801561066a57600080fd5b5061067361121d565b6040516106809190613a06565b60405180910390f35b34801561069557600080fd5b5061069e611223565b6040516106ab9190613724565b60405180910390f35b3480156106c057600080fd5b506106c96112b5565b6040516106d69190613a06565b60405180910390f35b6106f960048036038101906106f49190613187565b6112bb565b005b34801561070757600080fd5b50610722600480360381019061071d9190613037565b6114d8565b005b34801561073057600080fd5b506107396114ee565b6040516107469190613a06565b60405180910390f35b34801561075b57600080fd5b5061077660048036038101906107719190612fb4565b6114f4565b005b34801561078457600080fd5b5061079f600480360381019061079a9190613187565b611556565b6040516107ac9190613724565b60405180910390f35b3480156107c157600080fd5b506107dc60048036038101906107d79190612ef4565b6115be565b6040516107e99190613a06565b60405180910390f35b3480156107fe57600080fd5b506108076115d6565b6040516108149190613a06565b60405180910390f35b34801561082957600080fd5b50610844600480360381019061083f9190612f21565b6115dc565b60405161085191906136ee565b60405180910390f35b34801561086657600080fd5b50610881600480360381019061087c9190612ef4565b611670565b005b34801561088f57600080fd5b506108aa60048036038101906108a59190613210565b6116f4565b005b60006108b78261170e565b9050919050565b60006108c8610d52565b905060105442101580156108df5750600060105414155b80156108ed5750600f544211155b61092c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092390613886565b60405180910390fd5b600e5483601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461097a9190613b17565b11156109bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b290613986565b60405180910390fd5b600b5483826109ca9190613b17565b1115610a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a02906139e6565b60405180910390fd5b3483600c54610a1a9190613b9e565b1115610a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5290613746565b60405180910390fd5b600033604051602001610a6e9190613648565b604051602081830303815290604052805190602001209050610a938360115483611788565b610ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac9906138c6565b60405180910390fd5b83601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b219190613b17565b9250508190555060005b84811015610b5b57610b48338285610b439190613b17565b61179f565b8080610b5390613d4f565b915050610b2b565b5050505050565b606060008054610b7190613cec565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9d90613cec565b8015610bea5780601f10610bbf57610100808354040283529160200191610bea565b820191906000526020600020905b815481529060010190602001808311610bcd57829003601f168201915b5050505050905090565b6000610bff826117bd565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c4582611039565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cad90613966565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cd5611808565b73ffffffffffffffffffffffffffffffffffffffff161480610d045750610d0381610cfe611808565b6115dc565b5b610d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3a906138e6565b60405180910390fd5b610d4d8383611810565b505050565b6000600880549050905090565b610d70610d6a611808565b826118c9565b610daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da6906139c6565b60405180910390fd5b610dba83838361195e565b505050565b60115481565b6000610dd0836110eb565b8210610e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0890613766565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e72611bc5565b8060129080519060200190610e88929190612c55565b5050565b600e5481565b610e9a611bc5565b600047905060008111610ee2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed990613826565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f28573d6000803e3d6000fd5b5050565b610f47838383604051806020016040528060008152506114f4565b505050565b610f5d610f57611808565b826118c9565b610f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f93906139c6565b60405180910390fd5b610fa581611c43565b50565b6000610fb2610d52565b8210610ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fea906139a6565b60405180910390fd5b6008828154811061100757611006613ea9565b5b90600052602060002001549050919050565b611021611bc5565b81600d8190555080600e819055505050565b600f5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d990613946565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561115c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611153906138a6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111ab611bc5565b6111b56000611d60565b565b6111bf611bc5565b8060118190555050565b60136020528060005260406000206000915090505481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611213611bc5565b80600c8190555050565b60105481565b60606001805461123290613cec565b80601f016020809104026020016040519081016040528092919081815260200182805461125e90613cec565b80156112ab5780601f10611280576101008083540402835291602001916112ab565b820191906000526020600020905b81548152906001019060200180831161128e57829003601f168201915b5050505050905090565b600c5481565b60006112c5610d52565b9050600f5442101580156112dc57506000600f5414155b61131b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131290613806565b60405180910390fd5b600d5482601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113699190613b17565b11156113aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a190613986565b60405180910390fd5b600b5482826113b99190613b17565b11156113fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f1906139e6565b60405180910390fd5b3482600c546114099190613b9e565b111561144a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144190613746565b60405180910390fd5b81601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114999190613b17565b9250508190555060005b828110156114d3576114c03382846114bb9190613b17565b61179f565b80806114cb90613d4f565b9150506114a3565b505050565b6114ea6114e3611808565b8383611e26565b5050565b600d5481565b6115056114ff611808565b836118c9565b611544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153b906139c6565b60405180910390fd5b61155084848484611f93565b50505050565b6060611561826117bd565b600061156b611fef565b9050600081511161158b57604051806020016040528060008152506115b6565b8061159584612081565b6040516020016115a6929190613663565b6040516020818303038152906040525b915050919050565b60146020528060005260406000206000915090505481565b600b5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611678611bc5565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116df906137a6565b60405180910390fd5b6116f181611d60565b50565b6116fc611bc5565b8160108190555080600f819055505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806117815750611780826121e2565b5b9050919050565b60008261179585846122c4565b1490509392505050565b6117b982826040518060200160405280600081525061231a565b5050565b6117c681612375565b611805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fc90613946565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661188383611039565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806118d583611039565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611917575061191681856115dc565b5b8061195557508373ffffffffffffffffffffffffffffffffffffffff1661193d84610bf4565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661197e82611039565b73ffffffffffffffffffffffffffffffffffffffff16146119d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cb906137c6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3b90613846565b60405180910390fd5b611a4f8383836123e1565b611a5a600082611810565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611aaa9190613bf8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b019190613b17565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611bc08383836123f1565b505050565b611bcd611808565b73ffffffffffffffffffffffffffffffffffffffff16611beb6111e1565b73ffffffffffffffffffffffffffffffffffffffff1614611c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3890613926565b60405180910390fd5b565b6000611c4e82611039565b9050611c5c816000846123e1565b611c67600083611810565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cb79190613bf8565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d5c816000846123f1565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8c90613866565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f8691906136ee565b60405180910390a3505050565b611f9e84848461195e565b611faa848484846123f6565b611fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe090613786565b60405180910390fd5b50505050565b606060128054611ffe90613cec565b80601f016020809104026020016040519081016040528092919081815260200182805461202a90613cec565b80156120775780601f1061204c57610100808354040283529160200191612077565b820191906000526020600020905b81548152906001019060200180831161205a57829003601f168201915b5050505050905090565b606060008214156120c9576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506121dd565b600082905060005b600082146120fb5780806120e490613d4f565b915050600a826120f49190613b6d565b91506120d1565b60008167ffffffffffffffff81111561211757612116613ed8565b5b6040519080825280601f01601f1916602001820160405280156121495781602001600182028036833780820191505090505b5090505b600085146121d6576001826121629190613bf8565b9150600a856121719190613dbc565b603061217d9190613b17565b60f81b81838151811061219357612192613ea9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121cf9190613b6d565b945061214d565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806122ad57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806122bd57506122bc8261258d565b5b9050919050565b60008082905060005b845181101561230f576122fa828683815181106122ed576122ec613ea9565b5b60200260200101516125f7565b9150808061230790613d4f565b9150506122cd565b508091505092915050565b6123248383612622565b61233160008484846123f6565b612370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236790613786565b60405180910390fd5b505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6123ec8383836127fc565b505050565b505050565b60006124178473ffffffffffffffffffffffffffffffffffffffff16612910565b15612580578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612440611808565b8786866040518563ffffffff1660e01b815260040161246294939291906136a2565b602060405180830381600087803b15801561247c57600080fd5b505af19250505080156124ad57506040513d601f19601f820116820180604052508101906124aa9190613111565b60015b612530573d80600081146124dd576040519150601f19603f3d011682016040523d82523d6000602084013e6124e2565b606091505b50600081511415612528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251f90613786565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612585565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081831061260f5761260a8284612933565b61261a565b6126198383612933565b5b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612692576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268990613906565b60405180910390fd5b61269b81612375565b156126db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d2906137e6565b60405180910390fd5b6126e7600083836123e1565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127379190613b17565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127f8600083836123f1565b5050565b61280783838361294a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561284a576128458161294f565b612889565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612888576128878382612998565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128cc576128c781612b05565b61290b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461290a576129098282612bd6565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016129a5846110eb565b6129af9190613bf8565b9050600060076000848152602001908152602001600020549050818114612a94576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612b199190613bf8565b9050600060096000848152602001908152602001600020549050600060088381548110612b4957612b48613ea9565b5b906000526020600020015490508060088381548110612b6b57612b6a613ea9565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612bba57612bb9613e7a565b5b6001900381819060005260206000200160009055905550505050565b6000612be1836110eb565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612c6190613cec565b90600052602060002090601f016020900481019282612c835760008555612cca565b82601f10612c9c57805160ff1916838001178555612cca565b82800160010185558215612cca579182015b82811115612cc9578251825591602001919060010190612cae565b5b509050612cd79190612cdb565b5090565b5b80821115612cf4576000816000905550600101612cdc565b5090565b6000612d0b612d0684613a46565b613a21565b90508083825260208201905082856020860282011115612d2e57612d2d613f0c565b5b60005b85811015612d5e5781612d448882612e44565b845260208401935060208301925050600181019050612d31565b5050509392505050565b6000612d7b612d7684613a72565b613a21565b905082815260208101848484011115612d9757612d96613f11565b5b612da2848285613caa565b509392505050565b6000612dbd612db884613aa3565b613a21565b905082815260208101848484011115612dd957612dd8613f11565b5b612de4848285613caa565b509392505050565b600081359050612dfb816144b2565b92915050565b600082601f830112612e1657612e15613f07565b5b8135612e26848260208601612cf8565b91505092915050565b600081359050612e3e816144c9565b92915050565b600081359050612e53816144e0565b92915050565b600081359050612e68816144f7565b92915050565b600081519050612e7d816144f7565b92915050565b600082601f830112612e9857612e97613f07565b5b8135612ea8848260208601612d68565b91505092915050565b600082601f830112612ec657612ec5613f07565b5b8135612ed6848260208601612daa565b91505092915050565b600081359050612eee8161450e565b92915050565b600060208284031215612f0a57612f09613f1b565b5b6000612f1884828501612dec565b91505092915050565b60008060408385031215612f3857612f37613f1b565b5b6000612f4685828601612dec565b9250506020612f5785828601612dec565b9150509250929050565b600080600060608486031215612f7a57612f79613f1b565b5b6000612f8886828701612dec565b9350506020612f9986828701612dec565b9250506040612faa86828701612edf565b9150509250925092565b60008060008060808587031215612fce57612fcd613f1b565b5b6000612fdc87828801612dec565b9450506020612fed87828801612dec565b9350506040612ffe87828801612edf565b925050606085013567ffffffffffffffff81111561301f5761301e613f16565b5b61302b87828801612e83565b91505092959194509250565b6000806040838503121561304e5761304d613f1b565b5b600061305c85828601612dec565b925050602061306d85828601612e2f565b9150509250929050565b6000806040838503121561308e5761308d613f1b565b5b600061309c85828601612dec565b92505060206130ad85828601612edf565b9150509250929050565b6000602082840312156130cd576130cc613f1b565b5b60006130db84828501612e44565b91505092915050565b6000602082840312156130fa576130f9613f1b565b5b600061310884828501612e59565b91505092915050565b60006020828403121561312757613126613f1b565b5b600061313584828501612e6e565b91505092915050565b60006020828403121561315457613153613f1b565b5b600082013567ffffffffffffffff81111561317257613171613f16565b5b61317e84828501612eb1565b91505092915050565b60006020828403121561319d5761319c613f1b565b5b60006131ab84828501612edf565b91505092915050565b600080604083850312156131cb576131ca613f1b565b5b60006131d985828601612edf565b925050602083013567ffffffffffffffff8111156131fa576131f9613f16565b5b61320685828601612e01565b9150509250929050565b6000806040838503121561322757613226613f1b565b5b600061323585828601612edf565b925050602061324685828601612edf565b9150509250929050565b61325981613c2c565b82525050565b61327061326b82613c2c565b613d98565b82525050565b61327f81613c3e565b82525050565b61328e81613c4a565b82525050565b600061329f82613ad4565b6132a98185613aea565b93506132b9818560208601613cb9565b6132c281613f20565b840191505092915050565b60006132d882613adf565b6132e28185613afb565b93506132f2818560208601613cb9565b6132fb81613f20565b840191505092915050565b600061331182613adf565b61331b8185613b0c565b935061332b818560208601613cb9565b80840191505092915050565b6000613344602383613afb565b915061334f82613f3e565b604082019050919050565b6000613367602b83613afb565b915061337282613f8d565b604082019050919050565b600061338a603283613afb565b915061339582613fdc565b604082019050919050565b60006133ad602683613afb565b91506133b88261402b565b604082019050919050565b60006133d0602583613afb565b91506133db8261407a565b604082019050919050565b60006133f3601c83613afb565b91506133fe826140c9565b602082019050919050565b6000613416601983613afb565b9150613421826140f2565b602082019050919050565b6000613439602983613afb565b91506134448261411b565b604082019050919050565b600061345c602483613afb565b91506134678261416a565b604082019050919050565b600061347f601983613afb565b915061348a826141b9565b602082019050919050565b60006134a2601c83613afb565b91506134ad826141e2565b602082019050919050565b60006134c5602983613afb565b91506134d08261420b565b604082019050919050565b60006134e8600f83613afb565b91506134f38261425a565b602082019050919050565b600061350b603e83613afb565b915061351682614283565b604082019050919050565b600061352e602083613afb565b9150613539826142d2565b602082019050919050565b6000613551602083613afb565b915061355c826142fb565b602082019050919050565b6000613574601883613afb565b915061357f82614324565b602082019050919050565b6000613597602183613afb565b91506135a28261434d565b604082019050919050565b60006135ba602283613afb565b91506135c58261439c565b604082019050919050565b60006135dd602c83613afb565b91506135e8826143eb565b604082019050919050565b6000613600602e83613afb565b915061360b8261443a565b604082019050919050565b6000613623600983613afb565b915061362e82614489565b602082019050919050565b61364281613ca0565b82525050565b6000613654828461325f565b60148201915081905092915050565b600061366f8285613306565b915061367b8284613306565b91508190509392505050565b600060208201905061369c6000830184613250565b92915050565b60006080820190506136b76000830187613250565b6136c46020830186613250565b6136d16040830185613639565b81810360608301526136e38184613294565b905095945050505050565b60006020820190506137036000830184613276565b92915050565b600060208201905061371e6000830184613285565b92915050565b6000602082019050818103600083015261373e81846132cd565b905092915050565b6000602082019050818103600083015261375f81613337565b9050919050565b6000602082019050818103600083015261377f8161335a565b9050919050565b6000602082019050818103600083015261379f8161337d565b9050919050565b600060208201905081810360008301526137bf816133a0565b9050919050565b600060208201905081810360008301526137df816133c3565b9050919050565b600060208201905081810360008301526137ff816133e6565b9050919050565b6000602082019050818103600083015261381f81613409565b9050919050565b6000602082019050818103600083015261383f8161342c565b9050919050565b6000602082019050818103600083015261385f8161344f565b9050919050565b6000602082019050818103600083015261387f81613472565b9050919050565b6000602082019050818103600083015261389f81613495565b9050919050565b600060208201905081810360008301526138bf816134b8565b9050919050565b600060208201905081810360008301526138df816134db565b9050919050565b600060208201905081810360008301526138ff816134fe565b9050919050565b6000602082019050818103600083015261391f81613521565b9050919050565b6000602082019050818103600083015261393f81613544565b9050919050565b6000602082019050818103600083015261395f81613567565b9050919050565b6000602082019050818103600083015261397f8161358a565b9050919050565b6000602082019050818103600083015261399f816135ad565b9050919050565b600060208201905081810360008301526139bf816135d0565b9050919050565b600060208201905081810360008301526139df816135f3565b9050919050565b600060208201905081810360008301526139ff81613616565b9050919050565b6000602082019050613a1b6000830184613639565b92915050565b6000613a2b613a3c565b9050613a378282613d1e565b919050565b6000604051905090565b600067ffffffffffffffff821115613a6157613a60613ed8565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613a8d57613a8c613ed8565b5b613a9682613f20565b9050602081019050919050565b600067ffffffffffffffff821115613abe57613abd613ed8565b5b613ac782613f20565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b2282613ca0565b9150613b2d83613ca0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b6257613b61613ded565b5b828201905092915050565b6000613b7882613ca0565b9150613b8383613ca0565b925082613b9357613b92613e1c565b5b828204905092915050565b6000613ba982613ca0565b9150613bb483613ca0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bed57613bec613ded565b5b828202905092915050565b6000613c0382613ca0565b9150613c0e83613ca0565b925082821015613c2157613c20613ded565b5b828203905092915050565b6000613c3782613c80565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613cd7578082015181840152602081019050613cbc565b83811115613ce6576000848401525b50505050565b60006002820490506001821680613d0457607f821691505b60208210811415613d1857613d17613e4b565b5b50919050565b613d2782613f20565b810181811067ffffffffffffffff82111715613d4657613d45613ed8565b5b80604052505050565b6000613d5a82613ca0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d8d57613d8c613ded565b5b600182019050919050565b6000613da382613daa565b9050919050565b6000613db582613f31565b9050919050565b6000613dc782613ca0565b9150613dd283613ca0565b925082613de257613de1613e1c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f457468657265756d20616d6f756e742073656e74206973206e6f7420636f727260008201527f6563740000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5075626c69632053616c65206973206e6f742061637469766500000000000000600082015250565b7f436f6e74726163742062616c616e63652073686f756c64206265206d6f72652060008201527f7468656e207a65726f0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f57686974656c6973742053616c65206973206e6f742061637469766500000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565646564206d617820617661696c61626c6520746f2070757263686160008201527f7365000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f536f6c64206f7574210000000000000000000000000000000000000000000000600082015250565b6144bb81613c2c565b81146144c657600080fd5b50565b6144d281613c3e565b81146144dd57600080fd5b50565b6144e981613c4a565b81146144f457600080fd5b50565b61450081613c54565b811461450b57600080fd5b50565b61451781613ca0565b811461452257600080fd5b5056fea26469706673582212204f4c144f9ff949cc7cf32988ad81e8811203bfc7368cc2c615696a03ed546b6564736f6c63430008070033

Deployed Bytecode Sourcemap

55778:3763:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59095:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57099:899;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35502:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37015:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36532:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50196:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37715:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56103:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49864:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58681:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55978:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58795:228;;;;;;;;;;;;;:::i;:::-;;38122:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48295:243;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50386:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58104:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56025:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35213:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34944:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14031:103;;;;;;;;;;;;;:::i;:::-;;58560:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56175:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13383:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58006:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56063:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35671:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55895:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56446:645;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37258:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55934:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38378:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35846:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56224:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55858:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37484:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14289:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58341:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59095:214;59235:4;59264:37;59288:12;59264:23;:37::i;:::-;59257:44;;59095:214;;;:::o;57099:899::-;57201:14;57218:13;:11;:13::i;:::-;57201:30;;57272:18;;57253:15;:37;;:64;;;;;57316:1;57294:18;;:23;;57253:64;:102;;;;;57340:15;;57321;:34;;57253:102;57245:143;;;;;;;;;;;;:::i;:::-;;;;;;;;;57448:21;;57432:12;57407:10;:22;57418:10;57407:22;;;;;;;;;;;;;;;;:37;;;;:::i;:::-;:62;;57399:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;57552:9;;57536:12;57527:6;:21;;;;:::i;:::-;:34;;57519:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;57618:9;57602:12;57594:5;;:20;;;;:::i;:::-;:33;;57586:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;57681:12;57723:10;57706:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;57696:39;;;;;;57681:54;;57754:50;57773:12;57787:10;;57799:4;57754:18;:50::i;:::-;57746:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;57863:12;57837:10;:22;57848:10;57837:22;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;57893:9;57888:103;57912:12;57908:1;:16;57888:103;;;57946:33;57956:10;57977:1;57968:6;:10;;;;:::i;:::-;57946:9;:33::i;:::-;57926:3;;;;;:::i;:::-;;;;57888:103;;;;57190:808;;57099:899;;:::o;35502:100::-;35556:13;35589:5;35582:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35502:100;:::o;37015:171::-;37091:7;37111:23;37126:7;37111:14;:23::i;:::-;37154:15;:24;37170:7;37154:24;;;;;;;;;;;;;;;;;;;;;37147:31;;37015:171;;;:::o;36532:417::-;36613:13;36629:23;36644:7;36629:14;:23::i;:::-;36613:39;;36677:5;36671:11;;:2;:11;;;;36663:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;36771:5;36755:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;36780:37;36797:5;36804:12;:10;:12::i;:::-;36780:16;:37::i;:::-;36755:62;36733:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;36920:21;36929:2;36933:7;36920:8;:21::i;:::-;36602:347;36532:417;;:::o;50196:113::-;50257:7;50284:10;:17;;;;50277:24;;50196:113;:::o;37715:336::-;37910:41;37929:12;:10;:12::i;:::-;37943:7;37910:18;:41::i;:::-;37902:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;38015:28;38025:4;38031:2;38035:7;38015:9;:28::i;:::-;37715:336;;;:::o;56103:25::-;;;;:::o;49864:256::-;49961:7;49997:23;50014:5;49997:16;:23::i;:::-;49989:5;:31;49981:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;50086:12;:19;50099:5;50086:19;;;;;;;;;;;;;;;:26;50106:5;50086:26;;;;;;;;;;;;50079:33;;49864:256;;;;:::o;58681:106::-;13269:13;:11;:13::i;:::-;58772:7:::1;58757:12;:22;;;;;;;;;;;;:::i;:::-;;58681:106:::0;:::o;55978:40::-;;;;:::o;58795:228::-;13269:13;:11;:13::i;:::-;58843:15:::1;58861:21;58843:39;;58911:1;58901:7;:11;58893:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;58985:10;58969:37;;:46;59007:7;58969:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;58832:191;58795:228::o:0;38122:185::-;38260:39;38277:4;38283:2;38287:7;38260:39;;;;;;;;;;;;:16;:39::i;:::-;38122:185;;;:::o;48295:243::-;48413:41;48432:12;:10;:12::i;:::-;48446:7;48413:18;:41::i;:::-;48405:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;48516:14;48522:7;48516:5;:14::i;:::-;48295:243;:::o;50386:233::-;50461:7;50497:30;:28;:30::i;:::-;50489:5;:38;50481:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;50594:10;50605:5;50594:17;;;;;;;;:::i;:::-;;;;;;;;;;50587:24;;50386:233;;;:::o;58104:229::-;13269:13;:11;:13::i;:::-;58245:21:::1;58224:18;:42;;;;58301:24;58277:21;:48;;;;58104:229:::0;;:::o;56025:30::-;;;;:::o;35213:222::-;35285:7;35305:13;35321:7;:16;35329:7;35321:16;;;;;;;;;;;;;;;;;;;;;35305:32;;35373:1;35356:19;;:5;:19;;;;35348:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;35422:5;35415:12;;;35213:222;;;:::o;34944:207::-;35016:7;35061:1;35044:19;;:5;:19;;;;35036:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35127:9;:16;35137:5;35127:16;;;;;;;;;;;;;;;;35120:23;;34944:207;;;:::o;14031:103::-;13269:13;:11;:13::i;:::-;14096:30:::1;14123:1;14096:18;:30::i;:::-;14031:103::o:0;58560:110::-;13269:13;:11;:13::i;:::-;58649::::1;58636:10;:26;;;;58560:110:::0;:::o;56175:42::-;;;;;;;;;;;;;;;;;:::o;13383:87::-;13429:7;13456:6;;;;;;;;;;;13449:13;;13383:87;:::o;58006:90::-;13269:13;:11;:13::i;:::-;58080:8:::1;58072:5;:16;;;;58006:90:::0;:::o;56063:33::-;;;;:::o;35671:104::-;35727:13;35760:7;35753:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35671:104;:::o;55895:32::-;;;;:::o;56446:645::-;56508:14;56525:13;:11;:13::i;:::-;56508:30;;56578:15;;56559;:34;;:58;;;;;56616:1;56597:15;;:20;;56559:58;56551:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;56704:18;;56688:12;56666:7;:19;56674:10;56666:19;;;;;;;;;;;;;;;;:34;;;;:::i;:::-;:56;;56658:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;56805:9;;56789:12;56780:6;:21;;;;:::i;:::-;:34;;56772:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;56871:9;56855:12;56847:5;;:20;;;;:::i;:::-;:33;;56839:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;56955:12;56932:7;:19;56940:10;56932:19;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;56985:9;56980:104;57004:12;57000:1;:16;56980:104;;;57038:34;57048:10;57070:1;57060:6;:11;;;;:::i;:::-;57038:9;:34::i;:::-;57018:3;;;;;:::i;:::-;;;;56980:104;;;;56497:594;56446:645;:::o;37258:155::-;37353:52;37372:12;:10;:12::i;:::-;37386:8;37396;37353:18;:52::i;:::-;37258:155;;:::o;55934:37::-;;;;:::o;38378:323::-;38552:41;38571:12;:10;:12::i;:::-;38585:7;38552:18;:41::i;:::-;38544:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;38655:38;38669:4;38675:2;38679:7;38688:4;38655:13;:38::i;:::-;38378:323;;;;:::o;35846:281::-;35919:13;35945:23;35960:7;35945:14;:23::i;:::-;35981:21;36005:10;:8;:10::i;:::-;35981:34;;36057:1;36039:7;36033:21;:25;:86;;;;;;;;;;;;;;;;;36085:7;36094:18;:7;:16;:18::i;:::-;36068:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36033:86;36026:93;;;35846:281;;;:::o;56224:45::-;;;;;;;;;;;;;;;;;:::o;55858:30::-;;;;:::o;37484:164::-;37581:4;37605:18;:25;37624:5;37605:25;;;;;;;;;;;;;;;:35;37631:8;37605:35;;;;;;;;;;;;;;;;;;;;;;;;;37598:42;;37484:164;;;;:::o;14289:201::-;13269:13;:11;:13::i;:::-;14398:1:::1;14378:22;;:8;:22;;;;14370:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14454:28;14473:8;14454:18;:28::i;:::-;14289:201:::0;:::o;58341:209::-;13269:13;:11;:13::i;:::-;58474:21:::1;58453:18;:42;;;;58524:18;58506:15;:36;;;;58341:209:::0;;:::o;49556:224::-;49658:4;49697:35;49682:50;;;:11;:50;;;;:90;;;;49736:36;49760:11;49736:23;:36::i;:::-;49682:90;49675:97;;49556:224;;;:::o;1252:190::-;1377:4;1430;1401:25;1414:5;1421:4;1401:12;:25::i;:::-;:33;1394:40;;1252:190;;;;;:::o;41108:110::-;41184:26;41194:2;41198:7;41184:26;;;;;;;;;;;;:9;:26::i;:::-;41108:110;;:::o;44990:135::-;45072:16;45080:7;45072;:16::i;:::-;45064:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;44990:135;:::o;11934:98::-;11987:7;12014:10;12007:17;;11934:98;:::o;44269:174::-;44371:2;44344:15;:24;44360:7;44344:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44427:7;44423:2;44389:46;;44398:23;44413:7;44398:14;:23::i;:::-;44389:46;;;;;;;;;;;;44269:174;;:::o;40502:264::-;40595:4;40612:13;40628:23;40643:7;40628:14;:23::i;:::-;40612:39;;40681:5;40670:16;;:7;:16;;;:52;;;;40690:32;40707:5;40714:7;40690:16;:32::i;:::-;40670:52;:87;;;;40750:7;40726:31;;:20;40738:7;40726:11;:20::i;:::-;:31;;;40670:87;40662:96;;;40502:264;;;;:::o;43525:625::-;43684:4;43657:31;;:23;43672:7;43657:14;:23::i;:::-;:31;;;43649:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;43763:1;43749:16;;:2;:16;;;;43741:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;43819:39;43840:4;43846:2;43850:7;43819:20;:39::i;:::-;43923:29;43940:1;43944:7;43923:8;:29::i;:::-;43984:1;43965:9;:15;43975:4;43965:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;44013:1;43996:9;:13;44006:2;43996:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;44044:2;44025:7;:16;44033:7;44025:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;44083:7;44079:2;44064:27;;44073:4;44064:27;;;;;;;;;;;;44104:38;44124:4;44130:2;44134:7;44104:19;:38::i;:::-;43525:625;;;:::o;13548:132::-;13623:12;:10;:12::i;:::-;13612:23;;:7;:5;:7::i;:::-;:23;;;13604:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13548:132::o;42768:420::-;42828:13;42844:23;42859:7;42844:14;:23::i;:::-;42828:39;;42880:48;42901:5;42916:1;42920:7;42880:20;:48::i;:::-;42969:29;42986:1;42990:7;42969:8;:29::i;:::-;43031:1;43011:9;:16;43021:5;43011:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;43050:7;:16;43058:7;43050:16;;;;;;;;;;;;43043:23;;;;;;;;;;;43112:7;43108:1;43084:36;;43093:5;43084:36;;;;;;;;;;;;43133:47;43153:5;43168:1;43172:7;43133:19;:47::i;:::-;42817:371;42768:420;:::o;14650:191::-;14724:16;14743:6;;;;;;;;;;;14724:25;;14769:8;14760:6;;:17;;;;;;;;;;;;;;;;;;14824:8;14793:40;;14814:8;14793:40;;;;;;;;;;;;14713:128;14650:191;:::o;44586:315::-;44741:8;44732:17;;:5;:17;;;;44724:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;44828:8;44790:18;:25;44809:5;44790:25;;;;;;;;;;;;;;;:35;44816:8;44790:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;44874:8;44852:41;;44867:5;44852:41;;;44884:8;44852:41;;;;;;:::i;:::-;;;;;;;;44586:315;;;:::o;39582:313::-;39738:28;39748:4;39754:2;39758:7;39738:9;:28::i;:::-;39785:47;39808:4;39814:2;39818:7;39827:4;39785:22;:47::i;:::-;39777:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;39582:313;;;;:::o;56333:105::-;56385:13;56418:12;56411:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56333:105;:::o;9188:723::-;9244:13;9474:1;9465:5;:10;9461:53;;;9492:10;;;;;;;;;;;;;;;;;;;;;9461:53;9524:12;9539:5;9524:20;;9555:14;9580:78;9595:1;9587:4;:9;9580:78;;9613:8;;;;;:::i;:::-;;;;9644:2;9636:10;;;;;:::i;:::-;;;9580:78;;;9668:19;9700:6;9690:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9668:39;;9718:154;9734:1;9725:5;:10;9718:154;;9762:1;9752:11;;;;;:::i;:::-;;;9829:2;9821:5;:10;;;;:::i;:::-;9808:2;:24;;;;:::i;:::-;9795:39;;9778:6;9785;9778:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9858:2;9849:11;;;;;:::i;:::-;;;9718:154;;;9896:6;9882:21;;;;;9188:723;;;;:::o;34575:305::-;34677:4;34729:25;34714:40;;;:11;:40;;;;:105;;;;34786:33;34771:48;;;:11;:48;;;;34714:105;:158;;;;34836:36;34860:11;34836:23;:36::i;:::-;34714:158;34694:178;;34575:305;;;:::o;2119:296::-;2202:7;2222:20;2245:4;2222:27;;2265:9;2260:118;2284:5;:12;2280:1;:16;2260:118;;;2333:33;2343:12;2357:5;2363:1;2357:8;;;;;;;;:::i;:::-;;;;;;;;2333:9;:33::i;:::-;2318:48;;2298:3;;;;;:::i;:::-;;;;2260:118;;;;2395:12;2388:19;;;2119:296;;;;:::o;41445:319::-;41574:18;41580:2;41584:7;41574:5;:18::i;:::-;41625:53;41656:1;41660:2;41664:7;41673:4;41625:22;:53::i;:::-;41603:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;41445:319;;;:::o;40208:127::-;40273:4;40325:1;40297:30;;:7;:16;40305:7;40297:16;;;;;;;;;;;;;;;;;;;;;:30;;;;40290:37;;40208:127;;;:::o;59317:221::-;59482:48;59509:5;59516:3;59521:8;59482:26;:48::i;:::-;59317:221;;;:::o;47625:125::-;;;;:::o;45689:853::-;45843:4;45864:15;:2;:13;;;:15::i;:::-;45860:675;;;45916:2;45900:36;;;45937:12;:10;:12::i;:::-;45951:4;45957:7;45966:4;45900:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45896:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46158:1;46141:6;:13;:18;46137:328;;;46184:60;;;;;;;;;;:::i;:::-;;;;;;;;46137:328;46415:6;46409:13;46400:6;46396:2;46392:15;46385:38;45896:584;46032:41;;;46022:51;;;:6;:51;;;;46015:58;;;;;45860:675;46519:4;46512:11;;45689:853;;;;;;;:::o;26237:157::-;26322:4;26361:25;26346:40;;;:11;:40;;;;26339:47;;26237:157;;;:::o;8326:149::-;8389:7;8420:1;8416;:5;:51;;8447:20;8462:1;8465;8447:14;:20::i;:::-;8416:51;;;8424:20;8439:1;8442;8424:14;:20::i;:::-;8416:51;8409:58;;8326:149;;;;:::o;42100:439::-;42194:1;42180:16;;:2;:16;;;;42172:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;42253:16;42261:7;42253;:16::i;:::-;42252:17;42244:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42315:45;42344:1;42348:2;42352:7;42315:20;:45::i;:::-;42390:1;42373:9;:13;42383:2;42373:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;42421:2;42402:7;:16;42410:7;42402:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42466:7;42462:2;42441:33;;42458:1;42441:33;;;;;;;;;;;;42487:44;42515:1;42519:2;42523:7;42487:19;:44::i;:::-;42100:439;;:::o;51232:589::-;51376:45;51403:4;51409:2;51413:7;51376:26;:45::i;:::-;51454:1;51438:18;;:4;:18;;;51434:187;;;51473:40;51505:7;51473:31;:40::i;:::-;51434:187;;;51543:2;51535:10;;:4;:10;;;51531:90;;51562:47;51595:4;51601:7;51562:32;:47::i;:::-;51531:90;51434:187;51649:1;51635:16;;:2;:16;;;51631:183;;;51668:45;51705:7;51668:36;:45::i;:::-;51631:183;;;51741:4;51735:10;;:2;:10;;;51731:83;;51762:40;51790:2;51794:7;51762:27;:40::i;:::-;51731:83;51631:183;51232:589;;;:::o;16081:326::-;16141:4;16398:1;16376:7;:19;;;:23;16369:30;;16081:326;;;:::o;8483:268::-;8551:13;8658:1;8652:4;8645:15;8687:1;8681:4;8674:15;8728:4;8722;8712:21;8703:30;;8483:268;;;;:::o;47114:126::-;;;;:::o;52544:164::-;52648:10;:17;;;;52621:15;:24;52637:7;52621:24;;;;;;;;;;;:44;;;;52676:10;52692:7;52676:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52544:164;:::o;53335:988::-;53601:22;53651:1;53626:22;53643:4;53626:16;:22::i;:::-;:26;;;;:::i;:::-;53601:51;;53663:18;53684:17;:26;53702:7;53684:26;;;;;;;;;;;;53663:47;;53831:14;53817:10;:28;53813:328;;53862:19;53884:12;:18;53897:4;53884:18;;;;;;;;;;;;;;;:34;53903:14;53884:34;;;;;;;;;;;;53862:56;;53968:11;53935:12;:18;53948:4;53935:18;;;;;;;;;;;;;;;:30;53954:10;53935:30;;;;;;;;;;;:44;;;;54085:10;54052:17;:30;54070:11;54052:30;;;;;;;;;;;:43;;;;53847:294;53813:328;54237:17;:26;54255:7;54237:26;;;;;;;;;;;54230:33;;;54281:12;:18;54294:4;54281:18;;;;;;;;;;;;;;;:34;54300:14;54281:34;;;;;;;;;;;54274:41;;;53416:907;;53335:988;;:::o;54618:1079::-;54871:22;54916:1;54896:10;:17;;;;:21;;;;:::i;:::-;54871:46;;54928:18;54949:15;:24;54965:7;54949:24;;;;;;;;;;;;54928:45;;55300:19;55322:10;55333:14;55322:26;;;;;;;;:::i;:::-;;;;;;;;;;55300:48;;55386:11;55361:10;55372;55361:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;55497:10;55466:15;:28;55482:11;55466:28;;;;;;;;;;;:41;;;;55638:15;:24;55654:7;55638:24;;;;;;;;;;;55631:31;;;55673:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;54689:1008;;;54618:1079;:::o;52122:221::-;52207:14;52224:20;52241:2;52224:16;:20::i;:::-;52207:37;;52282:7;52255:12;:16;52268:2;52255:16;;;;;;;;;;;;;;;:24;52272:6;52255:24;;;;;;;;;;;:34;;;;52329:6;52300:17;:26;52318:7;52300:26;;;;;;;;;;;:35;;;;52196:147;52122:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::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;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:139::-;2309:5;2347:6;2334:20;2325:29;;2363:33;2390:5;2363:33;:::i;:::-;2263:139;;;;:::o;2408:137::-;2453:5;2491:6;2478:20;2469:29;;2507:32;2533:5;2507:32;:::i;:::-;2408:137;;;;:::o;2551:141::-;2607:5;2638:6;2632:13;2623:22;;2654:32;2680:5;2654:32;:::i;:::-;2551:141;;;;:::o;2711:338::-;2766:5;2815:3;2808:4;2800:6;2796:17;2792:27;2782:122;;2823:79;;:::i;:::-;2782:122;2940:6;2927:20;2965:78;3039:3;3031:6;3024:4;3016:6;3012:17;2965:78;:::i;:::-;2956:87;;2772:277;2711:338;;;;:::o;3069:340::-;3125:5;3174:3;3167:4;3159:6;3155:17;3151:27;3141:122;;3182:79;;:::i;:::-;3141:122;3299:6;3286:20;3324:79;3399:3;3391:6;3384:4;3376:6;3372:17;3324:79;:::i;:::-;3315:88;;3131:278;3069:340;;;;:::o;3415:139::-;3461:5;3499:6;3486:20;3477:29;;3515:33;3542:5;3515:33;:::i;:::-;3415:139;;;;:::o;3560:329::-;3619:6;3668:2;3656:9;3647:7;3643:23;3639:32;3636:119;;;3674:79;;:::i;:::-;3636:119;3794:1;3819:53;3864:7;3855:6;3844:9;3840:22;3819:53;:::i;:::-;3809:63;;3765:117;3560:329;;;;:::o;3895:474::-;3963:6;3971;4020:2;4008:9;3999:7;3995:23;3991:32;3988:119;;;4026:79;;:::i;:::-;3988:119;4146:1;4171:53;4216:7;4207:6;4196:9;4192:22;4171:53;:::i;:::-;4161:63;;4117:117;4273:2;4299:53;4344:7;4335:6;4324:9;4320:22;4299:53;:::i;:::-;4289:63;;4244:118;3895:474;;;;;:::o;4375:619::-;4452:6;4460;4468;4517:2;4505:9;4496:7;4492:23;4488:32;4485:119;;;4523:79;;:::i;:::-;4485:119;4643:1;4668:53;4713:7;4704:6;4693:9;4689:22;4668:53;:::i;:::-;4658:63;;4614:117;4770:2;4796:53;4841:7;4832:6;4821:9;4817:22;4796:53;:::i;:::-;4786:63;;4741:118;4898:2;4924:53;4969:7;4960:6;4949:9;4945:22;4924:53;:::i;:::-;4914:63;;4869:118;4375:619;;;;;:::o;5000:943::-;5095:6;5103;5111;5119;5168:3;5156:9;5147:7;5143:23;5139:33;5136:120;;;5175:79;;:::i;:::-;5136:120;5295:1;5320:53;5365:7;5356:6;5345:9;5341:22;5320:53;:::i;:::-;5310:63;;5266:117;5422:2;5448:53;5493:7;5484:6;5473:9;5469:22;5448:53;:::i;:::-;5438:63;;5393:118;5550:2;5576:53;5621:7;5612:6;5601:9;5597:22;5576:53;:::i;:::-;5566:63;;5521:118;5706:2;5695:9;5691:18;5678:32;5737:18;5729:6;5726:30;5723:117;;;5759:79;;:::i;:::-;5723:117;5864:62;5918:7;5909:6;5898:9;5894:22;5864:62;:::i;:::-;5854:72;;5649:287;5000:943;;;;;;;:::o;5949:468::-;6014:6;6022;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:53;6267:7;6258:6;6247:9;6243:22;6222:53;:::i;:::-;6212:63;;6168:117;6324:2;6350:50;6392:7;6383:6;6372:9;6368:22;6350:50;:::i;:::-;6340:60;;6295:115;5949:468;;;;;:::o;6423:474::-;6491:6;6499;6548:2;6536:9;6527:7;6523:23;6519:32;6516:119;;;6554:79;;:::i;:::-;6516:119;6674:1;6699:53;6744:7;6735:6;6724:9;6720:22;6699:53;:::i;:::-;6689:63;;6645:117;6801:2;6827:53;6872:7;6863:6;6852:9;6848:22;6827:53;:::i;:::-;6817:63;;6772:118;6423:474;;;;;:::o;6903:329::-;6962:6;7011:2;6999:9;6990:7;6986:23;6982:32;6979:119;;;7017:79;;:::i;:::-;6979:119;7137:1;7162:53;7207:7;7198:6;7187:9;7183:22;7162:53;:::i;:::-;7152:63;;7108:117;6903:329;;;;:::o;7238:327::-;7296:6;7345:2;7333:9;7324:7;7320:23;7316:32;7313:119;;;7351:79;;:::i;:::-;7313:119;7471:1;7496:52;7540:7;7531:6;7520:9;7516:22;7496:52;:::i;:::-;7486:62;;7442:116;7238:327;;;;:::o;7571:349::-;7640:6;7689:2;7677:9;7668:7;7664:23;7660:32;7657:119;;;7695:79;;:::i;:::-;7657:119;7815:1;7840:63;7895:7;7886:6;7875:9;7871:22;7840:63;:::i;:::-;7830:73;;7786:127;7571:349;;;;:::o;7926:509::-;7995:6;8044:2;8032:9;8023:7;8019:23;8015:32;8012:119;;;8050:79;;:::i;:::-;8012:119;8198:1;8187:9;8183:17;8170:31;8228:18;8220:6;8217:30;8214:117;;;8250:79;;:::i;:::-;8214:117;8355:63;8410:7;8401:6;8390:9;8386:22;8355:63;:::i;:::-;8345:73;;8141:287;7926:509;;;;:::o;8441:329::-;8500:6;8549:2;8537:9;8528:7;8524:23;8520:32;8517:119;;;8555:79;;:::i;:::-;8517:119;8675:1;8700:53;8745:7;8736:6;8725:9;8721:22;8700:53;:::i;:::-;8690:63;;8646:117;8441:329;;;;:::o;8776:684::-;8869:6;8877;8926:2;8914:9;8905:7;8901:23;8897:32;8894:119;;;8932:79;;:::i;:::-;8894:119;9052:1;9077:53;9122:7;9113:6;9102:9;9098:22;9077:53;:::i;:::-;9067:63;;9023:117;9207:2;9196:9;9192:18;9179:32;9238:18;9230:6;9227:30;9224:117;;;9260:79;;:::i;:::-;9224:117;9365:78;9435:7;9426:6;9415:9;9411:22;9365:78;:::i;:::-;9355:88;;9150:303;8776:684;;;;;:::o;9466:474::-;9534:6;9542;9591:2;9579:9;9570:7;9566:23;9562:32;9559:119;;;9597:79;;:::i;:::-;9559:119;9717:1;9742:53;9787:7;9778:6;9767:9;9763:22;9742:53;:::i;:::-;9732:63;;9688:117;9844:2;9870:53;9915:7;9906:6;9895:9;9891:22;9870:53;:::i;:::-;9860:63;;9815:118;9466:474;;;;;:::o;9946:118::-;10033:24;10051:5;10033:24;:::i;:::-;10028:3;10021:37;9946:118;;:::o;10070:157::-;10175:45;10195:24;10213:5;10195:24;:::i;:::-;10175:45;:::i;:::-;10170:3;10163:58;10070:157;;:::o;10233:109::-;10314:21;10329:5;10314:21;:::i;:::-;10309:3;10302:34;10233:109;;:::o;10348:118::-;10435:24;10453:5;10435:24;:::i;:::-;10430:3;10423:37;10348:118;;:::o;10472:360::-;10558:3;10586:38;10618:5;10586:38;:::i;:::-;10640:70;10703:6;10698:3;10640:70;:::i;:::-;10633:77;;10719:52;10764:6;10759:3;10752:4;10745:5;10741:16;10719:52;:::i;:::-;10796:29;10818:6;10796:29;:::i;:::-;10791:3;10787:39;10780:46;;10562:270;10472:360;;;;:::o;10838:364::-;10926:3;10954:39;10987:5;10954:39;:::i;:::-;11009:71;11073:6;11068:3;11009:71;:::i;:::-;11002:78;;11089:52;11134:6;11129:3;11122:4;11115:5;11111:16;11089:52;:::i;:::-;11166:29;11188:6;11166:29;:::i;:::-;11161:3;11157:39;11150:46;;10930:272;10838:364;;;;:::o;11208:377::-;11314:3;11342:39;11375:5;11342:39;:::i;:::-;11397:89;11479:6;11474:3;11397:89;:::i;:::-;11390:96;;11495:52;11540:6;11535:3;11528:4;11521:5;11517:16;11495:52;:::i;:::-;11572:6;11567:3;11563:16;11556:23;;11318:267;11208:377;;;;:::o;11591:366::-;11733:3;11754:67;11818:2;11813:3;11754:67;:::i;:::-;11747:74;;11830:93;11919:3;11830:93;:::i;:::-;11948:2;11943:3;11939:12;11932:19;;11591:366;;;:::o;11963:::-;12105:3;12126:67;12190:2;12185:3;12126:67;:::i;:::-;12119:74;;12202:93;12291:3;12202:93;:::i;:::-;12320:2;12315:3;12311:12;12304:19;;11963:366;;;:::o;12335:::-;12477:3;12498:67;12562:2;12557:3;12498:67;:::i;:::-;12491:74;;12574:93;12663:3;12574:93;:::i;:::-;12692:2;12687:3;12683:12;12676:19;;12335:366;;;:::o;12707:::-;12849:3;12870:67;12934:2;12929:3;12870:67;:::i;:::-;12863:74;;12946:93;13035:3;12946:93;:::i;:::-;13064:2;13059:3;13055:12;13048:19;;12707:366;;;:::o;13079:::-;13221:3;13242:67;13306:2;13301:3;13242:67;:::i;:::-;13235:74;;13318:93;13407:3;13318:93;:::i;:::-;13436:2;13431:3;13427:12;13420:19;;13079:366;;;:::o;13451:::-;13593:3;13614:67;13678:2;13673:3;13614:67;:::i;:::-;13607:74;;13690:93;13779:3;13690:93;:::i;:::-;13808:2;13803:3;13799:12;13792:19;;13451:366;;;:::o;13823:::-;13965:3;13986:67;14050:2;14045:3;13986:67;:::i;:::-;13979:74;;14062:93;14151:3;14062:93;:::i;:::-;14180:2;14175:3;14171:12;14164:19;;13823:366;;;:::o;14195:::-;14337:3;14358:67;14422:2;14417:3;14358:67;:::i;:::-;14351:74;;14434:93;14523:3;14434:93;:::i;:::-;14552:2;14547:3;14543:12;14536:19;;14195:366;;;:::o;14567:::-;14709:3;14730:67;14794:2;14789:3;14730:67;:::i;:::-;14723:74;;14806:93;14895:3;14806:93;:::i;:::-;14924:2;14919:3;14915:12;14908:19;;14567:366;;;:::o;14939:::-;15081:3;15102:67;15166:2;15161:3;15102:67;:::i;:::-;15095:74;;15178:93;15267:3;15178:93;:::i;:::-;15296:2;15291:3;15287:12;15280:19;;14939:366;;;:::o;15311:::-;15453:3;15474:67;15538:2;15533:3;15474:67;:::i;:::-;15467:74;;15550:93;15639:3;15550:93;:::i;:::-;15668:2;15663:3;15659:12;15652:19;;15311:366;;;:::o;15683:::-;15825:3;15846:67;15910:2;15905:3;15846:67;:::i;:::-;15839:74;;15922:93;16011:3;15922:93;:::i;:::-;16040:2;16035:3;16031:12;16024:19;;15683:366;;;:::o;16055:::-;16197:3;16218:67;16282:2;16277:3;16218:67;:::i;:::-;16211:74;;16294:93;16383:3;16294:93;:::i;:::-;16412:2;16407:3;16403:12;16396:19;;16055:366;;;:::o;16427:::-;16569:3;16590:67;16654:2;16649:3;16590:67;:::i;:::-;16583:74;;16666:93;16755:3;16666:93;:::i;:::-;16784:2;16779:3;16775:12;16768:19;;16427:366;;;:::o;16799:::-;16941:3;16962:67;17026:2;17021:3;16962:67;:::i;:::-;16955:74;;17038:93;17127:3;17038:93;:::i;:::-;17156:2;17151:3;17147:12;17140:19;;16799:366;;;:::o;17171:::-;17313:3;17334:67;17398:2;17393:3;17334:67;:::i;:::-;17327:74;;17410:93;17499:3;17410:93;:::i;:::-;17528:2;17523:3;17519:12;17512:19;;17171:366;;;:::o;17543:::-;17685:3;17706:67;17770:2;17765:3;17706:67;:::i;:::-;17699:74;;17782:93;17871:3;17782:93;:::i;:::-;17900:2;17895:3;17891:12;17884:19;;17543:366;;;:::o;17915:::-;18057:3;18078:67;18142:2;18137:3;18078:67;:::i;:::-;18071:74;;18154:93;18243:3;18154:93;:::i;:::-;18272:2;18267:3;18263:12;18256:19;;17915:366;;;:::o;18287:::-;18429:3;18450:67;18514:2;18509:3;18450:67;:::i;:::-;18443:74;;18526:93;18615:3;18526:93;:::i;:::-;18644:2;18639:3;18635:12;18628:19;;18287:366;;;:::o;18659:::-;18801:3;18822:67;18886:2;18881:3;18822:67;:::i;:::-;18815:74;;18898:93;18987:3;18898:93;:::i;:::-;19016:2;19011:3;19007:12;19000:19;;18659:366;;;:::o;19031:::-;19173:3;19194:67;19258:2;19253:3;19194:67;:::i;:::-;19187:74;;19270:93;19359:3;19270:93;:::i;:::-;19388:2;19383:3;19379:12;19372:19;;19031:366;;;:::o;19403:365::-;19545:3;19566:66;19630:1;19625:3;19566:66;:::i;:::-;19559:73;;19641:93;19730:3;19641:93;:::i;:::-;19759:2;19754:3;19750:12;19743:19;;19403:365;;;:::o;19774:118::-;19861:24;19879:5;19861:24;:::i;:::-;19856:3;19849:37;19774:118;;:::o;19898:256::-;20010:3;20025:75;20096:3;20087:6;20025:75;:::i;:::-;20125:2;20120:3;20116:12;20109:19;;20145:3;20138:10;;19898:256;;;;:::o;20160:435::-;20340:3;20362:95;20453:3;20444:6;20362:95;:::i;:::-;20355:102;;20474:95;20565:3;20556:6;20474:95;:::i;:::-;20467:102;;20586:3;20579:10;;20160:435;;;;;:::o;20601:222::-;20694:4;20732:2;20721:9;20717:18;20709:26;;20745:71;20813:1;20802:9;20798:17;20789:6;20745:71;:::i;:::-;20601:222;;;;:::o;20829:640::-;21024:4;21062:3;21051:9;21047:19;21039:27;;21076:71;21144:1;21133:9;21129:17;21120:6;21076:71;:::i;:::-;21157:72;21225:2;21214:9;21210:18;21201:6;21157:72;:::i;:::-;21239;21307:2;21296:9;21292:18;21283:6;21239:72;:::i;:::-;21358:9;21352:4;21348:20;21343:2;21332:9;21328:18;21321:48;21386:76;21457:4;21448:6;21386:76;:::i;:::-;21378:84;;20829:640;;;;;;;:::o;21475:210::-;21562:4;21600:2;21589:9;21585:18;21577:26;;21613:65;21675:1;21664:9;21660:17;21651:6;21613:65;:::i;:::-;21475:210;;;;:::o;21691:222::-;21784:4;21822:2;21811:9;21807:18;21799:26;;21835:71;21903:1;21892:9;21888:17;21879:6;21835:71;:::i;:::-;21691:222;;;;:::o;21919:313::-;22032:4;22070:2;22059:9;22055:18;22047:26;;22119:9;22113:4;22109:20;22105:1;22094:9;22090:17;22083:47;22147:78;22220:4;22211:6;22147:78;:::i;:::-;22139:86;;21919:313;;;;:::o;22238:419::-;22404:4;22442:2;22431:9;22427:18;22419:26;;22491:9;22485:4;22481:20;22477:1;22466:9;22462:17;22455:47;22519:131;22645:4;22519:131;:::i;:::-;22511:139;;22238:419;;;:::o;22663:::-;22829:4;22867:2;22856:9;22852:18;22844:26;;22916:9;22910:4;22906:20;22902:1;22891:9;22887:17;22880:47;22944:131;23070:4;22944:131;:::i;:::-;22936:139;;22663:419;;;:::o;23088:::-;23254:4;23292:2;23281:9;23277:18;23269:26;;23341:9;23335:4;23331:20;23327:1;23316:9;23312:17;23305:47;23369:131;23495:4;23369:131;:::i;:::-;23361:139;;23088:419;;;:::o;23513:::-;23679:4;23717:2;23706:9;23702:18;23694:26;;23766:9;23760:4;23756:20;23752:1;23741:9;23737:17;23730:47;23794:131;23920:4;23794:131;:::i;:::-;23786:139;;23513:419;;;:::o;23938:::-;24104:4;24142:2;24131:9;24127:18;24119:26;;24191:9;24185:4;24181:20;24177:1;24166:9;24162:17;24155:47;24219:131;24345:4;24219:131;:::i;:::-;24211:139;;23938:419;;;:::o;24363:::-;24529:4;24567:2;24556:9;24552:18;24544:26;;24616:9;24610:4;24606:20;24602:1;24591:9;24587:17;24580:47;24644:131;24770:4;24644:131;:::i;:::-;24636:139;;24363:419;;;:::o;24788:::-;24954:4;24992:2;24981:9;24977:18;24969:26;;25041:9;25035:4;25031:20;25027:1;25016:9;25012:17;25005:47;25069:131;25195:4;25069:131;:::i;:::-;25061:139;;24788:419;;;:::o;25213:::-;25379:4;25417:2;25406:9;25402:18;25394:26;;25466:9;25460:4;25456:20;25452:1;25441:9;25437:17;25430:47;25494:131;25620:4;25494:131;:::i;:::-;25486:139;;25213:419;;;:::o;25638:::-;25804:4;25842:2;25831:9;25827:18;25819:26;;25891:9;25885:4;25881:20;25877:1;25866:9;25862:17;25855:47;25919:131;26045:4;25919:131;:::i;:::-;25911:139;;25638:419;;;:::o;26063:::-;26229:4;26267:2;26256:9;26252:18;26244:26;;26316:9;26310:4;26306:20;26302:1;26291:9;26287:17;26280:47;26344:131;26470:4;26344:131;:::i;:::-;26336:139;;26063:419;;;:::o;26488:::-;26654:4;26692:2;26681:9;26677:18;26669:26;;26741:9;26735:4;26731:20;26727:1;26716:9;26712:17;26705:47;26769:131;26895:4;26769:131;:::i;:::-;26761:139;;26488:419;;;:::o;26913:::-;27079:4;27117:2;27106:9;27102:18;27094:26;;27166:9;27160:4;27156:20;27152:1;27141:9;27137:17;27130:47;27194:131;27320:4;27194:131;:::i;:::-;27186:139;;26913:419;;;:::o;27338:::-;27504:4;27542:2;27531:9;27527:18;27519:26;;27591:9;27585:4;27581:20;27577:1;27566:9;27562:17;27555:47;27619:131;27745:4;27619:131;:::i;:::-;27611:139;;27338:419;;;:::o;27763:::-;27929:4;27967:2;27956:9;27952:18;27944:26;;28016:9;28010:4;28006:20;28002:1;27991:9;27987:17;27980:47;28044:131;28170:4;28044:131;:::i;:::-;28036:139;;27763:419;;;:::o;28188:::-;28354:4;28392:2;28381:9;28377:18;28369:26;;28441:9;28435:4;28431:20;28427:1;28416:9;28412:17;28405:47;28469:131;28595:4;28469:131;:::i;:::-;28461:139;;28188:419;;;:::o;28613:::-;28779:4;28817:2;28806:9;28802:18;28794:26;;28866:9;28860:4;28856:20;28852:1;28841:9;28837:17;28830:47;28894:131;29020:4;28894:131;:::i;:::-;28886:139;;28613:419;;;:::o;29038:::-;29204:4;29242:2;29231:9;29227:18;29219:26;;29291:9;29285:4;29281:20;29277:1;29266:9;29262:17;29255:47;29319:131;29445:4;29319:131;:::i;:::-;29311:139;;29038:419;;;:::o;29463:::-;29629:4;29667:2;29656:9;29652:18;29644:26;;29716:9;29710:4;29706:20;29702:1;29691:9;29687:17;29680:47;29744:131;29870:4;29744:131;:::i;:::-;29736:139;;29463:419;;;:::o;29888:::-;30054:4;30092:2;30081:9;30077:18;30069:26;;30141:9;30135:4;30131:20;30127:1;30116:9;30112:17;30105:47;30169:131;30295:4;30169:131;:::i;:::-;30161:139;;29888:419;;;:::o;30313:::-;30479:4;30517:2;30506:9;30502:18;30494:26;;30566:9;30560:4;30556:20;30552:1;30541:9;30537:17;30530:47;30594:131;30720:4;30594:131;:::i;:::-;30586:139;;30313:419;;;:::o;30738:::-;30904:4;30942:2;30931:9;30927:18;30919:26;;30991:9;30985:4;30981:20;30977:1;30966:9;30962:17;30955:47;31019:131;31145:4;31019:131;:::i;:::-;31011:139;;30738:419;;;:::o;31163:::-;31329:4;31367:2;31356:9;31352:18;31344:26;;31416:9;31410:4;31406:20;31402:1;31391:9;31387:17;31380:47;31444:131;31570:4;31444:131;:::i;:::-;31436:139;;31163:419;;;:::o;31588:222::-;31681:4;31719:2;31708:9;31704:18;31696:26;;31732:71;31800:1;31789:9;31785:17;31776:6;31732:71;:::i;:::-;31588:222;;;;:::o;31816:129::-;31850:6;31877:20;;:::i;:::-;31867:30;;31906:33;31934:4;31926:6;31906:33;:::i;:::-;31816:129;;;:::o;31951:75::-;31984:6;32017:2;32011:9;32001:19;;31951:75;:::o;32032:311::-;32109:4;32199:18;32191:6;32188:30;32185:56;;;32221:18;;:::i;:::-;32185:56;32271:4;32263:6;32259:17;32251:25;;32331:4;32325;32321:15;32313:23;;32032:311;;;:::o;32349:307::-;32410:4;32500:18;32492:6;32489:30;32486:56;;;32522:18;;:::i;:::-;32486:56;32560:29;32582:6;32560:29;:::i;:::-;32552:37;;32644:4;32638;32634:15;32626:23;;32349:307;;;:::o;32662:308::-;32724:4;32814:18;32806:6;32803:30;32800:56;;;32836:18;;:::i;:::-;32800:56;32874:29;32896:6;32874:29;:::i;:::-;32866:37;;32958:4;32952;32948:15;32940:23;;32662:308;;;:::o;32976:98::-;33027:6;33061:5;33055:12;33045:22;;32976:98;;;:::o;33080:99::-;33132:6;33166:5;33160:12;33150:22;;33080:99;;;:::o;33185:168::-;33268:11;33302:6;33297:3;33290:19;33342:4;33337:3;33333:14;33318:29;;33185:168;;;;:::o;33359:169::-;33443:11;33477:6;33472:3;33465:19;33517:4;33512:3;33508:14;33493:29;;33359:169;;;;:::o;33534:148::-;33636:11;33673:3;33658:18;;33534:148;;;;:::o;33688:305::-;33728:3;33747:20;33765:1;33747:20;:::i;:::-;33742:25;;33781:20;33799:1;33781:20;:::i;:::-;33776:25;;33935:1;33867:66;33863:74;33860:1;33857:81;33854:107;;;33941:18;;:::i;:::-;33854:107;33985:1;33982;33978:9;33971:16;;33688:305;;;;:::o;33999:185::-;34039:1;34056:20;34074:1;34056:20;:::i;:::-;34051:25;;34090:20;34108:1;34090:20;:::i;:::-;34085:25;;34129:1;34119:35;;34134:18;;:::i;:::-;34119:35;34176:1;34173;34169:9;34164:14;;33999:185;;;;:::o;34190:348::-;34230:7;34253:20;34271:1;34253:20;:::i;:::-;34248:25;;34287:20;34305:1;34287:20;:::i;:::-;34282:25;;34475:1;34407:66;34403:74;34400:1;34397:81;34392:1;34385:9;34378:17;34374:105;34371:131;;;34482:18;;:::i;:::-;34371:131;34530:1;34527;34523:9;34512:20;;34190:348;;;;:::o;34544:191::-;34584:4;34604:20;34622:1;34604:20;:::i;:::-;34599:25;;34638:20;34656:1;34638:20;:::i;:::-;34633:25;;34677:1;34674;34671:8;34668:34;;;34682:18;;:::i;:::-;34668:34;34727:1;34724;34720:9;34712:17;;34544:191;;;;:::o;34741:96::-;34778:7;34807:24;34825:5;34807:24;:::i;:::-;34796:35;;34741:96;;;:::o;34843:90::-;34877:7;34920:5;34913:13;34906:21;34895:32;;34843:90;;;:::o;34939:77::-;34976:7;35005:5;34994:16;;34939:77;;;:::o;35022:149::-;35058:7;35098:66;35091:5;35087:78;35076:89;;35022:149;;;:::o;35177:126::-;35214:7;35254:42;35247:5;35243:54;35232:65;;35177:126;;;:::o;35309:77::-;35346:7;35375:5;35364:16;;35309:77;;;:::o;35392:154::-;35476:6;35471:3;35466;35453:30;35538:1;35529:6;35524:3;35520:16;35513:27;35392:154;;;:::o;35552:307::-;35620:1;35630:113;35644:6;35641:1;35638:13;35630:113;;;35729:1;35724:3;35720:11;35714:18;35710:1;35705:3;35701:11;35694:39;35666:2;35663:1;35659:10;35654:15;;35630:113;;;35761:6;35758:1;35755:13;35752:101;;;35841:1;35832:6;35827:3;35823:16;35816:27;35752:101;35601:258;35552:307;;;:::o;35865:320::-;35909:6;35946:1;35940:4;35936:12;35926:22;;35993:1;35987:4;35983:12;36014:18;36004:81;;36070:4;36062:6;36058:17;36048:27;;36004:81;36132:2;36124:6;36121:14;36101:18;36098:38;36095:84;;;36151:18;;:::i;:::-;36095:84;35916:269;35865:320;;;:::o;36191:281::-;36274:27;36296:4;36274:27;:::i;:::-;36266:6;36262:40;36404:6;36392:10;36389:22;36368:18;36356:10;36353:34;36350:62;36347:88;;;36415:18;;:::i;:::-;36347:88;36455:10;36451:2;36444:22;36234:238;36191:281;;:::o;36478:233::-;36517:3;36540:24;36558:5;36540:24;:::i;:::-;36531:33;;36586:66;36579:5;36576:77;36573:103;;;36656:18;;:::i;:::-;36573:103;36703:1;36696:5;36692:13;36685:20;;36478:233;;;:::o;36717:100::-;36756:7;36785:26;36805:5;36785:26;:::i;:::-;36774:37;;36717:100;;;:::o;36823:94::-;36862:7;36891:20;36905:5;36891:20;:::i;:::-;36880:31;;36823:94;;;:::o;36923:176::-;36955:1;36972:20;36990:1;36972:20;:::i;:::-;36967:25;;37006:20;37024:1;37006:20;:::i;:::-;37001:25;;37045:1;37035:35;;37050:18;;:::i;:::-;37035:35;37091:1;37088;37084:9;37079:14;;36923:176;;;;:::o;37105:180::-;37153:77;37150:1;37143:88;37250:4;37247:1;37240:15;37274:4;37271:1;37264:15;37291:180;37339:77;37336:1;37329:88;37436:4;37433:1;37426:15;37460:4;37457:1;37450:15;37477:180;37525:77;37522:1;37515:88;37622:4;37619:1;37612:15;37646:4;37643:1;37636:15;37663:180;37711:77;37708:1;37701:88;37808:4;37805:1;37798:15;37832:4;37829:1;37822:15;37849:180;37897:77;37894:1;37887:88;37994:4;37991:1;37984:15;38018:4;38015:1;38008:15;38035:180;38083:77;38080:1;38073:88;38180:4;38177:1;38170:15;38204:4;38201:1;38194:15;38221:117;38330:1;38327;38320:12;38344:117;38453:1;38450;38443:12;38467:117;38576:1;38573;38566:12;38590:117;38699:1;38696;38689:12;38713:117;38822:1;38819;38812:12;38836:102;38877:6;38928:2;38924:7;38919:2;38912:5;38908:14;38904:28;38894:38;;38836:102;;;:::o;38944:94::-;38977:8;39025:5;39021:2;39017:14;38996:35;;38944:94;;;:::o;39044:222::-;39184:34;39180:1;39172:6;39168:14;39161:58;39253:5;39248:2;39240:6;39236:15;39229:30;39044:222;:::o;39272:230::-;39412:34;39408:1;39400:6;39396:14;39389:58;39481:13;39476:2;39468:6;39464:15;39457:38;39272:230;:::o;39508:237::-;39648:34;39644:1;39636:6;39632:14;39625:58;39717:20;39712:2;39704:6;39700:15;39693:45;39508:237;:::o;39751:225::-;39891:34;39887:1;39879:6;39875:14;39868:58;39960:8;39955:2;39947:6;39943:15;39936:33;39751:225;:::o;39982:224::-;40122:34;40118:1;40110:6;40106:14;40099:58;40191:7;40186:2;40178:6;40174:15;40167:32;39982:224;:::o;40212:178::-;40352:30;40348:1;40340:6;40336:14;40329:54;40212:178;:::o;40396:175::-;40536:27;40532:1;40524:6;40520:14;40513:51;40396:175;:::o;40577:228::-;40717:34;40713:1;40705:6;40701:14;40694:58;40786:11;40781:2;40773:6;40769:15;40762:36;40577:228;:::o;40811:223::-;40951:34;40947:1;40939:6;40935:14;40928:58;41020:6;41015:2;41007:6;41003:15;40996:31;40811:223;:::o;41040:175::-;41180:27;41176:1;41168:6;41164:14;41157:51;41040:175;:::o;41221:178::-;41361:30;41357:1;41349:6;41345:14;41338:54;41221:178;:::o;41405:228::-;41545:34;41541:1;41533:6;41529:14;41522:58;41614:11;41609:2;41601:6;41597:15;41590:36;41405:228;:::o;41639:165::-;41779:17;41775:1;41767:6;41763:14;41756:41;41639:165;:::o;41810:249::-;41950:34;41946:1;41938:6;41934:14;41927:58;42019:32;42014:2;42006:6;42002:15;41995:57;41810:249;:::o;42065:182::-;42205:34;42201:1;42193:6;42189:14;42182:58;42065:182;:::o;42253:::-;42393:34;42389:1;42381:6;42377:14;42370:58;42253:182;:::o;42441:174::-;42581:26;42577:1;42569:6;42565:14;42558:50;42441:174;:::o;42621:220::-;42761:34;42757:1;42749:6;42745:14;42738:58;42830:3;42825:2;42817:6;42813:15;42806:28;42621:220;:::o;42847:221::-;42987:34;42983:1;42975:6;42971:14;42964:58;43056:4;43051:2;43043:6;43039:15;43032:29;42847:221;:::o;43074:231::-;43214:34;43210:1;43202:6;43198:14;43191:58;43283:14;43278:2;43270:6;43266:15;43259:39;43074:231;:::o;43311:233::-;43451:34;43447:1;43439:6;43435:14;43428:58;43520:16;43515:2;43507:6;43503:15;43496:41;43311:233;:::o;43550:159::-;43690:11;43686:1;43678:6;43674:14;43667:35;43550:159;:::o;43715:122::-;43788:24;43806:5;43788:24;:::i;:::-;43781:5;43778:35;43768:63;;43827:1;43824;43817:12;43768:63;43715:122;:::o;43843:116::-;43913:21;43928:5;43913:21;:::i;:::-;43906:5;43903:32;43893:60;;43949:1;43946;43939:12;43893:60;43843:116;:::o;43965:122::-;44038:24;44056:5;44038:24;:::i;:::-;44031:5;44028:35;44018:63;;44077:1;44074;44067:12;44018:63;43965:122;:::o;44093:120::-;44165:23;44182:5;44165:23;:::i;:::-;44158:5;44155:34;44145:62;;44203:1;44200;44193:12;44145:62;44093:120;:::o;44219:122::-;44292:24;44310:5;44292:24;:::i;:::-;44285:5;44282:35;44272:63;;44331:1;44328;44321:12;44272:63;44219:122;:::o

Swarm Source

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