ETH Price: $3,390.78 (-1.50%)
Gas: 2 Gwei

Token

Degen Heroes (DH)
 

Overview

Max Total Supply

1,952 DH

Holders

895

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
notikigai.eth
Balance
1 DH
0xd13ff2a4a6d77468bd651323909cd0cf174b2988
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Minter? Flipper? Hodler? No. You are a Degen Hero. Degen Heroes are rewarded for their efforts on a journey through our extensive roadmap.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
DegenHeroes

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-03-25
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/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.5.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: balance query for the zero address");
        return _balances[owner];
    }

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

        _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 a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

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

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

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

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

// SPDX-Licence-Identifier: MIT
pragma solidity >=0.7.0 <0.9.0;






contract DegenHeroes is ERC721Enumerable, Ownable {
    using Strings for uint256;
    using Counters for Counters.Counter;

    Counters.Counter private supply;

    string public uriPrefix = "ipfs://QmVjKqPEvZobdpyaZfLLh4AcFYgeeXAgWkDYYcV3WPdFcG/";
    string public uriSuffix = ".json";
    string public hiddenMetadataUri;

    // Merkle Tree Root Address  - Gas Optimisation
    bytes32 public whitelistMerkleRoot = 0x04bdf24b89de0680b378b190475b4c2adad019a7b6831937f0f36b9db9f2dbf5;

    uint256 public presaleCost = .075 ether;
    uint256 public publicsaleCost = .075 ether;

    uint256 public maxSupply = 10000;
    uint256 public maxMintAmountPerTx = 4;
    uint256 public nftPerAddressLimit = 4;

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

    mapping(address => uint256) public addressMintedBalance;
    
    constructor() ERC721("Degen Heroes", "DH") {
        setHiddenMetadataUri("https://degenheroes.mypinata.cloud/ipfs/QmdTpg1KFzzFU7sbtmQifUKxL486Hodvg9q5RnzixC6Epd/prereveal.json");
    }

    // Mint Compliance
    modifier mintCompliance(uint256 _mintAmount) {
        if (msg.sender != owner()) {
            uint256 ownerMintedCount = addressMintedBalance[msg.sender];
            require(ownerMintedCount + _mintAmount <= nftPerAddressLimit, "Max NFT per address exceeded");
            require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Invalid mint amount");
        }
        require(supply.current() + _mintAmount < maxSupply, "Max supply exceeded");
        _;
    }

    // Mint
    function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) {
        require(!paused, "The contract is paused");
        
        if (msg.sender != owner()) {
            if (presale == true) {
                require(msg.value >= presaleCost * _mintAmount, "Insufficient funds!");
            } else {
                require(msg.value >= publicsaleCost * _mintAmount, "Insufficient funds!");
            }
        }

        _mintLoop(msg.sender, _mintAmount);

    }

    modifier isValidMerkleProof(bytes32[] calldata merkleProof, bytes32 root) {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(
            MerkleProof.verify(
                merkleProof,
                root,
                leaf
            ),
            "Address is not whitelisted"
        );
        _;
    }

    // Whitelist mint
    function mintWhitelist(bytes32[] calldata merkleProof, uint256 _mintAmount)
        public
        payable
        isValidMerkleProof(merkleProof, whitelistMerkleRoot)
        mintCompliance(_mintAmount)
    {
        require(!paused, "The contract is paused");
        if (msg.sender != owner()) {
            if (presale == true) {
                require(msg.value >= presaleCost * _mintAmount, "Insufficient funds!");
            } else {
                require(presale);
            }
        }

        _mintLoop(msg.sender, _mintAmount);

    }

    function setWhitelistMerkleRoot(bytes32 merkleRoot) external onlyOwner {
        whitelistMerkleRoot = merkleRoot;
    }

    // Mint for Addresses
    function mintForAddress( uint256 _mintAmount, address _reciever) public mintCompliance(_mintAmount) onlyOwner {
        _mintLoop(_reciever, _mintAmount);
    }


    // Mint Loop
    function _mintLoop(address _reciever, uint256 _mintAmount) internal {
        for (uint256 i = 0; i < _mintAmount; i++) {
            supply.increment();
            addressMintedBalance[msg.sender]++;
            _safeMint(_reciever, supply.current());
        }
    }

    // Total Supply
    function totalSupply() public override view returns(uint256) {
        return supply.current();
    }


    // Wallet of Owner
    function walletOfOwner(address _owner) public view returns (uint256[] memory) {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
        uint256 currentTokenId = 1;
        uint256 ownedTokenIndex = 0;

        while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
            address currentTokenOwner = ownerOf(currentTokenId);

            if(currentTokenOwner == _owner) {
                ownedTokenIds[ownedTokenIndex] = currentTokenId;
                ownedTokenIndex++;
            }
            
            currentTokenId++;
        }

        return ownedTokenIds;
    }

    // Token URI
    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");

        if (revealed == false) {
            return hiddenMetadataUri;
        }

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

    // Set Max Mint Amount Per TX
    function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx)  public onlyOwner {
        maxMintAmountPerTx = _maxMintAmountPerTx;
    }

    // Set Presale Cost
    function setPresaleCost(uint256 _cost) public onlyOwner {
        presaleCost = _cost;
    }

    // Set Publicsale Cost
    function setPublicsaleCost(uint256 _cost) public onlyOwner {
        publicsaleCost = _cost;
    }

    // Set Presale
    function setPresale(bool _state) public onlyOwner {
        presale = _state;
    }


    // Set Hidden Metadata URI
    function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
        hiddenMetadataUri = _hiddenMetadataUri;
    }

    // Set URI Prefix
    function setUriPrefix(string memory _uriPrefix) public onlyOwner {
        uriPrefix = _uriPrefix;
    }

    // Set URI Sufix
    function setUriSuffix(string memory _uriSuffix) public onlyOwner {
        uriSuffix = _uriSuffix;
    }

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

    // Get Cost
    function cost() public view returns(uint256) {
        if (presale == true) {
            return presaleCost;
        }
        return publicsaleCost;
    }

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

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

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

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":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_reciever","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicsaleCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setPresaleCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setPublicsaleCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setWhitelistMerkleRoot","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":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withDraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180606001604052806036815260200162005cbd60369139600c908051906020019062000035929190620003c5565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d908051906020019062000083929190620003c5565b507f04bdf24b89de0680b378b190475b4c2adad019a7b6831937f0f36b9db9f2dbf560001b600f5567010a741a4627800060105567010a741a46278000601155612710601255600460135560046014556000601560006101000a81548160ff0219169083151502179055506000601560016101000a81548160ff0219169083151502179055506001601560026101000a81548160ff0219169083151502179055503480156200013157600080fd5b506040518060400160405280600c81526020017f446567656e204865726f657300000000000000000000000000000000000000008152506040518060400160405280600281526020017f44480000000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001b6929190620003c5565b508060019080519060200190620001cf929190620003c5565b505050620001f2620001e66200022260201b60201c565b6200022a60201b60201c565b6200021c6040518060a001604052806065815260200162005c5860659139620002f060201b60201c565b6200055d565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003006200022260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003266200039b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200037f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000376906200049c565b60405180910390fd5b80600e908051906020019062000397929190620003c5565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003d390620004cf565b90600052602060002090601f016020900481019282620003f7576000855562000443565b82601f106200041257805160ff191683800117855562000443565b8280016001018555821562000443579182015b828111156200044257825182559160200191906001019062000425565b5b50905062000452919062000456565b5090565b5b808211156200047157600081600090555060010162000457565b5090565b600062000484602083620004be565b9150620004918262000534565b602082019050919050565b60006020820190508181036000830152620004b78162000475565b9050919050565b600082825260208201905092915050565b60006002820490506001821680620004e857607f821691505b60208210811415620004ff57620004fe62000505565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6156eb806200056d6000396000f3fe6080604052600436106102935760003560e01c8063715018a61161015a578063b071401b116100c1578063d5abeb011161007a578063d5abeb01146109e6578063e0a8085314610a11578063e985e9c514610a3a578063efbd73f414610a77578063f2fde38b14610aa0578063fdea8e0b14610ac957610293565b8063b071401b146108da578063b88d4fde14610903578063ba7d2c761461092c578063bd32fb6614610957578063c54e73e314610980578063c87b56dd146109a957610293565b806395d89b411161011357806395d89b41146107f8578063a0712d6814610823578063a22cb4651461083f578063a45ba8e714610868578063a6d612f914610893578063aa98e0c6146108af57610293565b8063715018a61461070e5780637ec4a659146107255780638da5cb5b1461074e5780638fdcf9421461077957806392829d74146107a257806394354fd0146107cd57610293565b80632f745c59116101fe5780635503a0e8116101b75780635503a0e8146105ea5780635c975abb1461061557806362b99ad4146106405780636352211e1461066b5780636905b184146106a857806370a08231146106d157610293565b80632f745c59146104b657806342842e0e146104f3578063438b63001461051c5780634f6ccce7146105595780634fdd43cb1461059657806351830227146105bf57610293565b806316ba10e01161025057806316ba10e0146103a857806316c38b3c146103d157806318160ddd146103fa57806318cae2691461042557806323b872dd146104625780632a23d07d1461048b57610293565b806301ffc9a71461029857806306fdde03146102d5578063081812fc14610300578063095ea7b31461033d5780630fdb1c101461036657806313faede61461037d575b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba9190614032565b610af4565b6040516102cc9190614791565b60405180910390f35b3480156102e157600080fd5b506102ea610b6e565b6040516102f791906147c7565b60405180910390f35b34801561030c57600080fd5b50610327600480360381019061032291906140d5565b610c00565b6040516103349190614708565b60405180910390f35b34801561034957600080fd5b50610364600480360381019061035f9190613f38565b610c85565b005b34801561037257600080fd5b5061037b610d9d565b005b34801561038957600080fd5b50610392610e99565b60405161039f9190614ae9565b60405180910390f35b3480156103b457600080fd5b506103cf60048036038101906103ca919061408c565b610eca565b005b3480156103dd57600080fd5b506103f860048036038101906103f39190613fd8565b610f60565b005b34801561040657600080fd5b5061040f610ff9565b60405161041c9190614ae9565b60405180910390f35b34801561043157600080fd5b5061044c60048036038101906104479190613db5565b61100a565b6040516104599190614ae9565b60405180910390f35b34801561046e57600080fd5b5061048960048036038101906104849190613e22565b611022565b005b34801561049757600080fd5b506104a0611082565b6040516104ad9190614ae9565b60405180910390f35b3480156104c257600080fd5b506104dd60048036038101906104d89190613f38565b611088565b6040516104ea9190614ae9565b60405180910390f35b3480156104ff57600080fd5b5061051a60048036038101906105159190613e22565b61112d565b005b34801561052857600080fd5b50610543600480360381019061053e9190613db5565b61114d565b604051610550919061476f565b60405180910390f35b34801561056557600080fd5b50610580600480360381019061057b91906140d5565b611258565b60405161058d9190614ae9565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b8919061408c565b6112c9565b005b3480156105cb57600080fd5b506105d461135f565b6040516105e19190614791565b60405180910390f35b3480156105f657600080fd5b506105ff611372565b60405161060c91906147c7565b60405180910390f35b34801561062157600080fd5b5061062a611400565b6040516106379190614791565b60405180910390f35b34801561064c57600080fd5b50610655611413565b60405161066291906147c7565b60405180910390f35b34801561067757600080fd5b50610692600480360381019061068d91906140d5565b6114a1565b60405161069f9190614708565b60405180910390f35b3480156106b457600080fd5b506106cf60048036038101906106ca91906140d5565b611553565b005b3480156106dd57600080fd5b506106f860048036038101906106f39190613db5565b6115d9565b6040516107059190614ae9565b60405180910390f35b34801561071a57600080fd5b50610723611691565b005b34801561073157600080fd5b5061074c6004803603810190610747919061408c565b611719565b005b34801561075a57600080fd5b506107636117af565b6040516107709190614708565b60405180910390f35b34801561078557600080fd5b506107a0600480360381019061079b91906140d5565b6117d9565b005b3480156107ae57600080fd5b506107b761185f565b6040516107c49190614ae9565b60405180910390f35b3480156107d957600080fd5b506107e2611865565b6040516107ef9190614ae9565b60405180910390f35b34801561080457600080fd5b5061080d61186b565b60405161081a91906147c7565b60405180910390f35b61083d600480360381019061083891906140d5565b6118fd565b005b34801561084b57600080fd5b5061086660048036038101906108619190613ef8565b611bd2565b005b34801561087457600080fd5b5061087d611be8565b60405161088a91906147c7565b60405180910390f35b6108ad60048036038101906108a89190613f78565b611c76565b005b3480156108bb57600080fd5b506108c4611fd5565b6040516108d191906147ac565b60405180910390f35b3480156108e657600080fd5b5061090160048036038101906108fc91906140d5565b611fdb565b005b34801561090f57600080fd5b5061092a60048036038101906109259190613e75565b612061565b005b34801561093857600080fd5b506109416120c3565b60405161094e9190614ae9565b60405180910390f35b34801561096357600080fd5b5061097e60048036038101906109799190614005565b6120c9565b005b34801561098c57600080fd5b506109a760048036038101906109a29190613fd8565b61214f565b005b3480156109b557600080fd5b506109d060048036038101906109cb91906140d5565b6121e8565b6040516109dd91906147c7565b60405180910390f35b3480156109f257600080fd5b506109fb612341565b604051610a089190614ae9565b60405180910390f35b348015610a1d57600080fd5b50610a386004803603810190610a339190613fd8565b612347565b005b348015610a4657600080fd5b50610a616004803603810190610a5c9190613de2565b6123e0565b604051610a6e9190614791565b60405180910390f35b348015610a8357600080fd5b50610a9e6004803603810190610a999190614102565b612474565b005b348015610aac57600080fd5b50610ac76004803603810190610ac29190613db5565b612679565b005b348015610ad557600080fd5b50610ade612771565b604051610aeb9190614791565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b675750610b6682612784565b5b9050919050565b606060008054610b7d90614dfc565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba990614dfc565b8015610bf65780601f10610bcb57610100808354040283529160200191610bf6565b820191906000526020600020905b815481529060010190602001808311610bd957829003601f168201915b5050505050905090565b6000610c0b82612866565b610c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c41906149c9565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c90826114a1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf890614a49565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d206128d2565b73ffffffffffffffffffffffffffffffffffffffff161480610d4f5750610d4e81610d496128d2565b6123e0565b5b610d8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8590614949565b60405180910390fd5b610d9883836128da565b505050565b610da56128d2565b73ffffffffffffffffffffffffffffffffffffffff16610dc36117af565b73ffffffffffffffffffffffffffffffffffffffff1614610e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e10906149e9565b60405180910390fd5b6000610e236117af565b73ffffffffffffffffffffffffffffffffffffffff1647604051610e46906146f3565b60006040518083038185875af1925050503d8060008114610e83576040519150601f19603f3d011682016040523d82523d6000602084013e610e88565b606091505b5050905080610e9657600080fd5b50565b600060011515601560029054906101000a900460ff1615151415610ec1576010549050610ec7565b60115490505b90565b610ed26128d2565b73ffffffffffffffffffffffffffffffffffffffff16610ef06117af565b73ffffffffffffffffffffffffffffffffffffffff1614610f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3d906149e9565b60405180910390fd5b80600d9080519060200190610f5c929190613b5e565b5050565b610f686128d2565b73ffffffffffffffffffffffffffffffffffffffff16610f866117af565b73ffffffffffffffffffffffffffffffffffffffff1614610fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd3906149e9565b60405180910390fd5b80601560016101000a81548160ff02191690831515021790555050565b6000611005600b612993565b905090565b60166020528060005260406000206000915090505481565b61103361102d6128d2565b826129a1565b611072576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106990614a69565b60405180910390fd5b61107d838383612a7f565b505050565b60105481565b6000611093836115d9565b82106110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb90614809565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61114883838360405180602001604052806000815250612061565b505050565b6060600061115a836115d9565b905060008167ffffffffffffffff81111561117857611177614fe8565b5b6040519080825280602002602001820160405280156111a65781602001602082028036833780820191505090505b50905060006001905060005b83811080156111c357506012548211155b1561124c5760006111d3836114a1565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611238578284838151811061121d5761121c614fb9565b5b602002602001018181525050818061123490614e5f565b9250505b828061124390614e5f565b935050506111b2565b82945050505050919050565b6000611262612ce6565b82106112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129a90614aa9565b60405180910390fd5b600882815481106112b7576112b6614fb9565b5b90600052602060002001549050919050565b6112d16128d2565b73ffffffffffffffffffffffffffffffffffffffff166112ef6117af565b73ffffffffffffffffffffffffffffffffffffffff1614611345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133c906149e9565b60405180910390fd5b80600e908051906020019061135b929190613b5e565b5050565b601560009054906101000a900460ff1681565b600d805461137f90614dfc565b80601f01602080910402602001604051908101604052809291908181526020018280546113ab90614dfc565b80156113f85780601f106113cd576101008083540402835291602001916113f8565b820191906000526020600020905b8154815290600101906020018083116113db57829003601f168201915b505050505081565b601560019054906101000a900460ff1681565b600c805461142090614dfc565b80601f016020809104026020016040519081016040528092919081815260200182805461144c90614dfc565b80156114995780601f1061146e57610100808354040283529160200191611499565b820191906000526020600020905b81548152906001019060200180831161147c57829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561154a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154190614989565b60405180910390fd5b80915050919050565b61155b6128d2565b73ffffffffffffffffffffffffffffffffffffffff166115796117af565b73ffffffffffffffffffffffffffffffffffffffff16146115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c6906149e9565b60405180910390fd5b8060118190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561164a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164190614969565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116996128d2565b73ffffffffffffffffffffffffffffffffffffffff166116b76117af565b73ffffffffffffffffffffffffffffffffffffffff161461170d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611704906149e9565b60405180910390fd5b6117176000612cf3565b565b6117216128d2565b73ffffffffffffffffffffffffffffffffffffffff1661173f6117af565b73ffffffffffffffffffffffffffffffffffffffff1614611795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178c906149e9565b60405180910390fd5b80600c90805190602001906117ab929190613b5e565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6117e16128d2565b73ffffffffffffffffffffffffffffffffffffffff166117ff6117af565b73ffffffffffffffffffffffffffffffffffffffff1614611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184c906149e9565b60405180910390fd5b8060108190555050565b60115481565b60135481565b60606001805461187a90614dfc565b80601f01602080910402602001604051908101604052809291908181526020018280546118a690614dfc565b80156118f35780601f106118c8576101008083540402835291602001916118f3565b820191906000526020600020905b8154815290600101906020018083116118d657829003601f168201915b5050505050905090565b806119066117af565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a1f576000601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050601454828261198b9190614c27565b11156119cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c390614a29565b60405180910390fd5b6000821180156119de57506013548211155b611a1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1490614a89565b60405180910390fd5b505b60125481611a2d600b612993565b611a379190614c27565b10611a77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6e906147e9565b60405180910390fd5b601560019054906101000a900460ff1615611ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abe90614849565b60405180910390fd5b611acf6117af565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bc45760011515601560029054906101000a900460ff1615151415611b725781601054611b2b9190614cae565b341015611b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6490614ac9565b60405180910390fd5b611bc3565b81601154611b809190614cae565b341015611bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb990614ac9565b60405180910390fd5b5b5b611bce3383612db9565b5050565b611be4611bdd6128d2565b8383612e4e565b5050565b600e8054611bf590614dfc565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2190614dfc565b8015611c6e5780601f10611c4357610100808354040283529160200191611c6e565b820191906000526020600020905b815481529060010190602001808311611c5157829003601f168201915b505050505081565b8282600f54600033604051602001611c8e91906146a7565b604051602081830303815290604052805190602001209050611cf2848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508383612fbb565b611d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2890614909565b60405180910390fd5b84611d3a6117af565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e53576000601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506014548282611dbf9190614c27565b1115611e00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df790614a29565b60405180910390fd5b600082118015611e1257506013548211155b611e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4890614a89565b60405180910390fd5b505b60125481611e61600b612993565b611e6b9190614c27565b10611eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea2906147e9565b60405180910390fd5b601560019054906101000a900460ff1615611efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef290614849565b60405180910390fd5b611f036117af565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fc15760011515601560029054906101000a900460ff1615151415611fa65785601054611f5f9190614cae565b341015611fa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9890614ac9565b60405180910390fd5b611fc0565b601560029054906101000a900460ff16611fbf57600080fd5b5b5b611fcb3387612db9565b5050505050505050565b600f5481565b611fe36128d2565b73ffffffffffffffffffffffffffffffffffffffff166120016117af565b73ffffffffffffffffffffffffffffffffffffffff1614612057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204e906149e9565b60405180910390fd5b8060138190555050565b61207261206c6128d2565b836129a1565b6120b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a890614a69565b60405180910390fd5b6120bd84848484612fd2565b50505050565b60145481565b6120d16128d2565b73ffffffffffffffffffffffffffffffffffffffff166120ef6117af565b73ffffffffffffffffffffffffffffffffffffffff1614612145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213c906149e9565b60405180910390fd5b80600f8190555050565b6121576128d2565b73ffffffffffffffffffffffffffffffffffffffff166121756117af565b73ffffffffffffffffffffffffffffffffffffffff16146121cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c2906149e9565b60405180910390fd5b80601560026101000a81548160ff02191690831515021790555050565b60606121f382612866565b612232576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222990614a09565b60405180910390fd5b60001515601560009054906101000a900460ff16151514156122e057600e805461225b90614dfc565b80601f016020809104026020016040519081016040528092919081815260200182805461228790614dfc565b80156122d45780601f106122a9576101008083540402835291602001916122d4565b820191906000526020600020905b8154815290600101906020018083116122b757829003601f168201915b5050505050905061233c565b60006122ea61302e565b9050600081511161230a5760405180602001604052806000815250612338565b80612314846130c0565b600d604051602001612328939291906146c2565b6040516020818303038152906040525b9150505b919050565b60125481565b61234f6128d2565b73ffffffffffffffffffffffffffffffffffffffff1661236d6117af565b73ffffffffffffffffffffffffffffffffffffffff16146123c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ba906149e9565b60405180910390fd5b80601560006101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8161247d6117af565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612596576000601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060145482826125029190614c27565b1115612543576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253a90614a29565b60405180910390fd5b60008211801561255557506013548211155b612594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258b90614a89565b60405180910390fd5b505b601254816125a4600b612993565b6125ae9190614c27565b106125ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e5906147e9565b60405180910390fd5b6125f66128d2565b73ffffffffffffffffffffffffffffffffffffffff166126146117af565b73ffffffffffffffffffffffffffffffffffffffff161461266a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612661906149e9565b60405180910390fd5b6126748284612db9565b505050565b6126816128d2565b73ffffffffffffffffffffffffffffffffffffffff1661269f6117af565b73ffffffffffffffffffffffffffffffffffffffff16146126f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ec906149e9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275c90614869565b60405180910390fd5b61276e81612cf3565b50565b601560029054906101000a900460ff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061284f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061285f575061285e82613221565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661294d836114a1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60006129ac82612866565b6129eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e290614929565b60405180910390fd5b60006129f6836114a1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612a6557508373ffffffffffffffffffffffffffffffffffffffff16612a4d84610c00565b73ffffffffffffffffffffffffffffffffffffffff16145b80612a765750612a7581856123e0565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612a9f826114a1565b73ffffffffffffffffffffffffffffffffffffffff1614612af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aec90614889565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5c906148c9565b60405180910390fd5b612b7083838361328b565b612b7b6000826128da565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bcb9190614d08565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c229190614c27565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ce183838361339f565b505050565b6000600880549050905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b81811015612e4957612dce600b6133a4565b601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190612e1e90614e5f565b9190505550612e3683612e31600b612993565b6133ba565b8080612e4190614e5f565b915050612dbc565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb4906148e9565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612fae9190614791565b60405180910390a3505050565b600082612fc885846133d8565b1490509392505050565b612fdd848484612a7f565b612fe98484848461344d565b613028576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301f90614829565b60405180910390fd5b50505050565b6060600c805461303d90614dfc565b80601f016020809104026020016040519081016040528092919081815260200182805461306990614dfc565b80156130b65780601f1061308b576101008083540402835291602001916130b6565b820191906000526020600020905b81548152906001019060200180831161309957829003601f168201915b5050505050905090565b60606000821415613108576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061321c565b600082905060005b6000821461313a57808061312390614e5f565b915050600a826131339190614c7d565b9150613110565b60008167ffffffffffffffff81111561315657613155614fe8565b5b6040519080825280601f01601f1916602001820160405280156131885781602001600182028036833780820191505090505b5090505b60008514613215576001826131a19190614d08565b9150600a856131b09190614ecc565b60306131bc9190614c27565b60f81b8183815181106131d2576131d1614fb9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561320e9190614c7d565b945061318c565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6132968383836135e4565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132d9576132d4816135e9565b613318565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613317576133168382613632565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561335b576133568161379f565b61339a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613399576133988282613870565b5b5b505050565b505050565b6001816000016000828254019250508190555050565b6133d48282604051806020016040528060008152506138ef565b5050565b60008082905060005b84518110156134425760008582815181106133ff576133fe614fb9565b5b602002602001015190508083116134215761341a838261394a565b925061342e565b61342b818461394a565b92505b50808061343a90614e5f565b9150506133e1565b508091505092915050565b600061346e8473ffffffffffffffffffffffffffffffffffffffff16613961565b156135d7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026134976128d2565b8786866040518563ffffffff1660e01b81526004016134b99493929190614723565b602060405180830381600087803b1580156134d357600080fd5b505af192505050801561350457506040513d601f19601f82011682018060405250810190613501919061405f565b60015b613587573d8060008114613534576040519150601f19603f3d011682016040523d82523d6000602084013e613539565b606091505b5060008151141561357f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357690614829565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506135dc565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161363f846115d9565b6136499190614d08565b905060006007600084815260200190815260200160002054905081811461372e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506137b39190614d08565b90506000600960008481526020019081526020016000205490506000600883815481106137e3576137e2614fb9565b5b90600052602060002001549050806008838154811061380557613804614fb9565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061385457613853614f8a565b5b6001900381819060005260206000200160009055905550505050565b600061387b836115d9565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6138f98383613984565b613906600084848461344d565b613945576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161393c90614829565b60405180910390fd5b505050565b600082600052816020526040600020905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156139f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139eb906149a9565b60405180910390fd5b6139fd81612866565b15613a3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a34906148a9565b60405180910390fd5b613a496000838361328b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a999190614c27565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613b5a6000838361339f565b5050565b828054613b6a90614dfc565b90600052602060002090601f016020900481019282613b8c5760008555613bd3565b82601f10613ba557805160ff1916838001178555613bd3565b82800160010185558215613bd3579182015b82811115613bd2578251825591602001919060010190613bb7565b5b509050613be09190613be4565b5090565b5b80821115613bfd576000816000905550600101613be5565b5090565b6000613c14613c0f84614b29565b614b04565b905082815260208101848484011115613c3057613c2f615026565b5b613c3b848285614dba565b509392505050565b6000613c56613c5184614b5a565b614b04565b905082815260208101848484011115613c7257613c71615026565b5b613c7d848285614dba565b509392505050565b600081359050613c9481615642565b92915050565b60008083601f840112613cb057613caf61501c565b5b8235905067ffffffffffffffff811115613ccd57613ccc615017565b5b602083019150836020820283011115613ce957613ce8615021565b5b9250929050565b600081359050613cff81615659565b92915050565b600081359050613d1481615670565b92915050565b600081359050613d2981615687565b92915050565b600081519050613d3e81615687565b92915050565b600082601f830112613d5957613d5861501c565b5b8135613d69848260208601613c01565b91505092915050565b600082601f830112613d8757613d8661501c565b5b8135613d97848260208601613c43565b91505092915050565b600081359050613daf8161569e565b92915050565b600060208284031215613dcb57613dca615030565b5b6000613dd984828501613c85565b91505092915050565b60008060408385031215613df957613df8615030565b5b6000613e0785828601613c85565b9250506020613e1885828601613c85565b9150509250929050565b600080600060608486031215613e3b57613e3a615030565b5b6000613e4986828701613c85565b9350506020613e5a86828701613c85565b9250506040613e6b86828701613da0565b9150509250925092565b60008060008060808587031215613e8f57613e8e615030565b5b6000613e9d87828801613c85565b9450506020613eae87828801613c85565b9350506040613ebf87828801613da0565b925050606085013567ffffffffffffffff811115613ee057613edf61502b565b5b613eec87828801613d44565b91505092959194509250565b60008060408385031215613f0f57613f0e615030565b5b6000613f1d85828601613c85565b9250506020613f2e85828601613cf0565b9150509250929050565b60008060408385031215613f4f57613f4e615030565b5b6000613f5d85828601613c85565b9250506020613f6e85828601613da0565b9150509250929050565b600080600060408486031215613f9157613f90615030565b5b600084013567ffffffffffffffff811115613faf57613fae61502b565b5b613fbb86828701613c9a565b93509350506020613fce86828701613da0565b9150509250925092565b600060208284031215613fee57613fed615030565b5b6000613ffc84828501613cf0565b91505092915050565b60006020828403121561401b5761401a615030565b5b600061402984828501613d05565b91505092915050565b60006020828403121561404857614047615030565b5b600061405684828501613d1a565b91505092915050565b60006020828403121561407557614074615030565b5b600061408384828501613d2f565b91505092915050565b6000602082840312156140a2576140a1615030565b5b600082013567ffffffffffffffff8111156140c0576140bf61502b565b5b6140cc84828501613d72565b91505092915050565b6000602082840312156140eb576140ea615030565b5b60006140f984828501613da0565b91505092915050565b6000806040838503121561411957614118615030565b5b600061412785828601613da0565b925050602061413885828601613c85565b9150509250929050565b600061414e8383614689565b60208301905092915050565b61416381614d3c565b82525050565b61417a61417582614d3c565b614ea8565b82525050565b600061418b82614bb0565b6141958185614bde565b93506141a083614b8b565b8060005b838110156141d15781516141b88882614142565b97506141c383614bd1565b9250506001810190506141a4565b5085935050505092915050565b6141e781614d4e565b82525050565b6141f681614d5a565b82525050565b600061420782614bbb565b6142118185614bef565b9350614221818560208601614dc9565b61422a81615035565b840191505092915050565b600061424082614bc6565b61424a8185614c0b565b935061425a818560208601614dc9565b61426381615035565b840191505092915050565b600061427982614bc6565b6142838185614c1c565b9350614293818560208601614dc9565b80840191505092915050565b600081546142ac81614dfc565b6142b68186614c1c565b945060018216600081146142d157600181146142e257614315565b60ff19831686528186019350614315565b6142eb85614b9b565b60005b8381101561430d578154818901526001820191506020810190506142ee565b838801955050505b50505092915050565b600061432b601383614c0b565b915061433682615053565b602082019050919050565b600061434e602b83614c0b565b91506143598261507c565b604082019050919050565b6000614371603283614c0b565b915061437c826150cb565b604082019050919050565b6000614394601683614c0b565b915061439f8261511a565b602082019050919050565b60006143b7602683614c0b565b91506143c282615143565b604082019050919050565b60006143da602583614c0b565b91506143e582615192565b604082019050919050565b60006143fd601c83614c0b565b9150614408826151e1565b602082019050919050565b6000614420602483614c0b565b915061442b8261520a565b604082019050919050565b6000614443601983614c0b565b915061444e82615259565b602082019050919050565b6000614466601a83614c0b565b915061447182615282565b602082019050919050565b6000614489602c83614c0b565b9150614494826152ab565b604082019050919050565b60006144ac603883614c0b565b91506144b7826152fa565b604082019050919050565b60006144cf602a83614c0b565b91506144da82615349565b604082019050919050565b60006144f2602983614c0b565b91506144fd82615398565b604082019050919050565b6000614515602083614c0b565b9150614520826153e7565b602082019050919050565b6000614538602c83614c0b565b915061454382615410565b604082019050919050565b600061455b602083614c0b565b91506145668261545f565b602082019050919050565b600061457e602f83614c0b565b915061458982615488565b604082019050919050565b60006145a1601c83614c0b565b91506145ac826154d7565b602082019050919050565b60006145c4602183614c0b565b91506145cf82615500565b604082019050919050565b60006145e7600083614c00565b91506145f28261554f565b600082019050919050565b600061460a603183614c0b565b915061461582615552565b604082019050919050565b600061462d601383614c0b565b9150614638826155a1565b602082019050919050565b6000614650602c83614c0b565b915061465b826155ca565b604082019050919050565b6000614673601383614c0b565b915061467e82615619565b602082019050919050565b61469281614db0565b82525050565b6146a181614db0565b82525050565b60006146b38284614169565b60148201915081905092915050565b60006146ce828661426e565b91506146da828561426e565b91506146e6828461429f565b9150819050949350505050565b60006146fe826145da565b9150819050919050565b600060208201905061471d600083018461415a565b92915050565b6000608082019050614738600083018761415a565b614745602083018661415a565b6147526040830185614698565b818103606083015261476481846141fc565b905095945050505050565b600060208201905081810360008301526147898184614180565b905092915050565b60006020820190506147a660008301846141de565b92915050565b60006020820190506147c160008301846141ed565b92915050565b600060208201905081810360008301526147e18184614235565b905092915050565b600060208201905081810360008301526148028161431e565b9050919050565b6000602082019050818103600083015261482281614341565b9050919050565b6000602082019050818103600083015261484281614364565b9050919050565b6000602082019050818103600083015261486281614387565b9050919050565b60006020820190508181036000830152614882816143aa565b9050919050565b600060208201905081810360008301526148a2816143cd565b9050919050565b600060208201905081810360008301526148c2816143f0565b9050919050565b600060208201905081810360008301526148e281614413565b9050919050565b6000602082019050818103600083015261490281614436565b9050919050565b6000602082019050818103600083015261492281614459565b9050919050565b600060208201905081810360008301526149428161447c565b9050919050565b600060208201905081810360008301526149628161449f565b9050919050565b60006020820190508181036000830152614982816144c2565b9050919050565b600060208201905081810360008301526149a2816144e5565b9050919050565b600060208201905081810360008301526149c281614508565b9050919050565b600060208201905081810360008301526149e28161452b565b9050919050565b60006020820190508181036000830152614a028161454e565b9050919050565b60006020820190508181036000830152614a2281614571565b9050919050565b60006020820190508181036000830152614a4281614594565b9050919050565b60006020820190508181036000830152614a62816145b7565b9050919050565b60006020820190508181036000830152614a82816145fd565b9050919050565b60006020820190508181036000830152614aa281614620565b9050919050565b60006020820190508181036000830152614ac281614643565b9050919050565b60006020820190508181036000830152614ae281614666565b9050919050565b6000602082019050614afe6000830184614698565b92915050565b6000614b0e614b1f565b9050614b1a8282614e2e565b919050565b6000604051905090565b600067ffffffffffffffff821115614b4457614b43614fe8565b5b614b4d82615035565b9050602081019050919050565b600067ffffffffffffffff821115614b7557614b74614fe8565b5b614b7e82615035565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c3282614db0565b9150614c3d83614db0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c7257614c71614efd565b5b828201905092915050565b6000614c8882614db0565b9150614c9383614db0565b925082614ca357614ca2614f2c565b5b828204905092915050565b6000614cb982614db0565b9150614cc483614db0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614cfd57614cfc614efd565b5b828202905092915050565b6000614d1382614db0565b9150614d1e83614db0565b925082821015614d3157614d30614efd565b5b828203905092915050565b6000614d4782614d90565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614de7578082015181840152602081019050614dcc565b83811115614df6576000848401525b50505050565b60006002820490506001821680614e1457607f821691505b60208210811415614e2857614e27614f5b565b5b50919050565b614e3782615035565b810181811067ffffffffffffffff82111715614e5657614e55614fe8565b5b80604052505050565b6000614e6a82614db0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e9d57614e9c614efd565b5b600182019050919050565b6000614eb382614eba565b9050919050565b6000614ec582615046565b9050919050565b6000614ed782614db0565b9150614ee283614db0565b925082614ef257614ef1614f2c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f54686520636f6e74726163742069732070617573656400000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f41646472657373206973206e6f742077686974656c6973746564000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d6178204e465420706572206164647265737320657863656564656400000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7420616d6f756e7400000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b61564b81614d3c565b811461565657600080fd5b50565b61566281614d4e565b811461566d57600080fd5b50565b61567981614d5a565b811461568457600080fd5b50565b61569081614d64565b811461569b57600080fd5b50565b6156a781614db0565b81146156b257600080fd5b5056fea26469706673582212200f0b6ca1cece19da62f1d41c9492ea79927260714169920ba90031cd166d904a64736f6c6343000807003368747470733a2f2f646567656e6865726f65732e6d7970696e6174612e636c6f75642f697066732f516d64547067314b467a7a4655377362746d516966554b784c343836486f647667397135526e7a697843364570642f70726572657665616c2e6a736f6e697066733a2f2f516d566a4b715045765a6f62647079615a664c4c683441634659676565584167576b4459596356335750644663472f

Deployed Bytecode

0x6080604052600436106102935760003560e01c8063715018a61161015a578063b071401b116100c1578063d5abeb011161007a578063d5abeb01146109e6578063e0a8085314610a11578063e985e9c514610a3a578063efbd73f414610a77578063f2fde38b14610aa0578063fdea8e0b14610ac957610293565b8063b071401b146108da578063b88d4fde14610903578063ba7d2c761461092c578063bd32fb6614610957578063c54e73e314610980578063c87b56dd146109a957610293565b806395d89b411161011357806395d89b41146107f8578063a0712d6814610823578063a22cb4651461083f578063a45ba8e714610868578063a6d612f914610893578063aa98e0c6146108af57610293565b8063715018a61461070e5780637ec4a659146107255780638da5cb5b1461074e5780638fdcf9421461077957806392829d74146107a257806394354fd0146107cd57610293565b80632f745c59116101fe5780635503a0e8116101b75780635503a0e8146105ea5780635c975abb1461061557806362b99ad4146106405780636352211e1461066b5780636905b184146106a857806370a08231146106d157610293565b80632f745c59146104b657806342842e0e146104f3578063438b63001461051c5780634f6ccce7146105595780634fdd43cb1461059657806351830227146105bf57610293565b806316ba10e01161025057806316ba10e0146103a857806316c38b3c146103d157806318160ddd146103fa57806318cae2691461042557806323b872dd146104625780632a23d07d1461048b57610293565b806301ffc9a71461029857806306fdde03146102d5578063081812fc14610300578063095ea7b31461033d5780630fdb1c101461036657806313faede61461037d575b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba9190614032565b610af4565b6040516102cc9190614791565b60405180910390f35b3480156102e157600080fd5b506102ea610b6e565b6040516102f791906147c7565b60405180910390f35b34801561030c57600080fd5b50610327600480360381019061032291906140d5565b610c00565b6040516103349190614708565b60405180910390f35b34801561034957600080fd5b50610364600480360381019061035f9190613f38565b610c85565b005b34801561037257600080fd5b5061037b610d9d565b005b34801561038957600080fd5b50610392610e99565b60405161039f9190614ae9565b60405180910390f35b3480156103b457600080fd5b506103cf60048036038101906103ca919061408c565b610eca565b005b3480156103dd57600080fd5b506103f860048036038101906103f39190613fd8565b610f60565b005b34801561040657600080fd5b5061040f610ff9565b60405161041c9190614ae9565b60405180910390f35b34801561043157600080fd5b5061044c60048036038101906104479190613db5565b61100a565b6040516104599190614ae9565b60405180910390f35b34801561046e57600080fd5b5061048960048036038101906104849190613e22565b611022565b005b34801561049757600080fd5b506104a0611082565b6040516104ad9190614ae9565b60405180910390f35b3480156104c257600080fd5b506104dd60048036038101906104d89190613f38565b611088565b6040516104ea9190614ae9565b60405180910390f35b3480156104ff57600080fd5b5061051a60048036038101906105159190613e22565b61112d565b005b34801561052857600080fd5b50610543600480360381019061053e9190613db5565b61114d565b604051610550919061476f565b60405180910390f35b34801561056557600080fd5b50610580600480360381019061057b91906140d5565b611258565b60405161058d9190614ae9565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b8919061408c565b6112c9565b005b3480156105cb57600080fd5b506105d461135f565b6040516105e19190614791565b60405180910390f35b3480156105f657600080fd5b506105ff611372565b60405161060c91906147c7565b60405180910390f35b34801561062157600080fd5b5061062a611400565b6040516106379190614791565b60405180910390f35b34801561064c57600080fd5b50610655611413565b60405161066291906147c7565b60405180910390f35b34801561067757600080fd5b50610692600480360381019061068d91906140d5565b6114a1565b60405161069f9190614708565b60405180910390f35b3480156106b457600080fd5b506106cf60048036038101906106ca91906140d5565b611553565b005b3480156106dd57600080fd5b506106f860048036038101906106f39190613db5565b6115d9565b6040516107059190614ae9565b60405180910390f35b34801561071a57600080fd5b50610723611691565b005b34801561073157600080fd5b5061074c6004803603810190610747919061408c565b611719565b005b34801561075a57600080fd5b506107636117af565b6040516107709190614708565b60405180910390f35b34801561078557600080fd5b506107a0600480360381019061079b91906140d5565b6117d9565b005b3480156107ae57600080fd5b506107b761185f565b6040516107c49190614ae9565b60405180910390f35b3480156107d957600080fd5b506107e2611865565b6040516107ef9190614ae9565b60405180910390f35b34801561080457600080fd5b5061080d61186b565b60405161081a91906147c7565b60405180910390f35b61083d600480360381019061083891906140d5565b6118fd565b005b34801561084b57600080fd5b5061086660048036038101906108619190613ef8565b611bd2565b005b34801561087457600080fd5b5061087d611be8565b60405161088a91906147c7565b60405180910390f35b6108ad60048036038101906108a89190613f78565b611c76565b005b3480156108bb57600080fd5b506108c4611fd5565b6040516108d191906147ac565b60405180910390f35b3480156108e657600080fd5b5061090160048036038101906108fc91906140d5565b611fdb565b005b34801561090f57600080fd5b5061092a60048036038101906109259190613e75565b612061565b005b34801561093857600080fd5b506109416120c3565b60405161094e9190614ae9565b60405180910390f35b34801561096357600080fd5b5061097e60048036038101906109799190614005565b6120c9565b005b34801561098c57600080fd5b506109a760048036038101906109a29190613fd8565b61214f565b005b3480156109b557600080fd5b506109d060048036038101906109cb91906140d5565b6121e8565b6040516109dd91906147c7565b60405180910390f35b3480156109f257600080fd5b506109fb612341565b604051610a089190614ae9565b60405180910390f35b348015610a1d57600080fd5b50610a386004803603810190610a339190613fd8565b612347565b005b348015610a4657600080fd5b50610a616004803603810190610a5c9190613de2565b6123e0565b604051610a6e9190614791565b60405180910390f35b348015610a8357600080fd5b50610a9e6004803603810190610a999190614102565b612474565b005b348015610aac57600080fd5b50610ac76004803603810190610ac29190613db5565b612679565b005b348015610ad557600080fd5b50610ade612771565b604051610aeb9190614791565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b675750610b6682612784565b5b9050919050565b606060008054610b7d90614dfc565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba990614dfc565b8015610bf65780601f10610bcb57610100808354040283529160200191610bf6565b820191906000526020600020905b815481529060010190602001808311610bd957829003601f168201915b5050505050905090565b6000610c0b82612866565b610c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c41906149c9565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c90826114a1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf890614a49565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d206128d2565b73ffffffffffffffffffffffffffffffffffffffff161480610d4f5750610d4e81610d496128d2565b6123e0565b5b610d8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8590614949565b60405180910390fd5b610d9883836128da565b505050565b610da56128d2565b73ffffffffffffffffffffffffffffffffffffffff16610dc36117af565b73ffffffffffffffffffffffffffffffffffffffff1614610e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e10906149e9565b60405180910390fd5b6000610e236117af565b73ffffffffffffffffffffffffffffffffffffffff1647604051610e46906146f3565b60006040518083038185875af1925050503d8060008114610e83576040519150601f19603f3d011682016040523d82523d6000602084013e610e88565b606091505b5050905080610e9657600080fd5b50565b600060011515601560029054906101000a900460ff1615151415610ec1576010549050610ec7565b60115490505b90565b610ed26128d2565b73ffffffffffffffffffffffffffffffffffffffff16610ef06117af565b73ffffffffffffffffffffffffffffffffffffffff1614610f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3d906149e9565b60405180910390fd5b80600d9080519060200190610f5c929190613b5e565b5050565b610f686128d2565b73ffffffffffffffffffffffffffffffffffffffff16610f866117af565b73ffffffffffffffffffffffffffffffffffffffff1614610fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd3906149e9565b60405180910390fd5b80601560016101000a81548160ff02191690831515021790555050565b6000611005600b612993565b905090565b60166020528060005260406000206000915090505481565b61103361102d6128d2565b826129a1565b611072576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106990614a69565b60405180910390fd5b61107d838383612a7f565b505050565b60105481565b6000611093836115d9565b82106110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb90614809565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61114883838360405180602001604052806000815250612061565b505050565b6060600061115a836115d9565b905060008167ffffffffffffffff81111561117857611177614fe8565b5b6040519080825280602002602001820160405280156111a65781602001602082028036833780820191505090505b50905060006001905060005b83811080156111c357506012548211155b1561124c5760006111d3836114a1565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611238578284838151811061121d5761121c614fb9565b5b602002602001018181525050818061123490614e5f565b9250505b828061124390614e5f565b935050506111b2565b82945050505050919050565b6000611262612ce6565b82106112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129a90614aa9565b60405180910390fd5b600882815481106112b7576112b6614fb9565b5b90600052602060002001549050919050565b6112d16128d2565b73ffffffffffffffffffffffffffffffffffffffff166112ef6117af565b73ffffffffffffffffffffffffffffffffffffffff1614611345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133c906149e9565b60405180910390fd5b80600e908051906020019061135b929190613b5e565b5050565b601560009054906101000a900460ff1681565b600d805461137f90614dfc565b80601f01602080910402602001604051908101604052809291908181526020018280546113ab90614dfc565b80156113f85780601f106113cd576101008083540402835291602001916113f8565b820191906000526020600020905b8154815290600101906020018083116113db57829003601f168201915b505050505081565b601560019054906101000a900460ff1681565b600c805461142090614dfc565b80601f016020809104026020016040519081016040528092919081815260200182805461144c90614dfc565b80156114995780601f1061146e57610100808354040283529160200191611499565b820191906000526020600020905b81548152906001019060200180831161147c57829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561154a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154190614989565b60405180910390fd5b80915050919050565b61155b6128d2565b73ffffffffffffffffffffffffffffffffffffffff166115796117af565b73ffffffffffffffffffffffffffffffffffffffff16146115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c6906149e9565b60405180910390fd5b8060118190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561164a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164190614969565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116996128d2565b73ffffffffffffffffffffffffffffffffffffffff166116b76117af565b73ffffffffffffffffffffffffffffffffffffffff161461170d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611704906149e9565b60405180910390fd5b6117176000612cf3565b565b6117216128d2565b73ffffffffffffffffffffffffffffffffffffffff1661173f6117af565b73ffffffffffffffffffffffffffffffffffffffff1614611795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178c906149e9565b60405180910390fd5b80600c90805190602001906117ab929190613b5e565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6117e16128d2565b73ffffffffffffffffffffffffffffffffffffffff166117ff6117af565b73ffffffffffffffffffffffffffffffffffffffff1614611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184c906149e9565b60405180910390fd5b8060108190555050565b60115481565b60135481565b60606001805461187a90614dfc565b80601f01602080910402602001604051908101604052809291908181526020018280546118a690614dfc565b80156118f35780601f106118c8576101008083540402835291602001916118f3565b820191906000526020600020905b8154815290600101906020018083116118d657829003601f168201915b5050505050905090565b806119066117af565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a1f576000601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050601454828261198b9190614c27565b11156119cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c390614a29565b60405180910390fd5b6000821180156119de57506013548211155b611a1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1490614a89565b60405180910390fd5b505b60125481611a2d600b612993565b611a379190614c27565b10611a77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6e906147e9565b60405180910390fd5b601560019054906101000a900460ff1615611ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abe90614849565b60405180910390fd5b611acf6117af565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bc45760011515601560029054906101000a900460ff1615151415611b725781601054611b2b9190614cae565b341015611b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6490614ac9565b60405180910390fd5b611bc3565b81601154611b809190614cae565b341015611bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb990614ac9565b60405180910390fd5b5b5b611bce3383612db9565b5050565b611be4611bdd6128d2565b8383612e4e565b5050565b600e8054611bf590614dfc565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2190614dfc565b8015611c6e5780601f10611c4357610100808354040283529160200191611c6e565b820191906000526020600020905b815481529060010190602001808311611c5157829003601f168201915b505050505081565b8282600f54600033604051602001611c8e91906146a7565b604051602081830303815290604052805190602001209050611cf2848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508383612fbb565b611d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2890614909565b60405180910390fd5b84611d3a6117af565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e53576000601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506014548282611dbf9190614c27565b1115611e00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df790614a29565b60405180910390fd5b600082118015611e1257506013548211155b611e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4890614a89565b60405180910390fd5b505b60125481611e61600b612993565b611e6b9190614c27565b10611eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea2906147e9565b60405180910390fd5b601560019054906101000a900460ff1615611efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef290614849565b60405180910390fd5b611f036117af565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fc15760011515601560029054906101000a900460ff1615151415611fa65785601054611f5f9190614cae565b341015611fa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9890614ac9565b60405180910390fd5b611fc0565b601560029054906101000a900460ff16611fbf57600080fd5b5b5b611fcb3387612db9565b5050505050505050565b600f5481565b611fe36128d2565b73ffffffffffffffffffffffffffffffffffffffff166120016117af565b73ffffffffffffffffffffffffffffffffffffffff1614612057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204e906149e9565b60405180910390fd5b8060138190555050565b61207261206c6128d2565b836129a1565b6120b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a890614a69565b60405180910390fd5b6120bd84848484612fd2565b50505050565b60145481565b6120d16128d2565b73ffffffffffffffffffffffffffffffffffffffff166120ef6117af565b73ffffffffffffffffffffffffffffffffffffffff1614612145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213c906149e9565b60405180910390fd5b80600f8190555050565b6121576128d2565b73ffffffffffffffffffffffffffffffffffffffff166121756117af565b73ffffffffffffffffffffffffffffffffffffffff16146121cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c2906149e9565b60405180910390fd5b80601560026101000a81548160ff02191690831515021790555050565b60606121f382612866565b612232576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222990614a09565b60405180910390fd5b60001515601560009054906101000a900460ff16151514156122e057600e805461225b90614dfc565b80601f016020809104026020016040519081016040528092919081815260200182805461228790614dfc565b80156122d45780601f106122a9576101008083540402835291602001916122d4565b820191906000526020600020905b8154815290600101906020018083116122b757829003601f168201915b5050505050905061233c565b60006122ea61302e565b9050600081511161230a5760405180602001604052806000815250612338565b80612314846130c0565b600d604051602001612328939291906146c2565b6040516020818303038152906040525b9150505b919050565b60125481565b61234f6128d2565b73ffffffffffffffffffffffffffffffffffffffff1661236d6117af565b73ffffffffffffffffffffffffffffffffffffffff16146123c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ba906149e9565b60405180910390fd5b80601560006101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8161247d6117af565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612596576000601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060145482826125029190614c27565b1115612543576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253a90614a29565b60405180910390fd5b60008211801561255557506013548211155b612594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258b90614a89565b60405180910390fd5b505b601254816125a4600b612993565b6125ae9190614c27565b106125ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e5906147e9565b60405180910390fd5b6125f66128d2565b73ffffffffffffffffffffffffffffffffffffffff166126146117af565b73ffffffffffffffffffffffffffffffffffffffff161461266a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612661906149e9565b60405180910390fd5b6126748284612db9565b505050565b6126816128d2565b73ffffffffffffffffffffffffffffffffffffffff1661269f6117af565b73ffffffffffffffffffffffffffffffffffffffff16146126f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ec906149e9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275c90614869565b60405180910390fd5b61276e81612cf3565b50565b601560029054906101000a900460ff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061284f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061285f575061285e82613221565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661294d836114a1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60006129ac82612866565b6129eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e290614929565b60405180910390fd5b60006129f6836114a1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612a6557508373ffffffffffffffffffffffffffffffffffffffff16612a4d84610c00565b73ffffffffffffffffffffffffffffffffffffffff16145b80612a765750612a7581856123e0565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612a9f826114a1565b73ffffffffffffffffffffffffffffffffffffffff1614612af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aec90614889565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5c906148c9565b60405180910390fd5b612b7083838361328b565b612b7b6000826128da565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bcb9190614d08565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c229190614c27565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ce183838361339f565b505050565b6000600880549050905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b81811015612e4957612dce600b6133a4565b601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190612e1e90614e5f565b9190505550612e3683612e31600b612993565b6133ba565b8080612e4190614e5f565b915050612dbc565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb4906148e9565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612fae9190614791565b60405180910390a3505050565b600082612fc885846133d8565b1490509392505050565b612fdd848484612a7f565b612fe98484848461344d565b613028576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301f90614829565b60405180910390fd5b50505050565b6060600c805461303d90614dfc565b80601f016020809104026020016040519081016040528092919081815260200182805461306990614dfc565b80156130b65780601f1061308b576101008083540402835291602001916130b6565b820191906000526020600020905b81548152906001019060200180831161309957829003601f168201915b5050505050905090565b60606000821415613108576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061321c565b600082905060005b6000821461313a57808061312390614e5f565b915050600a826131339190614c7d565b9150613110565b60008167ffffffffffffffff81111561315657613155614fe8565b5b6040519080825280601f01601f1916602001820160405280156131885781602001600182028036833780820191505090505b5090505b60008514613215576001826131a19190614d08565b9150600a856131b09190614ecc565b60306131bc9190614c27565b60f81b8183815181106131d2576131d1614fb9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561320e9190614c7d565b945061318c565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6132968383836135e4565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132d9576132d4816135e9565b613318565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613317576133168382613632565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561335b576133568161379f565b61339a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613399576133988282613870565b5b5b505050565b505050565b6001816000016000828254019250508190555050565b6133d48282604051806020016040528060008152506138ef565b5050565b60008082905060005b84518110156134425760008582815181106133ff576133fe614fb9565b5b602002602001015190508083116134215761341a838261394a565b925061342e565b61342b818461394a565b92505b50808061343a90614e5f565b9150506133e1565b508091505092915050565b600061346e8473ffffffffffffffffffffffffffffffffffffffff16613961565b156135d7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026134976128d2565b8786866040518563ffffffff1660e01b81526004016134b99493929190614723565b602060405180830381600087803b1580156134d357600080fd5b505af192505050801561350457506040513d601f19601f82011682018060405250810190613501919061405f565b60015b613587573d8060008114613534576040519150601f19603f3d011682016040523d82523d6000602084013e613539565b606091505b5060008151141561357f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357690614829565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506135dc565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161363f846115d9565b6136499190614d08565b905060006007600084815260200190815260200160002054905081811461372e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506137b39190614d08565b90506000600960008481526020019081526020016000205490506000600883815481106137e3576137e2614fb9565b5b90600052602060002001549050806008838154811061380557613804614fb9565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061385457613853614f8a565b5b6001900381819060005260206000200160009055905550505050565b600061387b836115d9565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6138f98383613984565b613906600084848461344d565b613945576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161393c90614829565b60405180910390fd5b505050565b600082600052816020526040600020905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156139f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139eb906149a9565b60405180910390fd5b6139fd81612866565b15613a3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a34906148a9565b60405180910390fd5b613a496000838361328b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a999190614c27565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613b5a6000838361339f565b5050565b828054613b6a90614dfc565b90600052602060002090601f016020900481019282613b8c5760008555613bd3565b82601f10613ba557805160ff1916838001178555613bd3565b82800160010185558215613bd3579182015b82811115613bd2578251825591602001919060010190613bb7565b5b509050613be09190613be4565b5090565b5b80821115613bfd576000816000905550600101613be5565b5090565b6000613c14613c0f84614b29565b614b04565b905082815260208101848484011115613c3057613c2f615026565b5b613c3b848285614dba565b509392505050565b6000613c56613c5184614b5a565b614b04565b905082815260208101848484011115613c7257613c71615026565b5b613c7d848285614dba565b509392505050565b600081359050613c9481615642565b92915050565b60008083601f840112613cb057613caf61501c565b5b8235905067ffffffffffffffff811115613ccd57613ccc615017565b5b602083019150836020820283011115613ce957613ce8615021565b5b9250929050565b600081359050613cff81615659565b92915050565b600081359050613d1481615670565b92915050565b600081359050613d2981615687565b92915050565b600081519050613d3e81615687565b92915050565b600082601f830112613d5957613d5861501c565b5b8135613d69848260208601613c01565b91505092915050565b600082601f830112613d8757613d8661501c565b5b8135613d97848260208601613c43565b91505092915050565b600081359050613daf8161569e565b92915050565b600060208284031215613dcb57613dca615030565b5b6000613dd984828501613c85565b91505092915050565b60008060408385031215613df957613df8615030565b5b6000613e0785828601613c85565b9250506020613e1885828601613c85565b9150509250929050565b600080600060608486031215613e3b57613e3a615030565b5b6000613e4986828701613c85565b9350506020613e5a86828701613c85565b9250506040613e6b86828701613da0565b9150509250925092565b60008060008060808587031215613e8f57613e8e615030565b5b6000613e9d87828801613c85565b9450506020613eae87828801613c85565b9350506040613ebf87828801613da0565b925050606085013567ffffffffffffffff811115613ee057613edf61502b565b5b613eec87828801613d44565b91505092959194509250565b60008060408385031215613f0f57613f0e615030565b5b6000613f1d85828601613c85565b9250506020613f2e85828601613cf0565b9150509250929050565b60008060408385031215613f4f57613f4e615030565b5b6000613f5d85828601613c85565b9250506020613f6e85828601613da0565b9150509250929050565b600080600060408486031215613f9157613f90615030565b5b600084013567ffffffffffffffff811115613faf57613fae61502b565b5b613fbb86828701613c9a565b93509350506020613fce86828701613da0565b9150509250925092565b600060208284031215613fee57613fed615030565b5b6000613ffc84828501613cf0565b91505092915050565b60006020828403121561401b5761401a615030565b5b600061402984828501613d05565b91505092915050565b60006020828403121561404857614047615030565b5b600061405684828501613d1a565b91505092915050565b60006020828403121561407557614074615030565b5b600061408384828501613d2f565b91505092915050565b6000602082840312156140a2576140a1615030565b5b600082013567ffffffffffffffff8111156140c0576140bf61502b565b5b6140cc84828501613d72565b91505092915050565b6000602082840312156140eb576140ea615030565b5b60006140f984828501613da0565b91505092915050565b6000806040838503121561411957614118615030565b5b600061412785828601613da0565b925050602061413885828601613c85565b9150509250929050565b600061414e8383614689565b60208301905092915050565b61416381614d3c565b82525050565b61417a61417582614d3c565b614ea8565b82525050565b600061418b82614bb0565b6141958185614bde565b93506141a083614b8b565b8060005b838110156141d15781516141b88882614142565b97506141c383614bd1565b9250506001810190506141a4565b5085935050505092915050565b6141e781614d4e565b82525050565b6141f681614d5a565b82525050565b600061420782614bbb565b6142118185614bef565b9350614221818560208601614dc9565b61422a81615035565b840191505092915050565b600061424082614bc6565b61424a8185614c0b565b935061425a818560208601614dc9565b61426381615035565b840191505092915050565b600061427982614bc6565b6142838185614c1c565b9350614293818560208601614dc9565b80840191505092915050565b600081546142ac81614dfc565b6142b68186614c1c565b945060018216600081146142d157600181146142e257614315565b60ff19831686528186019350614315565b6142eb85614b9b565b60005b8381101561430d578154818901526001820191506020810190506142ee565b838801955050505b50505092915050565b600061432b601383614c0b565b915061433682615053565b602082019050919050565b600061434e602b83614c0b565b91506143598261507c565b604082019050919050565b6000614371603283614c0b565b915061437c826150cb565b604082019050919050565b6000614394601683614c0b565b915061439f8261511a565b602082019050919050565b60006143b7602683614c0b565b91506143c282615143565b604082019050919050565b60006143da602583614c0b565b91506143e582615192565b604082019050919050565b60006143fd601c83614c0b565b9150614408826151e1565b602082019050919050565b6000614420602483614c0b565b915061442b8261520a565b604082019050919050565b6000614443601983614c0b565b915061444e82615259565b602082019050919050565b6000614466601a83614c0b565b915061447182615282565b602082019050919050565b6000614489602c83614c0b565b9150614494826152ab565b604082019050919050565b60006144ac603883614c0b565b91506144b7826152fa565b604082019050919050565b60006144cf602a83614c0b565b91506144da82615349565b604082019050919050565b60006144f2602983614c0b565b91506144fd82615398565b604082019050919050565b6000614515602083614c0b565b9150614520826153e7565b602082019050919050565b6000614538602c83614c0b565b915061454382615410565b604082019050919050565b600061455b602083614c0b565b91506145668261545f565b602082019050919050565b600061457e602f83614c0b565b915061458982615488565b604082019050919050565b60006145a1601c83614c0b565b91506145ac826154d7565b602082019050919050565b60006145c4602183614c0b565b91506145cf82615500565b604082019050919050565b60006145e7600083614c00565b91506145f28261554f565b600082019050919050565b600061460a603183614c0b565b915061461582615552565b604082019050919050565b600061462d601383614c0b565b9150614638826155a1565b602082019050919050565b6000614650602c83614c0b565b915061465b826155ca565b604082019050919050565b6000614673601383614c0b565b915061467e82615619565b602082019050919050565b61469281614db0565b82525050565b6146a181614db0565b82525050565b60006146b38284614169565b60148201915081905092915050565b60006146ce828661426e565b91506146da828561426e565b91506146e6828461429f565b9150819050949350505050565b60006146fe826145da565b9150819050919050565b600060208201905061471d600083018461415a565b92915050565b6000608082019050614738600083018761415a565b614745602083018661415a565b6147526040830185614698565b818103606083015261476481846141fc565b905095945050505050565b600060208201905081810360008301526147898184614180565b905092915050565b60006020820190506147a660008301846141de565b92915050565b60006020820190506147c160008301846141ed565b92915050565b600060208201905081810360008301526147e18184614235565b905092915050565b600060208201905081810360008301526148028161431e565b9050919050565b6000602082019050818103600083015261482281614341565b9050919050565b6000602082019050818103600083015261484281614364565b9050919050565b6000602082019050818103600083015261486281614387565b9050919050565b60006020820190508181036000830152614882816143aa565b9050919050565b600060208201905081810360008301526148a2816143cd565b9050919050565b600060208201905081810360008301526148c2816143f0565b9050919050565b600060208201905081810360008301526148e281614413565b9050919050565b6000602082019050818103600083015261490281614436565b9050919050565b6000602082019050818103600083015261492281614459565b9050919050565b600060208201905081810360008301526149428161447c565b9050919050565b600060208201905081810360008301526149628161449f565b9050919050565b60006020820190508181036000830152614982816144c2565b9050919050565b600060208201905081810360008301526149a2816144e5565b9050919050565b600060208201905081810360008301526149c281614508565b9050919050565b600060208201905081810360008301526149e28161452b565b9050919050565b60006020820190508181036000830152614a028161454e565b9050919050565b60006020820190508181036000830152614a2281614571565b9050919050565b60006020820190508181036000830152614a4281614594565b9050919050565b60006020820190508181036000830152614a62816145b7565b9050919050565b60006020820190508181036000830152614a82816145fd565b9050919050565b60006020820190508181036000830152614aa281614620565b9050919050565b60006020820190508181036000830152614ac281614643565b9050919050565b60006020820190508181036000830152614ae281614666565b9050919050565b6000602082019050614afe6000830184614698565b92915050565b6000614b0e614b1f565b9050614b1a8282614e2e565b919050565b6000604051905090565b600067ffffffffffffffff821115614b4457614b43614fe8565b5b614b4d82615035565b9050602081019050919050565b600067ffffffffffffffff821115614b7557614b74614fe8565b5b614b7e82615035565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c3282614db0565b9150614c3d83614db0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c7257614c71614efd565b5b828201905092915050565b6000614c8882614db0565b9150614c9383614db0565b925082614ca357614ca2614f2c565b5b828204905092915050565b6000614cb982614db0565b9150614cc483614db0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614cfd57614cfc614efd565b5b828202905092915050565b6000614d1382614db0565b9150614d1e83614db0565b925082821015614d3157614d30614efd565b5b828203905092915050565b6000614d4782614d90565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614de7578082015181840152602081019050614dcc565b83811115614df6576000848401525b50505050565b60006002820490506001821680614e1457607f821691505b60208210811415614e2857614e27614f5b565b5b50919050565b614e3782615035565b810181811067ffffffffffffffff82111715614e5657614e55614fe8565b5b80604052505050565b6000614e6a82614db0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e9d57614e9c614efd565b5b600182019050919050565b6000614eb382614eba565b9050919050565b6000614ec582615046565b9050919050565b6000614ed782614db0565b9150614ee283614db0565b925082614ef257614ef1614f2c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f54686520636f6e74726163742069732070617573656400000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f41646472657373206973206e6f742077686974656c6973746564000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d6178204e465420706572206164647265737320657863656564656400000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7420616d6f756e7400000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b61564b81614d3c565b811461565657600080fd5b50565b61566281614d4e565b811461566d57600080fd5b50565b61567981614d5a565b811461568457600080fd5b50565b61569081614d64565b811461569b57600080fd5b50565b6156a781614db0565b81146156b257600080fd5b5056fea26469706673582212200f0b6ca1cece19da62f1d41c9492ea79927260714169920ba90031cd166d904a64736f6c63430008070033

Deployed Bytecode Sourcemap

49422:6794:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43168:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29988:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31547:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31070:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56066:147;;;;;;;;;;;;;:::i;:::-;;55628:161;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55386:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55520:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53169:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50258:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32297:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49929:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43476:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32707:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53306:696;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43998:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55081:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50155:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49684:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50190:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49595:82;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29682:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54826:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29412:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8584:103;;;;;;;;;;;;;:::i;:::-;;55250:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7933:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54696:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49975:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50065:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30157:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51046:501;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31840:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49724:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51941:569;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49817:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54526:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32963:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50109:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52518:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54954:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54028:455;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50026:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55819:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32066:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52675:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8842:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50223:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43168:224;43270:4;43309:35;43294:50;;;:11;:50;;;;:90;;;;43348:36;43372:11;43348:23;:36::i;:::-;43294:90;43287:97;;43168:224;;;:::o;29988:100::-;30042:13;30075:5;30068:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29988:100;:::o;31547:221::-;31623:7;31651:16;31659:7;31651;:16::i;:::-;31643:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31736:15;:24;31752:7;31736:24;;;;;;;;;;;;;;;;;;;;;31729:31;;31547:221;;;:::o;31070:411::-;31151:13;31167:23;31182:7;31167:14;:23::i;:::-;31151:39;;31215:5;31209:11;;:2;:11;;;;31201:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;31309:5;31293:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;31318:37;31335:5;31342:12;:10;:12::i;:::-;31318:16;:37::i;:::-;31293:62;31271:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;31452:21;31461:2;31465:7;31452:8;:21::i;:::-;31140:341;31070:411;;:::o;56066:147::-;8164:12;:10;:12::i;:::-;8153:23;;:7;:5;:7::i;:::-;:23;;;8145:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56115:7:::1;56136;:5;:7::i;:::-;56128:21;;56157;56128:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56114:69;;;56202:2;56194:11;;;::::0;::::1;;56103:110;56066:147::o:0;55628:161::-;55664:7;55699:4;55688:15;;:7;;;;;;;;;;;:15;;;55684:66;;;55727:11;;55720:18;;;;55684:66;55767:14;;55760:21;;55628:161;;:::o;55386:106::-;8164:12;:10;:12::i;:::-;8153:23;;:7;:5;:7::i;:::-;:23;;;8145:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55474:10:::1;55462:9;:22;;;;;;;;;;;;:::i;:::-;;55386:106:::0;:::o;55520:83::-;8164:12;:10;:12::i;:::-;8153:23;;:7;:5;:7::i;:::-;:23;;;8145:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55589:6:::1;55580;;:15;;;;;;;;;;;;;;;;;;55520:83:::0;:::o;53169:103::-;53221:7;53248:16;:6;:14;:16::i;:::-;53241:23;;53169:103;:::o;50258:55::-;;;;;;;;;;;;;;;;;:::o;32297:339::-;32492:41;32511:12;:10;:12::i;:::-;32525:7;32492:18;:41::i;:::-;32484:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32600:28;32610:4;32616:2;32620:7;32600:9;:28::i;:::-;32297:339;;;:::o;49929:39::-;;;;:::o;43476:256::-;43573:7;43609:23;43626:5;43609:16;:23::i;:::-;43601:5;:31;43593:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;43698:12;:19;43711:5;43698:19;;;;;;;;;;;;;;;:26;43718:5;43698:26;;;;;;;;;;;;43691:33;;43476:256;;;;:::o;32707:185::-;32845:39;32862:4;32868:2;32872:7;32845:39;;;;;;;;;;;;:16;:39::i;:::-;32707:185;;;:::o;53306:696::-;53366:16;53395:23;53421:17;53431:6;53421:9;:17::i;:::-;53395:43;;53449:30;53496:15;53482:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53449:63;;53523:22;53548:1;53523:26;;53560:23;53600:362;53625:15;53607;:33;:64;;;;;53662:9;;53644:14;:27;;53607:64;53600:362;;;53688:25;53716:23;53724:14;53716:7;:23::i;:::-;53688:51;;53780:6;53759:27;;:17;:27;;;53756:150;;;53840:14;53807:13;53821:15;53807:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;53873:17;;;;;:::i;:::-;;;;53756:150;53934:16;;;;;:::i;:::-;;;;53673:289;53600:362;;;53981:13;53974:20;;;;;;53306:696;;;:::o;43998:233::-;44073:7;44109:30;:28;:30::i;:::-;44101:5;:38;44093:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;44206:10;44217:5;44206:17;;;;;;;;:::i;:::-;;;;;;;;;;44199:24;;43998:233;;;:::o;55081:138::-;8164:12;:10;:12::i;:::-;8153:23;;:7;:5;:7::i;:::-;:23;;;8145:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55193:18:::1;55173:17;:38;;;;;;;;;;;;:::i;:::-;;55081:138:::0;:::o;50155:28::-;;;;;;;;;;;;;:::o;49684:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50190:26::-;;;;;;;;;;;;;:::o;49595:82::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29682:239::-;29754:7;29774:13;29790:7;:16;29798:7;29790:16;;;;;;;;;;;;;;;;;;;;;29774:32;;29842:1;29825:19;;:5;:19;;;;29817:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29908:5;29901:12;;;29682:239;;;:::o;54826:100::-;8164:12;:10;:12::i;:::-;8153:23;;:7;:5;:7::i;:::-;:23;;;8145:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54913:5:::1;54896:14;:22;;;;54826:100:::0;:::o;29412:208::-;29484:7;29529:1;29512:19;;:5;:19;;;;29504:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;29596:9;:16;29606:5;29596:16;;;;;;;;;;;;;;;;29589:23;;29412:208;;;:::o;8584:103::-;8164:12;:10;:12::i;:::-;8153:23;;:7;:5;:7::i;:::-;:23;;;8145:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8649:30:::1;8676:1;8649:18;:30::i;:::-;8584:103::o:0;55250:106::-;8164:12;:10;:12::i;:::-;8153:23;;:7;:5;:7::i;:::-;:23;;;8145:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55338:10:::1;55326:9;:22;;;;;;;;;;;;:::i;:::-;;55250:106:::0;:::o;7933:87::-;7979:7;8006:6;;;;;;;;;;;7999:13;;7933:87;:::o;54696:94::-;8164:12;:10;:12::i;:::-;8153:23;;:7;:5;:7::i;:::-;:23;;;8145:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54777:5:::1;54763:11;:19;;;;54696:94:::0;:::o;49975:42::-;;;;:::o;50065:37::-;;;;:::o;30157:104::-;30213:13;30246:7;30239:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30157:104;:::o;51046:501::-;51111:11;50619:7;:5;:7::i;:::-;50605:21;;:10;:21;;;50601:320;;50643:24;50670:20;:32;50691:10;50670:32;;;;;;;;;;;;;;;;50643:59;;50759:18;;50744:11;50725:16;:30;;;;:::i;:::-;:52;;50717:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;50847:1;50833:11;:15;:52;;;;;50867:18;;50852:11;:33;;50833:52;50825:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;50628:293;50601:320;50972:9;;50958:11;50939:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:42;50931:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;51144:6:::1;;;;;;;;;;;51143:7;51135:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;51216:7;:5;:7::i;:::-;51202:21;;:10;:21;;;51198:293;;51255:4;51244:15;;:7;;;;;;;;;;;:15;;;51240:240;;;51315:11;51301;;:25;;;;:::i;:::-;51288:9;:38;;51280:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;51240:240;;;51429:11;51412:14;;:28;;;;:::i;:::-;51399:9;:41;;51391:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;51240:240;51198:293;51503:34;51513:10;51525:11;51503:9;:34::i;:::-;51046:501:::0;;:::o;31840:155::-;31935:52;31954:12;:10;:12::i;:::-;31968:8;31978;31935:18;:52::i;:::-;31840:155;;:::o;49724:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51941:569::-;52078:11;;52091:19;;51640:12;51682:10;51665:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;51655:39;;;;;;51640:54;;51727:109;51764:11;;51727:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51794:4;51817;51727:18;:109::i;:::-;51705:185;;;;;;;;;;;;:::i;:::-;;;;;;;;;52136:11:::1;50619:7;:5;:7::i;:::-;50605:21;;:10;:21;;;50601:320;;50643:24;50670:20;:32;50691:10;50670:32;;;;;;;;;;;;;;;;50643:59;;50759:18;;50744:11;50725:16;:30;;;;:::i;:::-;:52;;50717:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;50847:1;50833:11;:15;:52;;;;;50867:18;;50852:11;:33;;50833:52;50825:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;50628:293;50601:320;50972:9;;50958:11;50939:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:42;50931:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;52174:6:::2;;;;;;;;;;;52173:7;52165:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;52236:7;:5;:7::i;:::-;52222:21;;:10;:21;;;52218:236;;52275:4;52264:15;;:7;;;;;;;;;;;:15;;;52260:183;;;52335:11;52321;;:25;;;;:::i;:::-;52308:9;:38;;52300:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;52260:183;;;52419:7;;;;;;;;;;;52411:16;;;::::0;::::2;;52260:183;52218:236;52466:34;52476:10;52488:11;52466:9;:34::i;:::-;51901:1:::1;51629:281:::0;51941:569;;;;;;:::o;49817:103::-;;;;:::o;54526:137::-;8164:12;:10;:12::i;:::-;8153:23;;:7;:5;:7::i;:::-;:23;;;8145:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54636:19:::1;54615:18;:40;;;;54526:137:::0;:::o;32963:328::-;33138:41;33157:12;:10;:12::i;:::-;33171:7;33138:18;:41::i;:::-;33130:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33244:39;33258:4;33264:2;33268:7;33277:5;33244:13;:39::i;:::-;32963:328;;;;:::o;50109:37::-;;;;:::o;52518:122::-;8164:12;:10;:12::i;:::-;8153:23;;:7;:5;:7::i;:::-;:23;;;8145:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52622:10:::1;52600:19;:32;;;;52518:122:::0;:::o;54954:85::-;8164:12;:10;:12::i;:::-;8153:23;;:7;:5;:7::i;:::-;:23;;;8145:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55025:6:::1;55015:7;;:16;;;;;;;;;;;;;;;;;;54954:85:::0;:::o;54028:455::-;54102:13;54136:17;54144:8;54136:7;:17::i;:::-;54128:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;54234:5;54222:17;;:8;;;;;;;;;;;:17;;;54218:74;;;54263:17;54256:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54218:74;54304:28;54335:10;:8;:10::i;:::-;54304:41;;54394:1;54369:14;54363:28;:32;:112;;;;;;;;;;;;;;;;;54422:14;54438:19;:8;:17;:19::i;:::-;54459:9;54405:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54363:112;54356:119;;;54028:455;;;;:::o;50026:32::-;;;;:::o;55819:87::-;8164:12;:10;:12::i;:::-;8153:23;;:7;:5;:7::i;:::-;:23;;;8145:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55892:6:::1;55881:8;;:17;;;;;;;;;;;;;;;;;;55819:87:::0;:::o;32066:164::-;32163:4;32187:18;:25;32206:5;32187:25;;;;;;;;;;;;;;;:35;32213:8;32187:35;;;;;;;;;;;;;;;;;;;;;;;;;32180:42;;32066:164;;;;:::o;52675:162::-;52762:11;50619:7;:5;:7::i;:::-;50605:21;;:10;:21;;;50601:320;;50643:24;50670:20;:32;50691:10;50670:32;;;;;;;;;;;;;;;;50643:59;;50759:18;;50744:11;50725:16;:30;;;;:::i;:::-;:52;;50717:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;50847:1;50833:11;:15;:52;;;;;50867:18;;50852:11;:33;;50833:52;50825:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;50628:293;50601:320;50972:9;;50958:11;50939:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:42;50931:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;8164:12:::1;:10;:12::i;:::-;8153:23;;:7;:5;:7::i;:::-;:23;;;8145:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52796:33:::2;52806:9;52817:11;52796:9;:33::i;:::-;52675:162:::0;;;:::o;8842:201::-;8164:12;:10;:12::i;:::-;8153:23;;:7;:5;:7::i;:::-;:23;;;8145:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8951:1:::1;8931:22;;:8;:22;;;;8923:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;9007:28;9026:8;9007:18;:28::i;:::-;8842:201:::0;:::o;50223:26::-;;;;;;;;;;;;;:::o;29043:305::-;29145:4;29197:25;29182:40;;;:11;:40;;;;:105;;;;29254:33;29239:48;;;:11;:48;;;;29182:105;:158;;;;29304:36;29328:11;29304:23;:36::i;:::-;29182:158;29162:178;;29043:305;;;:::o;34801:127::-;34866:4;34918:1;34890:30;;:7;:16;34898:7;34890:16;;;;;;;;;;;;;;;;;;;;;:30;;;;34883:37;;34801:127;;;:::o;6657:98::-;6710:7;6737:10;6730:17;;6657:98;:::o;38947:174::-;39049:2;39022:15;:24;39038:7;39022:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39105:7;39101:2;39067:46;;39076:23;39091:7;39076:14;:23::i;:::-;39067:46;;;;;;;;;;;;38947:174;;:::o;3261:114::-;3326:7;3353;:14;;;3346:21;;3261:114;;;:::o;35095:348::-;35188:4;35213:16;35221:7;35213;:16::i;:::-;35205:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35289:13;35305:23;35320:7;35305:14;:23::i;:::-;35289:39;;35358:5;35347:16;;:7;:16;;;:51;;;;35391:7;35367:31;;:20;35379:7;35367:11;:20::i;:::-;:31;;;35347:51;:87;;;;35402:32;35419:5;35426:7;35402:16;:32::i;:::-;35347:87;35339:96;;;35095:348;;;;:::o;38204:625::-;38363:4;38336:31;;:23;38351:7;38336:14;:23::i;:::-;:31;;;38328:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;38442:1;38428:16;;:2;:16;;;;38420:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;38498:39;38519:4;38525:2;38529:7;38498:20;:39::i;:::-;38602:29;38619:1;38623:7;38602:8;:29::i;:::-;38663:1;38644:9;:15;38654:4;38644:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;38692:1;38675:9;:13;38685:2;38675:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38723:2;38704:7;:16;38712:7;38704:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38762:7;38758:2;38743:27;;38752:4;38743:27;;;;;;;;;;;;38783:38;38803:4;38809:2;38813:7;38783:19;:38::i;:::-;38204:625;;;:::o;43808:113::-;43869:7;43896:10;:17;;;;43889:24;;43808:113;:::o;9203:191::-;9277:16;9296:6;;;;;;;;;;;9277:25;;9322:8;9313:6;;:17;;;;;;;;;;;;;;;;;;9377:8;9346:40;;9367:8;9346:40;;;;;;;;;;;;9266:128;9203:191;:::o;52865:275::-;52949:9;52944:189;52968:11;52964:1;:15;52944:189;;;53001:18;:6;:16;:18::i;:::-;53034:20;:32;53055:10;53034:32;;;;;;;;;;;;;;;;:34;;;;;;;;;:::i;:::-;;;;;;53083:38;53093:9;53104:16;:6;:14;:16::i;:::-;53083:9;:38::i;:::-;52981:3;;;;;:::i;:::-;;;;52944:189;;;;52865:275;;:::o;39263:315::-;39418:8;39409:17;;:5;:17;;;;39401:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;39505:8;39467:18;:25;39486:5;39467:25;;;;;;;;;;;;;;;:35;39493:8;39467:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;39551:8;39529:41;;39544:5;39529:41;;;39561:8;39529:41;;;;;;:::i;:::-;;;;;;;;39263:315;;;:::o;923:190::-;1048:4;1101;1072:25;1085:5;1092:4;1072:12;:25::i;:::-;:33;1065:40;;923:190;;;;;:::o;34173:315::-;34330:28;34340:4;34346:2;34350:7;34330:9;:28::i;:::-;34377:48;34400:4;34406:2;34410:7;34419:5;34377:22;:48::i;:::-;34369:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;34173:315;;;;:::o;55931:110::-;55991:13;56024:9;56017:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55931:110;:::o;4219:723::-;4275:13;4505:1;4496:5;:10;4492:53;;;4523:10;;;;;;;;;;;;;;;;;;;;;4492:53;4555:12;4570:5;4555:20;;4586:14;4611:78;4626:1;4618:4;:9;4611:78;;4644:8;;;;;:::i;:::-;;;;4675:2;4667:10;;;;;:::i;:::-;;;4611:78;;;4699:19;4731:6;4721:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4699:39;;4749:154;4765:1;4756:5;:10;4749:154;;4793:1;4783:11;;;;;:::i;:::-;;;4860:2;4852:5;:10;;;;:::i;:::-;4839:2;:24;;;;:::i;:::-;4826:39;;4809:6;4816;4809:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;4889:2;4880:11;;;;;:::i;:::-;;;4749:154;;;4927:6;4913:21;;;;;4219:723;;;;:::o;20717:157::-;20802:4;20841:25;20826:40;;;:11;:40;;;;20819:47;;20717:157;;;:::o;44844:589::-;44988:45;45015:4;45021:2;45025:7;44988:26;:45::i;:::-;45066:1;45050:18;;:4;:18;;;45046:187;;;45085:40;45117:7;45085:31;:40::i;:::-;45046:187;;;45155:2;45147:10;;:4;:10;;;45143:90;;45174:47;45207:4;45213:7;45174:32;:47::i;:::-;45143:90;45046:187;45261:1;45247:16;;:2;:16;;;45243:183;;;45280:45;45317:7;45280:36;:45::i;:::-;45243:183;;;45353:4;45347:10;;:2;:10;;;45343:83;;45374:40;45402:2;45406:7;45374:27;:40::i;:::-;45343:83;45243:183;44844:589;;;:::o;42025:125::-;;;;:::o;3383:127::-;3490:1;3472:7;:14;;;:19;;;;;;;;;;;3383:127;:::o;35785:110::-;35861:26;35871:2;35875:7;35861:26;;;;;;;;;;;;:9;:26::i;:::-;35785:110;;:::o;1475:675::-;1558:7;1578:20;1601:4;1578:27;;1621:9;1616:497;1640:5;:12;1636:1;:16;1616:497;;;1674:20;1697:5;1703:1;1697:8;;;;;;;;:::i;:::-;;;;;;;;1674:31;;1740:12;1724;:28;1720:382;;1867:42;1882:12;1896;1867:14;:42::i;:::-;1852:57;;1720:382;;;2044:42;2059:12;2073;2044:14;:42::i;:::-;2029:57;;1720:382;1659:454;1654:3;;;;;:::i;:::-;;;;1616:497;;;;2130:12;2123:19;;;1475:675;;;;:::o;40143:799::-;40298:4;40319:15;:2;:13;;;:15::i;:::-;40315:620;;;40371:2;40355:36;;;40392:12;:10;:12::i;:::-;40406:4;40412:7;40421:5;40355:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40351:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40614:1;40597:6;:13;:18;40593:272;;;40640:60;;;;;;;;;;:::i;:::-;;;;;;;;40593:272;40815:6;40809:13;40800:6;40796:2;40792:15;40785:38;40351:529;40488:41;;;40478:51;;;:6;:51;;;;40471:58;;;;;40315:620;40919:4;40912:11;;40143:799;;;;;;;:::o;41514:126::-;;;;:::o;46156:164::-;46260:10;:17;;;;46233:15;:24;46249:7;46233:24;;;;;;;;;;;:44;;;;46288:10;46304:7;46288:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46156:164;:::o;46947:988::-;47213:22;47263:1;47238:22;47255:4;47238:16;:22::i;:::-;:26;;;;:::i;:::-;47213:51;;47275:18;47296:17;:26;47314:7;47296:26;;;;;;;;;;;;47275:47;;47443:14;47429:10;:28;47425:328;;47474:19;47496:12;:18;47509:4;47496:18;;;;;;;;;;;;;;;:34;47515:14;47496:34;;;;;;;;;;;;47474:56;;47580:11;47547:12;:18;47560:4;47547:18;;;;;;;;;;;;;;;:30;47566:10;47547:30;;;;;;;;;;;:44;;;;47697:10;47664:17;:30;47682:11;47664:30;;;;;;;;;;;:43;;;;47459:294;47425:328;47849:17;:26;47867:7;47849:26;;;;;;;;;;;47842:33;;;47893:12;:18;47906:4;47893:18;;;;;;;;;;;;;;;:34;47912:14;47893:34;;;;;;;;;;;47886:41;;;47028:907;;46947:988;;:::o;48230:1079::-;48483:22;48528:1;48508:10;:17;;;;:21;;;;:::i;:::-;48483:46;;48540:18;48561:15;:24;48577:7;48561:24;;;;;;;;;;;;48540:45;;48912:19;48934:10;48945:14;48934:26;;;;;;;;:::i;:::-;;;;;;;;;;48912:48;;48998:11;48973:10;48984;48973:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;49109:10;49078:15;:28;49094:11;49078:28;;;;;;;;;;;:41;;;;49250:15;:24;49266:7;49250:24;;;;;;;;;;;49243:31;;;49285:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;48301:1008;;;48230:1079;:::o;45734:221::-;45819:14;45836:20;45853:2;45836:16;:20::i;:::-;45819:37;;45894:7;45867:12;:16;45880:2;45867:16;;;;;;;;;;;;;;;:24;45884:6;45867:24;;;;;;;;;;;:34;;;;45941:6;45912:17;:26;45930:7;45912:26;;;;;;;;;;;:35;;;;45808:147;45734:221;;:::o;36122:321::-;36252:18;36258:2;36262:7;36252:5;:18::i;:::-;36303:54;36334:1;36338:2;36342:7;36351:5;36303:22;:54::i;:::-;36281:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;36122:321;;;:::o;2158:224::-;2226:13;2289:1;2283:4;2276:15;2318:1;2312:4;2305:15;2359:4;2353;2343:21;2334:30;;2158:224;;;;:::o;10634:326::-;10694:4;10951:1;10929:7;:19;;;:23;10922:30;;10634:326;;;:::o;36779:439::-;36873:1;36859:16;;:2;:16;;;;36851:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;36932:16;36940:7;36932;:16::i;:::-;36931:17;36923:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;36994:45;37023:1;37027:2;37031:7;36994:20;:45::i;:::-;37069:1;37052:9;:13;37062:2;37052:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37100:2;37081:7;:16;37089:7;37081:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37145:7;37141:2;37120:33;;37137:1;37120:33;;;;;;;;;;;;37166:44;37194:1;37198:2;37202:7;37166:19;:44::i;:::-;36779:439;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1716:139;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1861:137;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2004:141;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:122;;2276:79;;:::i;:::-;2235:122;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;2164:338;;;;:::o;2522:340::-;2578:5;2627:3;2620:4;2612:6;2608:17;2604:27;2594:122;;2635:79;;:::i;:::-;2594:122;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2584:278;2522:340;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2868:139;;;;:::o;3013:329::-;3072:6;3121:2;3109:9;3100:7;3096:23;3092:32;3089:119;;;3127:79;;:::i;:::-;3089:119;3247:1;3272:53;3317:7;3308:6;3297:9;3293:22;3272:53;:::i;:::-;3262:63;;3218:117;3013:329;;;;:::o;3348:474::-;3416:6;3424;3473:2;3461:9;3452:7;3448:23;3444:32;3441:119;;;3479:79;;:::i;:::-;3441:119;3599:1;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3570:117;3726:2;3752:53;3797:7;3788:6;3777:9;3773:22;3752:53;:::i;:::-;3742:63;;3697:118;3348:474;;;;;:::o;3828:619::-;3905:6;3913;3921;3970:2;3958:9;3949:7;3945:23;3941:32;3938:119;;;3976:79;;:::i;:::-;3938:119;4096:1;4121:53;4166:7;4157:6;4146:9;4142:22;4121:53;:::i;:::-;4111:63;;4067:117;4223:2;4249:53;4294:7;4285:6;4274:9;4270:22;4249:53;:::i;:::-;4239:63;;4194:118;4351:2;4377:53;4422:7;4413:6;4402:9;4398:22;4377:53;:::i;:::-;4367:63;;4322:118;3828:619;;;;;:::o;4453:943::-;4548:6;4556;4564;4572;4621:3;4609:9;4600:7;4596:23;4592:33;4589:120;;;4628:79;;:::i;:::-;4589:120;4748:1;4773:53;4818:7;4809:6;4798:9;4794:22;4773:53;:::i;:::-;4763:63;;4719:117;4875:2;4901:53;4946:7;4937:6;4926:9;4922:22;4901:53;:::i;:::-;4891:63;;4846:118;5003:2;5029:53;5074:7;5065:6;5054:9;5050:22;5029:53;:::i;:::-;5019:63;;4974:118;5159:2;5148:9;5144:18;5131:32;5190:18;5182:6;5179:30;5176:117;;;5212:79;;:::i;:::-;5176:117;5317:62;5371:7;5362:6;5351:9;5347:22;5317:62;:::i;:::-;5307:72;;5102:287;4453:943;;;;;;;:::o;5402:468::-;5467:6;5475;5524:2;5512:9;5503:7;5499:23;5495:32;5492:119;;;5530:79;;:::i;:::-;5492:119;5650:1;5675:53;5720:7;5711:6;5700:9;5696:22;5675:53;:::i;:::-;5665:63;;5621:117;5777:2;5803:50;5845:7;5836:6;5825:9;5821:22;5803:50;:::i;:::-;5793:60;;5748:115;5402:468;;;;;:::o;5876:474::-;5944:6;5952;6001:2;5989:9;5980:7;5976:23;5972:32;5969:119;;;6007:79;;:::i;:::-;5969:119;6127:1;6152:53;6197:7;6188:6;6177:9;6173:22;6152:53;:::i;:::-;6142:63;;6098:117;6254:2;6280:53;6325:7;6316:6;6305:9;6301:22;6280:53;:::i;:::-;6270:63;;6225:118;5876:474;;;;;:::o;6356:704::-;6451:6;6459;6467;6516:2;6504:9;6495:7;6491:23;6487:32;6484:119;;;6522:79;;:::i;:::-;6484:119;6670:1;6659:9;6655:17;6642:31;6700:18;6692:6;6689:30;6686:117;;;6722:79;;:::i;:::-;6686:117;6835:80;6907:7;6898:6;6887:9;6883:22;6835:80;:::i;:::-;6817:98;;;;6613:312;6964:2;6990:53;7035:7;7026:6;7015:9;7011:22;6990:53;:::i;:::-;6980:63;;6935:118;6356:704;;;;;:::o;7066:323::-;7122:6;7171:2;7159:9;7150:7;7146:23;7142:32;7139:119;;;7177:79;;:::i;:::-;7139:119;7297:1;7322:50;7364:7;7355:6;7344:9;7340:22;7322:50;:::i;:::-;7312:60;;7268:114;7066:323;;;;:::o;7395:329::-;7454:6;7503:2;7491:9;7482:7;7478:23;7474:32;7471:119;;;7509:79;;:::i;:::-;7471:119;7629:1;7654:53;7699:7;7690:6;7679:9;7675:22;7654:53;:::i;:::-;7644:63;;7600:117;7395:329;;;;:::o;7730:327::-;7788:6;7837:2;7825:9;7816:7;7812:23;7808:32;7805:119;;;7843:79;;:::i;:::-;7805:119;7963:1;7988:52;8032:7;8023:6;8012:9;8008:22;7988:52;:::i;:::-;7978:62;;7934:116;7730:327;;;;:::o;8063:349::-;8132:6;8181:2;8169:9;8160:7;8156:23;8152:32;8149:119;;;8187:79;;:::i;:::-;8149:119;8307:1;8332:63;8387:7;8378:6;8367:9;8363:22;8332:63;:::i;:::-;8322:73;;8278:127;8063:349;;;;:::o;8418:509::-;8487:6;8536:2;8524:9;8515:7;8511:23;8507:32;8504:119;;;8542:79;;:::i;:::-;8504:119;8690:1;8679:9;8675:17;8662:31;8720:18;8712:6;8709:30;8706:117;;;8742:79;;:::i;:::-;8706:117;8847:63;8902:7;8893:6;8882:9;8878:22;8847:63;:::i;:::-;8837:73;;8633:287;8418:509;;;;:::o;8933:329::-;8992:6;9041:2;9029:9;9020:7;9016:23;9012:32;9009:119;;;9047:79;;:::i;:::-;9009:119;9167:1;9192:53;9237:7;9228:6;9217:9;9213:22;9192:53;:::i;:::-;9182:63;;9138:117;8933:329;;;;:::o;9268:474::-;9336:6;9344;9393:2;9381:9;9372:7;9368:23;9364:32;9361:119;;;9399:79;;:::i;:::-;9361:119;9519:1;9544:53;9589:7;9580:6;9569:9;9565:22;9544:53;:::i;:::-;9534:63;;9490:117;9646:2;9672:53;9717:7;9708:6;9697:9;9693:22;9672:53;:::i;:::-;9662:63;;9617:118;9268:474;;;;;:::o;9748:179::-;9817:10;9838:46;9880:3;9872:6;9838:46;:::i;:::-;9916:4;9911:3;9907:14;9893:28;;9748:179;;;;:::o;9933:118::-;10020:24;10038:5;10020:24;:::i;:::-;10015:3;10008:37;9933:118;;:::o;10057:157::-;10162:45;10182:24;10200:5;10182:24;:::i;:::-;10162:45;:::i;:::-;10157:3;10150:58;10057:157;;:::o;10250:732::-;10369:3;10398:54;10446:5;10398:54;:::i;:::-;10468:86;10547:6;10542:3;10468:86;:::i;:::-;10461:93;;10578:56;10628:5;10578:56;:::i;:::-;10657:7;10688:1;10673:284;10698:6;10695:1;10692:13;10673:284;;;10774:6;10768:13;10801:63;10860:3;10845:13;10801:63;:::i;:::-;10794:70;;10887:60;10940:6;10887:60;:::i;:::-;10877:70;;10733:224;10720:1;10717;10713:9;10708:14;;10673:284;;;10677:14;10973:3;10966:10;;10374:608;;;10250:732;;;;:::o;10988:109::-;11069:21;11084:5;11069:21;:::i;:::-;11064:3;11057:34;10988:109;;:::o;11103:118::-;11190:24;11208:5;11190:24;:::i;:::-;11185:3;11178:37;11103:118;;:::o;11227:360::-;11313:3;11341:38;11373:5;11341:38;:::i;:::-;11395:70;11458:6;11453:3;11395:70;:::i;:::-;11388:77;;11474:52;11519:6;11514:3;11507:4;11500:5;11496:16;11474:52;:::i;:::-;11551:29;11573:6;11551:29;:::i;:::-;11546:3;11542:39;11535:46;;11317:270;11227:360;;;;:::o;11593:364::-;11681:3;11709:39;11742:5;11709:39;:::i;:::-;11764:71;11828:6;11823:3;11764:71;:::i;:::-;11757:78;;11844:52;11889:6;11884:3;11877:4;11870:5;11866:16;11844:52;:::i;:::-;11921:29;11943:6;11921:29;:::i;:::-;11916:3;11912:39;11905:46;;11685:272;11593:364;;;;:::o;11963:377::-;12069:3;12097:39;12130:5;12097:39;:::i;:::-;12152:89;12234:6;12229:3;12152:89;:::i;:::-;12145:96;;12250:52;12295:6;12290:3;12283:4;12276:5;12272:16;12250:52;:::i;:::-;12327:6;12322:3;12318:16;12311:23;;12073:267;11963:377;;;;:::o;12370:845::-;12473:3;12510:5;12504:12;12539:36;12565:9;12539:36;:::i;:::-;12591:89;12673:6;12668:3;12591:89;:::i;:::-;12584:96;;12711:1;12700:9;12696:17;12727:1;12722:137;;;;12873:1;12868:341;;;;12689:520;;12722:137;12806:4;12802:9;12791;12787:25;12782:3;12775:38;12842:6;12837:3;12833:16;12826:23;;12722:137;;12868:341;12935:38;12967:5;12935:38;:::i;:::-;12995:1;13009:154;13023:6;13020:1;13017:13;13009:154;;;13097:7;13091:14;13087:1;13082:3;13078:11;13071:35;13147:1;13138:7;13134:15;13123:26;;13045:4;13042:1;13038:12;13033:17;;13009:154;;;13192:6;13187:3;13183:16;13176:23;;12875:334;;12689:520;;12477:738;;12370:845;;;;:::o;13221:366::-;13363:3;13384:67;13448:2;13443:3;13384:67;:::i;:::-;13377:74;;13460:93;13549:3;13460:93;:::i;:::-;13578:2;13573:3;13569:12;13562:19;;13221:366;;;:::o;13593:::-;13735:3;13756:67;13820:2;13815:3;13756:67;:::i;:::-;13749:74;;13832:93;13921:3;13832:93;:::i;:::-;13950:2;13945:3;13941:12;13934:19;;13593:366;;;:::o;13965:::-;14107:3;14128:67;14192:2;14187:3;14128:67;:::i;:::-;14121:74;;14204:93;14293:3;14204:93;:::i;:::-;14322:2;14317:3;14313:12;14306:19;;13965:366;;;:::o;14337:::-;14479:3;14500:67;14564:2;14559:3;14500:67;:::i;:::-;14493:74;;14576:93;14665:3;14576:93;:::i;:::-;14694:2;14689:3;14685:12;14678:19;;14337:366;;;:::o;14709:::-;14851:3;14872:67;14936:2;14931:3;14872:67;:::i;:::-;14865:74;;14948:93;15037:3;14948:93;:::i;:::-;15066:2;15061:3;15057:12;15050:19;;14709:366;;;:::o;15081:::-;15223:3;15244:67;15308:2;15303:3;15244:67;:::i;:::-;15237:74;;15320:93;15409:3;15320:93;:::i;:::-;15438:2;15433:3;15429:12;15422:19;;15081:366;;;:::o;15453:::-;15595:3;15616:67;15680:2;15675:3;15616:67;:::i;:::-;15609:74;;15692:93;15781:3;15692:93;:::i;:::-;15810:2;15805:3;15801:12;15794:19;;15453:366;;;:::o;15825:::-;15967:3;15988:67;16052:2;16047:3;15988:67;:::i;:::-;15981:74;;16064:93;16153:3;16064:93;:::i;:::-;16182:2;16177:3;16173:12;16166:19;;15825:366;;;:::o;16197:::-;16339:3;16360:67;16424:2;16419:3;16360:67;:::i;:::-;16353:74;;16436:93;16525:3;16436:93;:::i;:::-;16554:2;16549:3;16545:12;16538:19;;16197:366;;;:::o;16569:::-;16711:3;16732:67;16796:2;16791:3;16732:67;:::i;:::-;16725:74;;16808:93;16897:3;16808:93;:::i;:::-;16926:2;16921:3;16917:12;16910:19;;16569:366;;;:::o;16941:::-;17083:3;17104:67;17168:2;17163:3;17104:67;:::i;:::-;17097:74;;17180:93;17269:3;17180:93;:::i;:::-;17298:2;17293:3;17289:12;17282:19;;16941:366;;;:::o;17313:::-;17455:3;17476:67;17540:2;17535:3;17476:67;:::i;:::-;17469:74;;17552:93;17641:3;17552:93;:::i;:::-;17670:2;17665:3;17661:12;17654:19;;17313:366;;;:::o;17685:::-;17827:3;17848:67;17912:2;17907:3;17848:67;:::i;:::-;17841:74;;17924:93;18013:3;17924:93;:::i;:::-;18042:2;18037:3;18033:12;18026:19;;17685:366;;;:::o;18057:::-;18199:3;18220:67;18284:2;18279:3;18220:67;:::i;:::-;18213:74;;18296:93;18385:3;18296:93;:::i;:::-;18414:2;18409:3;18405:12;18398:19;;18057:366;;;:::o;18429:::-;18571:3;18592:67;18656:2;18651:3;18592:67;:::i;:::-;18585:74;;18668:93;18757:3;18668:93;:::i;:::-;18786:2;18781:3;18777:12;18770:19;;18429:366;;;:::o;18801:::-;18943:3;18964:67;19028:2;19023:3;18964:67;:::i;:::-;18957:74;;19040:93;19129:3;19040:93;:::i;:::-;19158:2;19153:3;19149:12;19142:19;;18801:366;;;:::o;19173:::-;19315:3;19336:67;19400:2;19395:3;19336:67;:::i;:::-;19329:74;;19412:93;19501:3;19412:93;:::i;:::-;19530:2;19525:3;19521:12;19514:19;;19173:366;;;:::o;19545:::-;19687:3;19708:67;19772:2;19767:3;19708:67;:::i;:::-;19701:74;;19784:93;19873:3;19784:93;:::i;:::-;19902:2;19897:3;19893:12;19886:19;;19545:366;;;:::o;19917:::-;20059:3;20080:67;20144:2;20139:3;20080:67;:::i;:::-;20073:74;;20156:93;20245:3;20156:93;:::i;:::-;20274:2;20269:3;20265:12;20258:19;;19917:366;;;:::o;20289:::-;20431:3;20452:67;20516:2;20511:3;20452:67;:::i;:::-;20445:74;;20528:93;20617:3;20528:93;:::i;:::-;20646:2;20641:3;20637:12;20630:19;;20289:366;;;:::o;20661:398::-;20820:3;20841:83;20922:1;20917:3;20841:83;:::i;:::-;20834:90;;20933:93;21022:3;20933:93;:::i;:::-;21051:1;21046:3;21042:11;21035:18;;20661:398;;;:::o;21065:366::-;21207:3;21228:67;21292:2;21287:3;21228:67;:::i;:::-;21221:74;;21304:93;21393:3;21304:93;:::i;:::-;21422:2;21417:3;21413:12;21406:19;;21065:366;;;:::o;21437:::-;21579:3;21600:67;21664:2;21659:3;21600:67;:::i;:::-;21593:74;;21676:93;21765:3;21676:93;:::i;:::-;21794:2;21789:3;21785:12;21778:19;;21437:366;;;:::o;21809:::-;21951:3;21972:67;22036:2;22031:3;21972:67;:::i;:::-;21965:74;;22048:93;22137:3;22048:93;:::i;:::-;22166:2;22161:3;22157:12;22150:19;;21809:366;;;:::o;22181:::-;22323:3;22344:67;22408:2;22403:3;22344:67;:::i;:::-;22337:74;;22420:93;22509:3;22420:93;:::i;:::-;22538:2;22533:3;22529:12;22522:19;;22181:366;;;:::o;22553:108::-;22630:24;22648:5;22630:24;:::i;:::-;22625:3;22618:37;22553:108;;:::o;22667:118::-;22754:24;22772:5;22754:24;:::i;:::-;22749:3;22742:37;22667:118;;:::o;22791:256::-;22903:3;22918:75;22989:3;22980:6;22918:75;:::i;:::-;23018:2;23013:3;23009:12;23002:19;;23038:3;23031:10;;22791:256;;;;:::o;23053:589::-;23278:3;23300:95;23391:3;23382:6;23300:95;:::i;:::-;23293:102;;23412:95;23503:3;23494:6;23412:95;:::i;:::-;23405:102;;23524:92;23612:3;23603:6;23524:92;:::i;:::-;23517:99;;23633:3;23626:10;;23053:589;;;;;;:::o;23648:379::-;23832:3;23854:147;23997:3;23854:147;:::i;:::-;23847:154;;24018:3;24011:10;;23648:379;;;:::o;24033:222::-;24126:4;24164:2;24153:9;24149:18;24141:26;;24177:71;24245:1;24234:9;24230:17;24221:6;24177:71;:::i;:::-;24033:222;;;;:::o;24261:640::-;24456:4;24494:3;24483:9;24479:19;24471:27;;24508:71;24576:1;24565:9;24561:17;24552:6;24508:71;:::i;:::-;24589:72;24657:2;24646:9;24642:18;24633:6;24589:72;:::i;:::-;24671;24739:2;24728:9;24724:18;24715:6;24671:72;:::i;:::-;24790:9;24784:4;24780:20;24775:2;24764:9;24760:18;24753:48;24818:76;24889:4;24880:6;24818:76;:::i;:::-;24810:84;;24261:640;;;;;;;:::o;24907:373::-;25050:4;25088:2;25077:9;25073:18;25065:26;;25137:9;25131:4;25127:20;25123:1;25112:9;25108:17;25101:47;25165:108;25268:4;25259:6;25165:108;:::i;:::-;25157:116;;24907:373;;;;:::o;25286:210::-;25373:4;25411:2;25400:9;25396:18;25388:26;;25424:65;25486:1;25475:9;25471:17;25462:6;25424:65;:::i;:::-;25286:210;;;;:::o;25502:222::-;25595:4;25633:2;25622:9;25618:18;25610:26;;25646:71;25714:1;25703:9;25699:17;25690:6;25646:71;:::i;:::-;25502:222;;;;:::o;25730:313::-;25843:4;25881:2;25870:9;25866:18;25858:26;;25930:9;25924:4;25920:20;25916:1;25905:9;25901:17;25894:47;25958:78;26031:4;26022:6;25958:78;:::i;:::-;25950:86;;25730:313;;;;:::o;26049:419::-;26215:4;26253:2;26242:9;26238:18;26230:26;;26302:9;26296:4;26292:20;26288:1;26277:9;26273:17;26266:47;26330:131;26456:4;26330:131;:::i;:::-;26322:139;;26049:419;;;:::o;26474:::-;26640:4;26678:2;26667:9;26663:18;26655:26;;26727:9;26721:4;26717:20;26713:1;26702:9;26698:17;26691:47;26755:131;26881:4;26755:131;:::i;:::-;26747:139;;26474:419;;;:::o;26899:::-;27065:4;27103:2;27092:9;27088:18;27080:26;;27152:9;27146:4;27142:20;27138:1;27127:9;27123:17;27116:47;27180:131;27306:4;27180:131;:::i;:::-;27172:139;;26899:419;;;:::o;27324:::-;27490:4;27528:2;27517:9;27513:18;27505:26;;27577:9;27571:4;27567:20;27563:1;27552:9;27548:17;27541:47;27605:131;27731:4;27605:131;:::i;:::-;27597:139;;27324:419;;;:::o;27749:::-;27915:4;27953:2;27942:9;27938:18;27930:26;;28002:9;27996:4;27992:20;27988:1;27977:9;27973:17;27966:47;28030:131;28156:4;28030:131;:::i;:::-;28022:139;;27749:419;;;:::o;28174:::-;28340:4;28378:2;28367:9;28363:18;28355:26;;28427:9;28421:4;28417:20;28413:1;28402:9;28398:17;28391:47;28455:131;28581:4;28455:131;:::i;:::-;28447:139;;28174:419;;;:::o;28599:::-;28765:4;28803:2;28792:9;28788:18;28780:26;;28852:9;28846:4;28842:20;28838:1;28827:9;28823:17;28816:47;28880:131;29006:4;28880:131;:::i;:::-;28872:139;;28599:419;;;:::o;29024:::-;29190:4;29228:2;29217:9;29213:18;29205:26;;29277:9;29271:4;29267:20;29263:1;29252:9;29248:17;29241:47;29305:131;29431:4;29305:131;:::i;:::-;29297:139;;29024:419;;;:::o;29449:::-;29615:4;29653:2;29642:9;29638:18;29630:26;;29702:9;29696:4;29692:20;29688:1;29677:9;29673:17;29666:47;29730:131;29856:4;29730:131;:::i;:::-;29722:139;;29449:419;;;:::o;29874:::-;30040:4;30078:2;30067:9;30063:18;30055:26;;30127:9;30121:4;30117:20;30113:1;30102:9;30098:17;30091:47;30155:131;30281:4;30155:131;:::i;:::-;30147:139;;29874:419;;;:::o;30299:::-;30465:4;30503:2;30492:9;30488:18;30480:26;;30552:9;30546:4;30542:20;30538:1;30527:9;30523:17;30516:47;30580:131;30706:4;30580:131;:::i;:::-;30572:139;;30299:419;;;:::o;30724:::-;30890:4;30928:2;30917:9;30913:18;30905:26;;30977:9;30971:4;30967:20;30963:1;30952:9;30948:17;30941:47;31005:131;31131:4;31005:131;:::i;:::-;30997:139;;30724:419;;;:::o;31149:::-;31315:4;31353:2;31342:9;31338:18;31330:26;;31402:9;31396:4;31392:20;31388:1;31377:9;31373:17;31366:47;31430:131;31556:4;31430:131;:::i;:::-;31422:139;;31149:419;;;:::o;31574:::-;31740:4;31778:2;31767:9;31763:18;31755:26;;31827:9;31821:4;31817:20;31813:1;31802:9;31798:17;31791:47;31855:131;31981:4;31855:131;:::i;:::-;31847:139;;31574:419;;;:::o;31999:::-;32165:4;32203:2;32192:9;32188:18;32180:26;;32252:9;32246:4;32242:20;32238:1;32227:9;32223:17;32216:47;32280:131;32406:4;32280:131;:::i;:::-;32272:139;;31999:419;;;:::o;32424:::-;32590:4;32628:2;32617:9;32613:18;32605:26;;32677:9;32671:4;32667:20;32663:1;32652:9;32648:17;32641:47;32705:131;32831:4;32705:131;:::i;:::-;32697:139;;32424:419;;;:::o;32849:::-;33015:4;33053:2;33042:9;33038:18;33030:26;;33102:9;33096:4;33092:20;33088:1;33077:9;33073:17;33066:47;33130:131;33256:4;33130:131;:::i;:::-;33122:139;;32849:419;;;:::o;33274:::-;33440:4;33478:2;33467:9;33463:18;33455:26;;33527:9;33521:4;33517:20;33513:1;33502:9;33498:17;33491:47;33555:131;33681:4;33555:131;:::i;:::-;33547:139;;33274:419;;;:::o;33699:::-;33865:4;33903:2;33892:9;33888:18;33880:26;;33952:9;33946:4;33942:20;33938:1;33927:9;33923:17;33916:47;33980:131;34106:4;33980:131;:::i;:::-;33972:139;;33699:419;;;:::o;34124:::-;34290:4;34328:2;34317:9;34313:18;34305:26;;34377:9;34371:4;34367:20;34363:1;34352:9;34348:17;34341:47;34405:131;34531:4;34405:131;:::i;:::-;34397:139;;34124:419;;;:::o;34549:::-;34715:4;34753:2;34742:9;34738:18;34730:26;;34802:9;34796:4;34792:20;34788:1;34777:9;34773:17;34766:47;34830:131;34956:4;34830:131;:::i;:::-;34822:139;;34549:419;;;:::o;34974:::-;35140:4;35178:2;35167:9;35163:18;35155:26;;35227:9;35221:4;35217:20;35213:1;35202:9;35198:17;35191:47;35255:131;35381:4;35255:131;:::i;:::-;35247:139;;34974:419;;;:::o;35399:::-;35565:4;35603:2;35592:9;35588:18;35580:26;;35652:9;35646:4;35642:20;35638:1;35627:9;35623:17;35616:47;35680:131;35806:4;35680:131;:::i;:::-;35672:139;;35399:419;;;:::o;35824:::-;35990:4;36028:2;36017:9;36013:18;36005:26;;36077:9;36071:4;36067:20;36063:1;36052:9;36048:17;36041:47;36105:131;36231:4;36105:131;:::i;:::-;36097:139;;35824:419;;;:::o;36249:222::-;36342:4;36380:2;36369:9;36365:18;36357:26;;36393:71;36461:1;36450:9;36446:17;36437:6;36393:71;:::i;:::-;36249:222;;;;:::o;36477:129::-;36511:6;36538:20;;:::i;:::-;36528:30;;36567:33;36595:4;36587:6;36567:33;:::i;:::-;36477:129;;;:::o;36612:75::-;36645:6;36678:2;36672:9;36662:19;;36612:75;:::o;36693:307::-;36754:4;36844:18;36836:6;36833:30;36830:56;;;36866:18;;:::i;:::-;36830:56;36904:29;36926:6;36904:29;:::i;:::-;36896:37;;36988:4;36982;36978:15;36970:23;;36693:307;;;:::o;37006:308::-;37068:4;37158:18;37150:6;37147:30;37144:56;;;37180:18;;:::i;:::-;37144:56;37218:29;37240:6;37218:29;:::i;:::-;37210:37;;37302:4;37296;37292:15;37284:23;;37006:308;;;:::o;37320:132::-;37387:4;37410:3;37402:11;;37440:4;37435:3;37431:14;37423:22;;37320:132;;;:::o;37458:141::-;37507:4;37530:3;37522:11;;37553:3;37550:1;37543:14;37587:4;37584:1;37574:18;37566:26;;37458:141;;;:::o;37605:114::-;37672:6;37706:5;37700:12;37690:22;;37605:114;;;:::o;37725:98::-;37776:6;37810:5;37804:12;37794:22;;37725:98;;;:::o;37829:99::-;37881:6;37915:5;37909:12;37899:22;;37829:99;;;:::o;37934:113::-;38004:4;38036;38031:3;38027:14;38019:22;;37934:113;;;:::o;38053:184::-;38152:11;38186:6;38181:3;38174:19;38226:4;38221:3;38217:14;38202:29;;38053:184;;;;:::o;38243:168::-;38326:11;38360:6;38355:3;38348:19;38400:4;38395:3;38391:14;38376:29;;38243:168;;;;:::o;38417:147::-;38518:11;38555:3;38540:18;;38417:147;;;;:::o;38570:169::-;38654:11;38688:6;38683:3;38676:19;38728:4;38723:3;38719:14;38704:29;;38570:169;;;;:::o;38745:148::-;38847:11;38884:3;38869:18;;38745:148;;;;:::o;38899:305::-;38939:3;38958:20;38976:1;38958:20;:::i;:::-;38953:25;;38992:20;39010:1;38992:20;:::i;:::-;38987:25;;39146:1;39078:66;39074:74;39071:1;39068:81;39065:107;;;39152:18;;:::i;:::-;39065:107;39196:1;39193;39189:9;39182:16;;38899:305;;;;:::o;39210:185::-;39250:1;39267:20;39285:1;39267:20;:::i;:::-;39262:25;;39301:20;39319:1;39301:20;:::i;:::-;39296:25;;39340:1;39330:35;;39345:18;;:::i;:::-;39330:35;39387:1;39384;39380:9;39375:14;;39210:185;;;;:::o;39401:348::-;39441:7;39464:20;39482:1;39464:20;:::i;:::-;39459:25;;39498:20;39516:1;39498:20;:::i;:::-;39493:25;;39686:1;39618:66;39614:74;39611:1;39608:81;39603:1;39596:9;39589:17;39585:105;39582:131;;;39693:18;;:::i;:::-;39582:131;39741:1;39738;39734:9;39723:20;;39401:348;;;;:::o;39755:191::-;39795:4;39815:20;39833:1;39815:20;:::i;:::-;39810:25;;39849:20;39867:1;39849:20;:::i;:::-;39844:25;;39888:1;39885;39882:8;39879:34;;;39893:18;;:::i;:::-;39879:34;39938:1;39935;39931:9;39923:17;;39755:191;;;;:::o;39952:96::-;39989:7;40018:24;40036:5;40018:24;:::i;:::-;40007:35;;39952:96;;;:::o;40054:90::-;40088:7;40131:5;40124:13;40117:21;40106:32;;40054:90;;;:::o;40150:77::-;40187:7;40216:5;40205:16;;40150:77;;;:::o;40233:149::-;40269:7;40309:66;40302:5;40298:78;40287:89;;40233:149;;;:::o;40388:126::-;40425:7;40465:42;40458:5;40454:54;40443:65;;40388:126;;;:::o;40520:77::-;40557:7;40586:5;40575:16;;40520:77;;;:::o;40603:154::-;40687:6;40682:3;40677;40664:30;40749:1;40740:6;40735:3;40731:16;40724:27;40603:154;;;:::o;40763:307::-;40831:1;40841:113;40855:6;40852:1;40849:13;40841:113;;;40940:1;40935:3;40931:11;40925:18;40921:1;40916:3;40912:11;40905:39;40877:2;40874:1;40870:10;40865:15;;40841:113;;;40972:6;40969:1;40966:13;40963:101;;;41052:1;41043:6;41038:3;41034:16;41027:27;40963:101;40812:258;40763:307;;;:::o;41076:320::-;41120:6;41157:1;41151:4;41147:12;41137:22;;41204:1;41198:4;41194:12;41225:18;41215:81;;41281:4;41273:6;41269:17;41259:27;;41215:81;41343:2;41335:6;41332:14;41312:18;41309:38;41306:84;;;41362:18;;:::i;:::-;41306:84;41127:269;41076:320;;;:::o;41402:281::-;41485:27;41507:4;41485:27;:::i;:::-;41477:6;41473:40;41615:6;41603:10;41600:22;41579:18;41567:10;41564:34;41561:62;41558:88;;;41626:18;;:::i;:::-;41558:88;41666:10;41662:2;41655:22;41445:238;41402:281;;:::o;41689:233::-;41728:3;41751:24;41769:5;41751:24;:::i;:::-;41742:33;;41797:66;41790:5;41787:77;41784:103;;;41867:18;;:::i;:::-;41784:103;41914:1;41907:5;41903:13;41896:20;;41689:233;;;:::o;41928:100::-;41967:7;41996:26;42016:5;41996:26;:::i;:::-;41985:37;;41928:100;;;:::o;42034:94::-;42073:7;42102:20;42116:5;42102:20;:::i;:::-;42091:31;;42034:94;;;:::o;42134:176::-;42166:1;42183:20;42201:1;42183:20;:::i;:::-;42178:25;;42217:20;42235:1;42217:20;:::i;:::-;42212:25;;42256:1;42246:35;;42261:18;;:::i;:::-;42246:35;42302:1;42299;42295:9;42290:14;;42134:176;;;;:::o;42316:180::-;42364:77;42361:1;42354:88;42461:4;42458:1;42451:15;42485:4;42482:1;42475:15;42502:180;42550:77;42547:1;42540:88;42647:4;42644:1;42637:15;42671:4;42668:1;42661:15;42688:180;42736:77;42733:1;42726:88;42833:4;42830:1;42823:15;42857:4;42854:1;42847:15;42874:180;42922:77;42919:1;42912:88;43019:4;43016:1;43009:15;43043:4;43040:1;43033:15;43060:180;43108:77;43105:1;43098:88;43205:4;43202:1;43195:15;43229:4;43226:1;43219:15;43246:180;43294:77;43291:1;43284:88;43391:4;43388:1;43381:15;43415:4;43412:1;43405:15;43432:117;43541:1;43538;43531:12;43555:117;43664:1;43661;43654:12;43678:117;43787:1;43784;43777:12;43801:117;43910:1;43907;43900:12;43924:117;44033:1;44030;44023:12;44047:117;44156:1;44153;44146:12;44170:102;44211:6;44262:2;44258:7;44253:2;44246:5;44242:14;44238:28;44228:38;;44170:102;;;:::o;44278:94::-;44311:8;44359:5;44355:2;44351:14;44330:35;;44278:94;;;:::o;44378:169::-;44518:21;44514:1;44506:6;44502:14;44495:45;44378:169;:::o;44553:230::-;44693:34;44689:1;44681:6;44677:14;44670:58;44762:13;44757:2;44749:6;44745:15;44738:38;44553:230;:::o;44789:237::-;44929:34;44925:1;44917:6;44913:14;44906:58;44998:20;44993:2;44985:6;44981:15;44974:45;44789:237;:::o;45032:172::-;45172:24;45168:1;45160:6;45156:14;45149:48;45032:172;:::o;45210:225::-;45350:34;45346:1;45338:6;45334:14;45327:58;45419:8;45414:2;45406:6;45402:15;45395:33;45210:225;:::o;45441:224::-;45581:34;45577:1;45569:6;45565:14;45558:58;45650:7;45645:2;45637:6;45633:15;45626:32;45441:224;:::o;45671:178::-;45811:30;45807:1;45799:6;45795:14;45788:54;45671:178;:::o;45855:223::-;45995:34;45991:1;45983:6;45979:14;45972:58;46064:6;46059:2;46051:6;46047:15;46040:31;45855:223;:::o;46084:175::-;46224:27;46220:1;46212:6;46208:14;46201:51;46084:175;:::o;46265:176::-;46405:28;46401:1;46393:6;46389:14;46382:52;46265:176;:::o;46447:231::-;46587:34;46583:1;46575:6;46571:14;46564:58;46656:14;46651:2;46643:6;46639:15;46632:39;46447:231;:::o;46684:243::-;46824:34;46820:1;46812:6;46808:14;46801:58;46893:26;46888:2;46880:6;46876:15;46869:51;46684:243;:::o;46933:229::-;47073:34;47069:1;47061:6;47057:14;47050:58;47142:12;47137:2;47129:6;47125:15;47118:37;46933:229;:::o;47168:228::-;47308:34;47304:1;47296:6;47292:14;47285:58;47377:11;47372:2;47364:6;47360:15;47353:36;47168:228;:::o;47402:182::-;47542:34;47538:1;47530:6;47526:14;47519:58;47402:182;:::o;47590:231::-;47730:34;47726:1;47718:6;47714:14;47707:58;47799:14;47794:2;47786:6;47782:15;47775:39;47590:231;:::o;47827:182::-;47967:34;47963:1;47955:6;47951:14;47944:58;47827:182;:::o;48015:234::-;48155:34;48151:1;48143:6;48139:14;48132:58;48224:17;48219:2;48211:6;48207:15;48200:42;48015:234;:::o;48255:178::-;48395:30;48391:1;48383:6;48379:14;48372:54;48255:178;:::o;48439:220::-;48579:34;48575:1;48567:6;48563:14;48556:58;48648:3;48643:2;48635:6;48631:15;48624:28;48439:220;:::o;48665:114::-;;:::o;48785:236::-;48925:34;48921:1;48913:6;48909:14;48902:58;48994:19;48989:2;48981:6;48977:15;48970:44;48785:236;:::o;49027:169::-;49167:21;49163:1;49155:6;49151:14;49144:45;49027:169;:::o;49202:231::-;49342:34;49338:1;49330:6;49326:14;49319:58;49411:14;49406:2;49398:6;49394:15;49387:39;49202:231;:::o;49439:169::-;49579:21;49575:1;49567:6;49563:14;49556:45;49439:169;:::o;49614:122::-;49687:24;49705:5;49687:24;:::i;:::-;49680:5;49677:35;49667:63;;49726:1;49723;49716:12;49667:63;49614:122;:::o;49742:116::-;49812:21;49827:5;49812:21;:::i;:::-;49805:5;49802:32;49792:60;;49848:1;49845;49838:12;49792:60;49742:116;:::o;49864:122::-;49937:24;49955:5;49937:24;:::i;:::-;49930:5;49927:35;49917:63;;49976:1;49973;49966:12;49917:63;49864:122;:::o;49992:120::-;50064:23;50081:5;50064:23;:::i;:::-;50057:5;50054:34;50044:62;;50102:1;50099;50092:12;50044:62;49992:120;:::o;50118:122::-;50191:24;50209:5;50191:24;:::i;:::-;50184:5;50181:35;50171:63;;50230:1;50227;50220:12;50171:63;50118:122;:::o

Swarm Source

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