ETH Price: $3,309.05 (+1.03%)
Gas: 4 Gwei

Token

eldertown.wtf (ETWTF)
 

Overview

Max Total Supply

201 ETWTF

Holders

110

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 ETWTF
0x8023627afa6f626ce396c82b4ad5182f437be1c7
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:
ElderTown

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-06-08
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

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


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @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: contracts/ElderTown.sol


pragma solidity 0.8.9;





contract ElderTown is ERC721Enumerable, Ownable {
  using Strings for uint256;

  string private _baseTokenURI = "ipfs://QmPBYKxSU589fyURqyMxWupAszVmXoSnDt625wwYZEcaaY/";
  string private extension = ".json";
  address public admin1 = 0xFE1fB7b4bFd60c4720DA9b2f592d2bc031158ab9;
  address public admin2 = 0x54971d0BEBf8a2dDbEad21A64ba9b3F84B5783eF;
  address public admin3 = 0x1e6f1aa7d06c8a3483efed7Cf6B345c5b8D976b5;
  address public admin4 = 0x9dB36dd20A86C32779CE86821f7bb18A55AbA79e;
  address public admin5 = 0x22667dA0463755aa23947c3c754dBb8dA795b8F1;
  uint256 public constant MAX_ENTRIES = 7777;
  uint256 public constant PRESALE_ENTRIES = 2777;
  uint256 public constant PRESALE_PERIOD = 414;
  uint256 public constant PRICE = 0.0045 ether;
  uint256 public constant PRESALE_LIMIT = 2;
  uint256 public constant LIMIT_PER_TRANSACTION = 20;
  uint256 public totalMinted;
  uint public startTime;
  bool public saleStarted;
  bytes32 private root;

  constructor() ERC721("eldertown.wtf", "ETWTF") {
      saleStarted = false;
  }

  function mint(bytes32[] memory _proof, uint256 amount) external payable {
    uint256 value = msg.value;
    uint256 balance = balanceOf(msg.sender);
    uint256 _amount = amount;
    require(saleStarted == true, "Sale Has Not Started");
    if (block.timestamp - startTime < PRESALE_PERIOD) {
      require(MerkleProof.verify(_proof, root, keccak256(abi.encodePacked(msg.sender))) == true, "Not on whitelist");
      require(balance + _amount <= PRESALE_LIMIT, "Exceeds Max Presale Amount Per Wallet");
      require(totalMinted + _amount <= PRESALE_ENTRIES, "Exceeds Presale Amount");
    } else {
      require(_amount + totalMinted <= MAX_ENTRIES, "Exceeds Total Amounts");
      require(_amount <= LIMIT_PER_TRANSACTION, "Exceeds Max Amount Per Transaction");
      uint256 free;
      if (totalMinted < PRESALE_ENTRIES) {
        free = 1;
        if (MerkleProof.verify(_proof, root, keccak256(abi.encodePacked(msg.sender))) == true) {
          free += 2;
        }
        if (free >= balance) {
          free -= balance;
        } else {
          free = 0;
        }
        if (free > PRESALE_ENTRIES - totalMinted) {
          free = PRESALE_ENTRIES - totalMinted;
        }
      }
      if (_amount >= free) {
        _amount -= free;
      } else {
        _amount = 0;
      }
      require(value >= PRICE * _amount, "Insufficient Fund");
    }
    for (uint256 i = 0 ; i < amount ; ++i) {
      _safeMint(msg.sender, ++totalMinted);
    }
    payable(admin1).transfer(value * 3 / 10);
    payable(admin2).transfer(value * 3 / 10);
    payable(admin3).transfer(value * 225 / 1000);
    payable(admin4).transfer(value * 125 / 1000);
    payable(admin5).transfer(value * 5 / 100);
  }

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

  function setBaseURI(string memory baseURI) public onlyOwner {
    _baseTokenURI = baseURI;
  }

  function startSale() external onlyOwner {
    saleStarted = true;
    startTime = block.timestamp;
  }

  function getTime() external view returns(uint256) {
    return block.timestamp - startTime;
  }

  function getExtension() external view returns (string memory) {
    return extension;
  }

  function setExtension(string memory newExtension) external {
    extension = newExtension;
  }

  function setRoot(bytes32 _newRoot) external onlyOwner {
    root = _newRoot;
  }

  function tokenURI(uint256 tokenId) override public view returns (string memory) {
    require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
    return string(abi.encodePacked(_baseTokenURI, tokenId.toString(), extension));
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"LIMIT_PER_TRANSACTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ENTRIES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_ENTRIES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin3","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin4","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin5","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"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":"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":[],"name":"saleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newExtension","type":"string"}],"name":"setExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newRoot","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"}]

608060405260405180606001604052806036815260200162004edd60369139600b908051906020019062000035929190620003ea565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c908051906020019062000083929190620003ea565b5073fe1fb7b4bfd60c4720da9b2f592d2bc031158ab9600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507354971d0bebf8a2ddbead21a64ba9b3f84b5783ef600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550731e6f1aa7d06c8a3483efed7cf6b345c5b8d976b5600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550739db36dd20a86c32779ce86821f7bb18a55aba79e601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507322667da0463755aa23947c3c754dbb8da795b8f1601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200023a57600080fd5b506040518060400160405280600d81526020017f656c646572746f776e2e777466000000000000000000000000000000000000008152506040518060400160405280600581526020017f45545754460000000000000000000000000000000000000000000000000000008152508160009080519060200190620002bf929190620003ea565b508060019080519060200190620002d8929190620003ea565b505050620002fb620002ef6200031c60201b60201c565b6200032460201b60201c565b6000601460006101000a81548160ff021916908315150217905550620004ff565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620003f890620004c9565b90600052602060002090601f0160209004810192826200041c576000855562000468565b82601f106200043757805160ff191683800117855562000468565b8280016001018555821562000468579182015b82811115620004675782518255916020019190600101906200044a565b5b5090506200047791906200047b565b5090565b5b80821115620004965760008160009055506001016200047c565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004e257607f821691505b60208210811415620004f957620004f86200049a565b5b50919050565b6149ce806200050f6000396000f3fe60806040526004361061023b5760003560e01c806370a082311161012e578063a22cb465116100ab578063c87b56dd1161006f578063c87b56dd14610848578063dab5f34014610885578063e1bfb529146108ae578063e985e9c5146108d9578063f2fde38b146109165761023b565b8063a22cb46514610789578063a2309ff8146107b2578063b66a0e5d146107dd578063b88d4fde146107f4578063c580c4301461081d5761023b565b80637e2285aa116100f25780637e2285aa146106b45780638d859f3e146106dd5780638da5cb5b1461070857806395d89b41146107335780639a0d4f401461075e5761023b565b806370a08231146105df578063715018a61461061c578063776ce6a11461063357806378e979251461065e5780637d4cb964146106895761023b565b80632b0c685a116101bc5780634f6ccce7116101805780634f6ccce7146104e6578063557ed1ba1461052357806355f804b31461054e5780635c474f9e146105775780636352211e146105a25761023b565b80632b0c685a1461040e5780632f745c591461043957806342842e0e1461047657806345de0d9b1461049f57806347289075146104bb5761023b565b8063115976c411610203578063115976c41461033957806318160ddd146103645780631aee3f911461038f5780631de46a78146103ba57806323b872dd146103e55761023b565b806301ffc9a71461024057806306a8f8a21461027d57806306fdde03146102a8578063081812fc146102d3578063095ea7b314610310575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190612ff1565b61093f565b6040516102749190613039565b60405180910390f35b34801561028957600080fd5b506102926109b9565b60405161029f9190613095565b60405180910390f35b3480156102b457600080fd5b506102bd6109df565b6040516102ca9190613149565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f591906131a1565b610a71565b6040516103079190613095565b60405180910390f35b34801561031c57600080fd5b50610337600480360381019061033291906131fa565b610af6565b005b34801561034557600080fd5b5061034e610c0e565b60405161035b9190613095565b60405180910390f35b34801561037057600080fd5b50610379610c34565b6040516103869190613249565b60405180910390f35b34801561039b57600080fd5b506103a4610c41565b6040516103b19190613249565b60405180910390f35b3480156103c657600080fd5b506103cf610c46565b6040516103dc9190613095565b60405180910390f35b3480156103f157600080fd5b5061040c60048036038101906104079190613264565b610c6c565b005b34801561041a57600080fd5b50610423610ccc565b6040516104309190613095565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b91906131fa565b610cf2565b60405161046d9190613249565b60405180910390f35b34801561048257600080fd5b5061049d60048036038101906104989190613264565b610d97565b005b6104b960048036038101906104b49190613435565b610db7565b005b3480156104c757600080fd5b506104d06113da565b6040516104dd9190613249565b60405180910390f35b3480156104f257600080fd5b5061050d600480360381019061050891906131a1565b6113df565b60405161051a9190613249565b60405180910390f35b34801561052f57600080fd5b50610538611450565b6040516105459190613249565b60405180910390f35b34801561055a57600080fd5b5061057560048036038101906105709190613546565b611465565b005b34801561058357600080fd5b5061058c6114fb565b6040516105999190613039565b60405180910390f35b3480156105ae57600080fd5b506105c960048036038101906105c491906131a1565b61150e565b6040516105d69190613095565b60405180910390f35b3480156105eb57600080fd5b506106066004803603810190610601919061358f565b6115c0565b6040516106139190613249565b60405180910390f35b34801561062857600080fd5b50610631611678565b005b34801561063f57600080fd5b50610648611700565b6040516106559190613149565b60405180910390f35b34801561066a57600080fd5b50610673611792565b6040516106809190613249565b60405180910390f35b34801561069557600080fd5b5061069e611798565b6040516106ab9190613249565b60405180910390f35b3480156106c057600080fd5b506106db60048036038101906106d69190613546565b61179e565b005b3480156106e957600080fd5b506106f26117b8565b6040516106ff9190613249565b60405180910390f35b34801561071457600080fd5b5061071d6117c3565b60405161072a9190613095565b60405180910390f35b34801561073f57600080fd5b506107486117ed565b6040516107559190613149565b60405180910390f35b34801561076a57600080fd5b5061077361187f565b6040516107809190613249565b60405180910390f35b34801561079557600080fd5b506107b060048036038101906107ab91906135e8565b611885565b005b3480156107be57600080fd5b506107c761189b565b6040516107d49190613249565b60405180910390f35b3480156107e957600080fd5b506107f26118a1565b005b34801561080057600080fd5b5061081b600480360381019061081691906136c9565b611941565b005b34801561082957600080fd5b506108326119a3565b60405161083f9190613095565b60405180910390f35b34801561085457600080fd5b5061086f600480360381019061086a91906131a1565b6119c9565b60405161087c9190613149565b60405180910390f35b34801561089157600080fd5b506108ac60048036038101906108a7919061374c565b611a48565b005b3480156108ba57600080fd5b506108c3611ace565b6040516108d09190613249565b60405180910390f35b3480156108e557600080fd5b5061090060048036038101906108fb9190613779565b611ad4565b60405161090d9190613039565b60405180910390f35b34801561092257600080fd5b5061093d6004803603810190610938919061358f565b611b68565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109b257506109b182611c60565b5b9050919050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600080546109ee906137e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1a906137e8565b8015610a675780601f10610a3c57610100808354040283529160200191610a67565b820191906000526020600020905b815481529060010190602001808311610a4a57829003601f168201915b5050505050905090565b6000610a7c82611d42565b610abb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab29061388c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b018261150e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b699061391e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b91611dae565b73ffffffffffffffffffffffffffffffffffffffff161480610bc05750610bbf81610bba611dae565b611ad4565b5b610bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf6906139b0565b60405180910390fd5b610c098383611db6565b505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600880549050905090565b600281565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610c7d610c77611dae565b82611e6f565b610cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb390613a42565b60405180910390fd5b610cc7838383611f4d565b505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610cfd836115c0565b8210610d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3590613ad4565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610db283838360405180602001604052806000815250611941565b505050565b60003490506000610dc7336115c0565b9050600083905060011515601460009054906101000a900460ff16151514610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90613b40565b60405180910390fd5b61019e60135442610e359190613b8f565b1015610f5a5760011515610e728660155433604051602001610e579190613c0b565b604051602081830303815290604052805190602001206121b4565b151514610eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eab90613c72565b60405180910390fd5b60028183610ec29190613c92565b1115610f03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efa90613d5a565b60405180910390fd5b610ad981601254610f149190613c92565b1115610f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4c90613dc6565b60405180910390fd5b611111565b611e6160125482610f6b9190613c92565b1115610fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa390613e32565b60405180910390fd5b6014811115610ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe790613ec4565b60405180910390fd5b6000610ad9601254101561109b576001905060011515611039876015543360405160200161101e9190613c0b565b604051602081830303815290604052805190602001206121b4565b151514156110515760028161104e9190613c92565b90505b82811061106b5782816110649190613b8f565b9050611070565b600090505b601254610ad96110809190613b8f565b81111561109a57601254610ad96110979190613b8f565b90505b5b8082106110b55780826110ae9190613b8f565b91506110ba565b600091505b81660ffcb9e57d40006110cd9190613ee4565b84101561110f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110690613f8a565b60405180910390fd5b505b60005b8481101561114b5761113a3360126000815461112f90613faa565b9190508190556121cb565b8061114490613faa565b9050611114565b50600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc600a6003866111979190613ee4565b6111a19190614022565b9081150290604051600060405180830381858888f193505050501580156111cc573d6000803e3d6000fd5b50600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc600a6003866112189190613ee4565b6112229190614022565b9081150290604051600060405180830381858888f1935050505015801561124d573d6000803e3d6000fd5b50600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6103e860e18661129a9190613ee4565b6112a49190614022565b9081150290604051600060405180830381858888f193505050501580156112cf573d6000803e3d6000fd5b50601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6103e8607d8661131c9190613ee4565b6113269190614022565b9081150290604051600060405180830381858888f19350505050158015611351573d6000803e3d6000fd5b50601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc606460058661139d9190613ee4565b6113a79190614022565b9081150290604051600060405180830381858888f193505050501580156113d2573d6000803e3d6000fd5b505050505050565b601481565b60006113e9610c34565b821061142a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611421906140c5565b60405180910390fd5b6008828154811061143e5761143d6140e5565b5b90600052602060002001549050919050565b6000601354426114609190613b8f565b905090565b61146d611dae565b73ffffffffffffffffffffffffffffffffffffffff1661148b6117c3565b73ffffffffffffffffffffffffffffffffffffffff16146114e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d890614160565b60405180910390fd5b80600b90805190602001906114f7929190612ee2565b5050565b601460009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ae906141f2565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162890614284565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611680611dae565b73ffffffffffffffffffffffffffffffffffffffff1661169e6117c3565b73ffffffffffffffffffffffffffffffffffffffff16146116f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116eb90614160565b60405180910390fd5b6116fe60006121e9565b565b6060600c805461170f906137e8565b80601f016020809104026020016040519081016040528092919081815260200182805461173b906137e8565b80156117885780601f1061175d57610100808354040283529160200191611788565b820191906000526020600020905b81548152906001019060200180831161176b57829003601f168201915b5050505050905090565b60135481565b611e6181565b80600c90805190602001906117b4929190612ee2565b5050565b660ffcb9e57d400081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546117fc906137e8565b80601f0160208091040260200160405190810160405280929190818152602001828054611828906137e8565b80156118755780601f1061184a57610100808354040283529160200191611875565b820191906000526020600020905b81548152906001019060200180831161185857829003601f168201915b5050505050905090565b61019e81565b611897611890611dae565b83836122af565b5050565b60125481565b6118a9611dae565b73ffffffffffffffffffffffffffffffffffffffff166118c76117c3565b73ffffffffffffffffffffffffffffffffffffffff161461191d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191490614160565b60405180910390fd5b6001601460006101000a81548160ff02191690831515021790555042601381905550565b61195261194c611dae565b83611e6f565b611991576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198890613a42565b60405180910390fd5b61199d8484848461241c565b50505050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606119d482611d42565b611a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0a90614316565b60405180910390fd5b600b611a1e83612478565b600c604051602001611a3293929190614406565b6040516020818303038152906040529050919050565b611a50611dae565b73ffffffffffffffffffffffffffffffffffffffff16611a6e6117c3565b73ffffffffffffffffffffffffffffffffffffffff1614611ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abb90614160565b60405180910390fd5b8060158190555050565b610ad981565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b70611dae565b73ffffffffffffffffffffffffffffffffffffffff16611b8e6117c3565b73ffffffffffffffffffffffffffffffffffffffff1614611be4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdb90614160565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4b906144a9565b60405180910390fd5b611c5d816121e9565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d2b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d3b5750611d3a826125d9565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e298361150e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e7a82611d42565b611eb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb09061453b565b60405180910390fd5b6000611ec48361150e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f3357508373ffffffffffffffffffffffffffffffffffffffff16611f1b84610a71565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f445750611f438185611ad4565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f6d8261150e565b73ffffffffffffffffffffffffffffffffffffffff1614611fc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fba906145cd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202a9061465f565b60405180910390fd5b61203e838383612643565b612049600082611db6565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120999190613b8f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120f09190613c92565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121af838383612757565b505050565b6000826121c1858461275c565b1490509392505050565b6121e58282604051806020016040528060008152506127d1565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561231e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612315906146cb565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161240f9190613039565b60405180910390a3505050565b612427848484611f4d565b6124338484848461282c565b612472576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124699061475d565b60405180910390fd5b50505050565b606060008214156124c0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125d4565b600082905060005b600082146124f25780806124db90613faa565b915050600a826124eb9190614022565b91506124c8565b60008167ffffffffffffffff81111561250e5761250d6132bc565b5b6040519080825280601f01601f1916602001820160405280156125405781602001600182028036833780820191505090505b5090505b600085146125cd576001826125599190613b8f565b9150600a85612568919061477d565b60306125749190613c92565b60f81b81838151811061258a576125896140e5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125c69190614022565b9450612544565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61264e8383836129c3565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126915761268c816129c8565b6126d0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146126cf576126ce8382612a11565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127135761270e81612b7e565b612752565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612751576127508282612c4f565b5b5b505050565b505050565b60008082905060005b84518110156127c6576000858281518110612783576127826140e5565b5b602002602001015190508083116127a55761279e8382612cce565b92506127b2565b6127af8184612cce565b92505b5080806127be90613faa565b915050612765565b508091505092915050565b6127db8383612ce5565b6127e8600084848461282c565b612827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281e9061475d565b60405180910390fd5b505050565b600061284d8473ffffffffffffffffffffffffffffffffffffffff16612ebf565b156129b6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612876611dae565b8786866040518563ffffffff1660e01b81526004016128989493929190614803565b602060405180830381600087803b1580156128b257600080fd5b505af19250505080156128e357506040513d601f19601f820116820180604052508101906128e09190614864565b60015b612966573d8060008114612913576040519150601f19603f3d011682016040523d82523d6000602084013e612918565b606091505b5060008151141561295e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129559061475d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129bb565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612a1e846115c0565b612a289190613b8f565b9050600060076000848152602001908152602001600020549050818114612b0d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612b929190613b8f565b9050600060096000848152602001908152602001600020549050600060088381548110612bc257612bc16140e5565b5b906000526020600020015490508060088381548110612be457612be36140e5565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612c3357612c32614891565b5b6001900381819060005260206000200160009055905550505050565b6000612c5a836115c0565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600082600052816020526040600020905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4c9061490c565b60405180910390fd5b612d5e81611d42565b15612d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9590614978565b60405180910390fd5b612daa60008383612643565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dfa9190613c92565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ebb60008383612757565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612eee906137e8565b90600052602060002090601f016020900481019282612f105760008555612f57565b82601f10612f2957805160ff1916838001178555612f57565b82800160010185558215612f57579182015b82811115612f56578251825591602001919060010190612f3b565b5b509050612f649190612f68565b5090565b5b80821115612f81576000816000905550600101612f69565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612fce81612f99565b8114612fd957600080fd5b50565b600081359050612feb81612fc5565b92915050565b60006020828403121561300757613006612f8f565b5b600061301584828501612fdc565b91505092915050565b60008115159050919050565b6130338161301e565b82525050565b600060208201905061304e600083018461302a565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061307f82613054565b9050919050565b61308f81613074565b82525050565b60006020820190506130aa6000830184613086565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156130ea5780820151818401526020810190506130cf565b838111156130f9576000848401525b50505050565b6000601f19601f8301169050919050565b600061311b826130b0565b61312581856130bb565b93506131358185602086016130cc565b61313e816130ff565b840191505092915050565b600060208201905081810360008301526131638184613110565b905092915050565b6000819050919050565b61317e8161316b565b811461318957600080fd5b50565b60008135905061319b81613175565b92915050565b6000602082840312156131b7576131b6612f8f565b5b60006131c58482850161318c565b91505092915050565b6131d781613074565b81146131e257600080fd5b50565b6000813590506131f4816131ce565b92915050565b6000806040838503121561321157613210612f8f565b5b600061321f858286016131e5565b92505060206132308582860161318c565b9150509250929050565b6132438161316b565b82525050565b600060208201905061325e600083018461323a565b92915050565b60008060006060848603121561327d5761327c612f8f565b5b600061328b868287016131e5565b935050602061329c868287016131e5565b92505060406132ad8682870161318c565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6132f4826130ff565b810181811067ffffffffffffffff82111715613313576133126132bc565b5b80604052505050565b6000613326612f85565b905061333282826132eb565b919050565b600067ffffffffffffffff821115613352576133516132bc565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b61337b81613368565b811461338657600080fd5b50565b60008135905061339881613372565b92915050565b60006133b16133ac84613337565b61331c565b905080838252602082019050602084028301858111156133d4576133d3613363565b5b835b818110156133fd57806133e98882613389565b8452602084019350506020810190506133d6565b5050509392505050565b600082601f83011261341c5761341b6132b7565b5b813561342c84826020860161339e565b91505092915050565b6000806040838503121561344c5761344b612f8f565b5b600083013567ffffffffffffffff81111561346a57613469612f94565b5b61347685828601613407565b92505060206134878582860161318c565b9150509250929050565b600080fd5b600067ffffffffffffffff8211156134b1576134b06132bc565b5b6134ba826130ff565b9050602081019050919050565b82818337600083830152505050565b60006134e96134e484613496565b61331c565b90508281526020810184848401111561350557613504613491565b5b6135108482856134c7565b509392505050565b600082601f83011261352d5761352c6132b7565b5b813561353d8482602086016134d6565b91505092915050565b60006020828403121561355c5761355b612f8f565b5b600082013567ffffffffffffffff81111561357a57613579612f94565b5b61358684828501613518565b91505092915050565b6000602082840312156135a5576135a4612f8f565b5b60006135b3848285016131e5565b91505092915050565b6135c58161301e565b81146135d057600080fd5b50565b6000813590506135e2816135bc565b92915050565b600080604083850312156135ff576135fe612f8f565b5b600061360d858286016131e5565b925050602061361e858286016135d3565b9150509250929050565b600067ffffffffffffffff821115613643576136426132bc565b5b61364c826130ff565b9050602081019050919050565b600061366c61366784613628565b61331c565b90508281526020810184848401111561368857613687613491565b5b6136938482856134c7565b509392505050565b600082601f8301126136b0576136af6132b7565b5b81356136c0848260208601613659565b91505092915050565b600080600080608085870312156136e3576136e2612f8f565b5b60006136f1878288016131e5565b9450506020613702878288016131e5565b93505060406137138782880161318c565b925050606085013567ffffffffffffffff81111561373457613733612f94565b5b6137408782880161369b565b91505092959194509250565b60006020828403121561376257613761612f8f565b5b600061377084828501613389565b91505092915050565b600080604083850312156137905761378f612f8f565b5b600061379e858286016131e5565b92505060206137af858286016131e5565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061380057607f821691505b60208210811415613814576138136137b9565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613876602c836130bb565b91506138818261381a565b604082019050919050565b600060208201905081810360008301526138a581613869565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006139086021836130bb565b9150613913826138ac565b604082019050919050565b60006020820190508181036000830152613937816138fb565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061399a6038836130bb565b91506139a58261393e565b604082019050919050565b600060208201905081810360008301526139c98161398d565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613a2c6031836130bb565b9150613a37826139d0565b604082019050919050565b60006020820190508181036000830152613a5b81613a1f565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613abe602b836130bb565b9150613ac982613a62565b604082019050919050565b60006020820190508181036000830152613aed81613ab1565b9050919050565b7f53616c6520486173204e6f742053746172746564000000000000000000000000600082015250565b6000613b2a6014836130bb565b9150613b3582613af4565b602082019050919050565b60006020820190508181036000830152613b5981613b1d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b9a8261316b565b9150613ba58361316b565b925082821015613bb857613bb7613b60565b5b828203905092915050565b60008160601b9050919050565b6000613bdb82613bc3565b9050919050565b6000613bed82613bd0565b9050919050565b613c05613c0082613074565b613be2565b82525050565b6000613c178284613bf4565b60148201915081905092915050565b7f4e6f74206f6e2077686974656c69737400000000000000000000000000000000600082015250565b6000613c5c6010836130bb565b9150613c6782613c26565b602082019050919050565b60006020820190508181036000830152613c8b81613c4f565b9050919050565b6000613c9d8261316b565b9150613ca88361316b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613cdd57613cdc613b60565b5b828201905092915050565b7f45786365656473204d61782050726573616c6520416d6f756e7420506572205760008201527f616c6c6574000000000000000000000000000000000000000000000000000000602082015250565b6000613d446025836130bb565b9150613d4f82613ce8565b604082019050919050565b60006020820190508181036000830152613d7381613d37565b9050919050565b7f457863656564732050726573616c6520416d6f756e7400000000000000000000600082015250565b6000613db06016836130bb565b9150613dbb82613d7a565b602082019050919050565b60006020820190508181036000830152613ddf81613da3565b9050919050565b7f4578636565647320546f74616c20416d6f756e74730000000000000000000000600082015250565b6000613e1c6015836130bb565b9150613e2782613de6565b602082019050919050565b60006020820190508181036000830152613e4b81613e0f565b9050919050565b7f45786365656473204d617820416d6f756e7420506572205472616e736163746960008201527f6f6e000000000000000000000000000000000000000000000000000000000000602082015250565b6000613eae6022836130bb565b9150613eb982613e52565b604082019050919050565b60006020820190508181036000830152613edd81613ea1565b9050919050565b6000613eef8261316b565b9150613efa8361316b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f3357613f32613b60565b5b828202905092915050565b7f496e73756666696369656e742046756e64000000000000000000000000000000600082015250565b6000613f746011836130bb565b9150613f7f82613f3e565b602082019050919050565b60006020820190508181036000830152613fa381613f67565b9050919050565b6000613fb58261316b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613fe857613fe7613b60565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061402d8261316b565b91506140388361316b565b92508261404857614047613ff3565b5b828204905092915050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006140af602c836130bb565b91506140ba82614053565b604082019050919050565b600060208201905081810360008301526140de816140a2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061414a6020836130bb565b915061415582614114565b602082019050919050565b600060208201905081810360008301526141798161413d565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006141dc6029836130bb565b91506141e782614180565b604082019050919050565b6000602082019050818103600083015261420b816141cf565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061426e602a836130bb565b915061427982614212565b604082019050919050565b6000602082019050818103600083015261429d81614261565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614300602f836130bb565b915061430b826142a4565b604082019050919050565b6000602082019050818103600083015261432f816142f3565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154614363816137e8565b61436d8186614336565b945060018216600081146143885760018114614399576143cc565b60ff198316865281860193506143cc565b6143a285614341565b60005b838110156143c4578154818901526001820191506020810190506143a5565b838801955050505b50505092915050565b60006143e0826130b0565b6143ea8185614336565b93506143fa8185602086016130cc565b80840191505092915050565b60006144128286614356565b915061441e82856143d5565b915061442a8284614356565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006144936026836130bb565b915061449e82614437565b604082019050919050565b600060208201905081810360008301526144c281614486565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614525602c836130bb565b9150614530826144c9565b604082019050919050565b6000602082019050818103600083015261455481614518565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006145b76025836130bb565b91506145c28261455b565b604082019050919050565b600060208201905081810360008301526145e6816145aa565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006146496024836130bb565b9150614654826145ed565b604082019050919050565b600060208201905081810360008301526146788161463c565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006146b56019836130bb565b91506146c08261467f565b602082019050919050565b600060208201905081810360008301526146e4816146a8565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006147476032836130bb565b9150614752826146eb565b604082019050919050565b600060208201905081810360008301526147768161473a565b9050919050565b60006147888261316b565b91506147938361316b565b9250826147a3576147a2613ff3565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006147d5826147ae565b6147df81856147b9565b93506147ef8185602086016130cc565b6147f8816130ff565b840191505092915050565b60006080820190506148186000830187613086565b6148256020830186613086565b614832604083018561323a565b818103606083015261484481846147ca565b905095945050505050565b60008151905061485e81612fc5565b92915050565b60006020828403121561487a57614879612f8f565b5b60006148888482850161484f565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006148f66020836130bb565b9150614901826148c0565b602082019050919050565b60006020820190508181036000830152614925816148e9565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614962601c836130bb565b915061496d8261492c565b602082019050919050565b6000602082019050818103600083015261499181614955565b905091905056fea26469706673582212205ddb83cbe3214163a637fd75050a5ff8bed1ecd97414cc63cca390a43918e94964736f6c63430008090033697066733a2f2f516d5042594b7853553538396679555271794d7857757041737a566d586f536e44743632357777595a45636161592f

Deployed Bytecode

0x60806040526004361061023b5760003560e01c806370a082311161012e578063a22cb465116100ab578063c87b56dd1161006f578063c87b56dd14610848578063dab5f34014610885578063e1bfb529146108ae578063e985e9c5146108d9578063f2fde38b146109165761023b565b8063a22cb46514610789578063a2309ff8146107b2578063b66a0e5d146107dd578063b88d4fde146107f4578063c580c4301461081d5761023b565b80637e2285aa116100f25780637e2285aa146106b45780638d859f3e146106dd5780638da5cb5b1461070857806395d89b41146107335780639a0d4f401461075e5761023b565b806370a08231146105df578063715018a61461061c578063776ce6a11461063357806378e979251461065e5780637d4cb964146106895761023b565b80632b0c685a116101bc5780634f6ccce7116101805780634f6ccce7146104e6578063557ed1ba1461052357806355f804b31461054e5780635c474f9e146105775780636352211e146105a25761023b565b80632b0c685a1461040e5780632f745c591461043957806342842e0e1461047657806345de0d9b1461049f57806347289075146104bb5761023b565b8063115976c411610203578063115976c41461033957806318160ddd146103645780631aee3f911461038f5780631de46a78146103ba57806323b872dd146103e55761023b565b806301ffc9a71461024057806306a8f8a21461027d57806306fdde03146102a8578063081812fc146102d3578063095ea7b314610310575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190612ff1565b61093f565b6040516102749190613039565b60405180910390f35b34801561028957600080fd5b506102926109b9565b60405161029f9190613095565b60405180910390f35b3480156102b457600080fd5b506102bd6109df565b6040516102ca9190613149565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f591906131a1565b610a71565b6040516103079190613095565b60405180910390f35b34801561031c57600080fd5b50610337600480360381019061033291906131fa565b610af6565b005b34801561034557600080fd5b5061034e610c0e565b60405161035b9190613095565b60405180910390f35b34801561037057600080fd5b50610379610c34565b6040516103869190613249565b60405180910390f35b34801561039b57600080fd5b506103a4610c41565b6040516103b19190613249565b60405180910390f35b3480156103c657600080fd5b506103cf610c46565b6040516103dc9190613095565b60405180910390f35b3480156103f157600080fd5b5061040c60048036038101906104079190613264565b610c6c565b005b34801561041a57600080fd5b50610423610ccc565b6040516104309190613095565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b91906131fa565b610cf2565b60405161046d9190613249565b60405180910390f35b34801561048257600080fd5b5061049d60048036038101906104989190613264565b610d97565b005b6104b960048036038101906104b49190613435565b610db7565b005b3480156104c757600080fd5b506104d06113da565b6040516104dd9190613249565b60405180910390f35b3480156104f257600080fd5b5061050d600480360381019061050891906131a1565b6113df565b60405161051a9190613249565b60405180910390f35b34801561052f57600080fd5b50610538611450565b6040516105459190613249565b60405180910390f35b34801561055a57600080fd5b5061057560048036038101906105709190613546565b611465565b005b34801561058357600080fd5b5061058c6114fb565b6040516105999190613039565b60405180910390f35b3480156105ae57600080fd5b506105c960048036038101906105c491906131a1565b61150e565b6040516105d69190613095565b60405180910390f35b3480156105eb57600080fd5b506106066004803603810190610601919061358f565b6115c0565b6040516106139190613249565b60405180910390f35b34801561062857600080fd5b50610631611678565b005b34801561063f57600080fd5b50610648611700565b6040516106559190613149565b60405180910390f35b34801561066a57600080fd5b50610673611792565b6040516106809190613249565b60405180910390f35b34801561069557600080fd5b5061069e611798565b6040516106ab9190613249565b60405180910390f35b3480156106c057600080fd5b506106db60048036038101906106d69190613546565b61179e565b005b3480156106e957600080fd5b506106f26117b8565b6040516106ff9190613249565b60405180910390f35b34801561071457600080fd5b5061071d6117c3565b60405161072a9190613095565b60405180910390f35b34801561073f57600080fd5b506107486117ed565b6040516107559190613149565b60405180910390f35b34801561076a57600080fd5b5061077361187f565b6040516107809190613249565b60405180910390f35b34801561079557600080fd5b506107b060048036038101906107ab91906135e8565b611885565b005b3480156107be57600080fd5b506107c761189b565b6040516107d49190613249565b60405180910390f35b3480156107e957600080fd5b506107f26118a1565b005b34801561080057600080fd5b5061081b600480360381019061081691906136c9565b611941565b005b34801561082957600080fd5b506108326119a3565b60405161083f9190613095565b60405180910390f35b34801561085457600080fd5b5061086f600480360381019061086a91906131a1565b6119c9565b60405161087c9190613149565b60405180910390f35b34801561089157600080fd5b506108ac60048036038101906108a7919061374c565b611a48565b005b3480156108ba57600080fd5b506108c3611ace565b6040516108d09190613249565b60405180910390f35b3480156108e557600080fd5b5061090060048036038101906108fb9190613779565b611ad4565b60405161090d9190613039565b60405180910390f35b34801561092257600080fd5b5061093d6004803603810190610938919061358f565b611b68565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109b257506109b182611c60565b5b9050919050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600080546109ee906137e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1a906137e8565b8015610a675780601f10610a3c57610100808354040283529160200191610a67565b820191906000526020600020905b815481529060010190602001808311610a4a57829003601f168201915b5050505050905090565b6000610a7c82611d42565b610abb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab29061388c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b018261150e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b699061391e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b91611dae565b73ffffffffffffffffffffffffffffffffffffffff161480610bc05750610bbf81610bba611dae565b611ad4565b5b610bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf6906139b0565b60405180910390fd5b610c098383611db6565b505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600880549050905090565b600281565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610c7d610c77611dae565b82611e6f565b610cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb390613a42565b60405180910390fd5b610cc7838383611f4d565b505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610cfd836115c0565b8210610d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3590613ad4565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610db283838360405180602001604052806000815250611941565b505050565b60003490506000610dc7336115c0565b9050600083905060011515601460009054906101000a900460ff16151514610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90613b40565b60405180910390fd5b61019e60135442610e359190613b8f565b1015610f5a5760011515610e728660155433604051602001610e579190613c0b565b604051602081830303815290604052805190602001206121b4565b151514610eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eab90613c72565b60405180910390fd5b60028183610ec29190613c92565b1115610f03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efa90613d5a565b60405180910390fd5b610ad981601254610f149190613c92565b1115610f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4c90613dc6565b60405180910390fd5b611111565b611e6160125482610f6b9190613c92565b1115610fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa390613e32565b60405180910390fd5b6014811115610ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe790613ec4565b60405180910390fd5b6000610ad9601254101561109b576001905060011515611039876015543360405160200161101e9190613c0b565b604051602081830303815290604052805190602001206121b4565b151514156110515760028161104e9190613c92565b90505b82811061106b5782816110649190613b8f565b9050611070565b600090505b601254610ad96110809190613b8f565b81111561109a57601254610ad96110979190613b8f565b90505b5b8082106110b55780826110ae9190613b8f565b91506110ba565b600091505b81660ffcb9e57d40006110cd9190613ee4565b84101561110f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110690613f8a565b60405180910390fd5b505b60005b8481101561114b5761113a3360126000815461112f90613faa565b9190508190556121cb565b8061114490613faa565b9050611114565b50600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc600a6003866111979190613ee4565b6111a19190614022565b9081150290604051600060405180830381858888f193505050501580156111cc573d6000803e3d6000fd5b50600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc600a6003866112189190613ee4565b6112229190614022565b9081150290604051600060405180830381858888f1935050505015801561124d573d6000803e3d6000fd5b50600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6103e860e18661129a9190613ee4565b6112a49190614022565b9081150290604051600060405180830381858888f193505050501580156112cf573d6000803e3d6000fd5b50601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6103e8607d8661131c9190613ee4565b6113269190614022565b9081150290604051600060405180830381858888f19350505050158015611351573d6000803e3d6000fd5b50601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc606460058661139d9190613ee4565b6113a79190614022565b9081150290604051600060405180830381858888f193505050501580156113d2573d6000803e3d6000fd5b505050505050565b601481565b60006113e9610c34565b821061142a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611421906140c5565b60405180910390fd5b6008828154811061143e5761143d6140e5565b5b90600052602060002001549050919050565b6000601354426114609190613b8f565b905090565b61146d611dae565b73ffffffffffffffffffffffffffffffffffffffff1661148b6117c3565b73ffffffffffffffffffffffffffffffffffffffff16146114e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d890614160565b60405180910390fd5b80600b90805190602001906114f7929190612ee2565b5050565b601460009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ae906141f2565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162890614284565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611680611dae565b73ffffffffffffffffffffffffffffffffffffffff1661169e6117c3565b73ffffffffffffffffffffffffffffffffffffffff16146116f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116eb90614160565b60405180910390fd5b6116fe60006121e9565b565b6060600c805461170f906137e8565b80601f016020809104026020016040519081016040528092919081815260200182805461173b906137e8565b80156117885780601f1061175d57610100808354040283529160200191611788565b820191906000526020600020905b81548152906001019060200180831161176b57829003601f168201915b5050505050905090565b60135481565b611e6181565b80600c90805190602001906117b4929190612ee2565b5050565b660ffcb9e57d400081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546117fc906137e8565b80601f0160208091040260200160405190810160405280929190818152602001828054611828906137e8565b80156118755780601f1061184a57610100808354040283529160200191611875565b820191906000526020600020905b81548152906001019060200180831161185857829003601f168201915b5050505050905090565b61019e81565b611897611890611dae565b83836122af565b5050565b60125481565b6118a9611dae565b73ffffffffffffffffffffffffffffffffffffffff166118c76117c3565b73ffffffffffffffffffffffffffffffffffffffff161461191d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191490614160565b60405180910390fd5b6001601460006101000a81548160ff02191690831515021790555042601381905550565b61195261194c611dae565b83611e6f565b611991576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198890613a42565b60405180910390fd5b61199d8484848461241c565b50505050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606119d482611d42565b611a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0a90614316565b60405180910390fd5b600b611a1e83612478565b600c604051602001611a3293929190614406565b6040516020818303038152906040529050919050565b611a50611dae565b73ffffffffffffffffffffffffffffffffffffffff16611a6e6117c3565b73ffffffffffffffffffffffffffffffffffffffff1614611ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abb90614160565b60405180910390fd5b8060158190555050565b610ad981565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b70611dae565b73ffffffffffffffffffffffffffffffffffffffff16611b8e6117c3565b73ffffffffffffffffffffffffffffffffffffffff1614611be4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdb90614160565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4b906144a9565b60405180910390fd5b611c5d816121e9565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d2b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d3b5750611d3a826125d9565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e298361150e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e7a82611d42565b611eb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb09061453b565b60405180910390fd5b6000611ec48361150e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f3357508373ffffffffffffffffffffffffffffffffffffffff16611f1b84610a71565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f445750611f438185611ad4565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f6d8261150e565b73ffffffffffffffffffffffffffffffffffffffff1614611fc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fba906145cd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202a9061465f565b60405180910390fd5b61203e838383612643565b612049600082611db6565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120999190613b8f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120f09190613c92565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121af838383612757565b505050565b6000826121c1858461275c565b1490509392505050565b6121e58282604051806020016040528060008152506127d1565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561231e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612315906146cb565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161240f9190613039565b60405180910390a3505050565b612427848484611f4d565b6124338484848461282c565b612472576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124699061475d565b60405180910390fd5b50505050565b606060008214156124c0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125d4565b600082905060005b600082146124f25780806124db90613faa565b915050600a826124eb9190614022565b91506124c8565b60008167ffffffffffffffff81111561250e5761250d6132bc565b5b6040519080825280601f01601f1916602001820160405280156125405781602001600182028036833780820191505090505b5090505b600085146125cd576001826125599190613b8f565b9150600a85612568919061477d565b60306125749190613c92565b60f81b81838151811061258a576125896140e5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125c69190614022565b9450612544565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61264e8383836129c3565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126915761268c816129c8565b6126d0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146126cf576126ce8382612a11565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127135761270e81612b7e565b612752565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612751576127508282612c4f565b5b5b505050565b505050565b60008082905060005b84518110156127c6576000858281518110612783576127826140e5565b5b602002602001015190508083116127a55761279e8382612cce565b92506127b2565b6127af8184612cce565b92505b5080806127be90613faa565b915050612765565b508091505092915050565b6127db8383612ce5565b6127e8600084848461282c565b612827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281e9061475d565b60405180910390fd5b505050565b600061284d8473ffffffffffffffffffffffffffffffffffffffff16612ebf565b156129b6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612876611dae565b8786866040518563ffffffff1660e01b81526004016128989493929190614803565b602060405180830381600087803b1580156128b257600080fd5b505af19250505080156128e357506040513d601f19601f820116820180604052508101906128e09190614864565b60015b612966573d8060008114612913576040519150601f19603f3d011682016040523d82523d6000602084013e612918565b606091505b5060008151141561295e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129559061475d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129bb565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612a1e846115c0565b612a289190613b8f565b9050600060076000848152602001908152602001600020549050818114612b0d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612b929190613b8f565b9050600060096000848152602001908152602001600020549050600060088381548110612bc257612bc16140e5565b5b906000526020600020015490508060088381548110612be457612be36140e5565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612c3357612c32614891565b5b6001900381819060005260206000200160009055905550505050565b6000612c5a836115c0565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600082600052816020526040600020905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4c9061490c565b60405180910390fd5b612d5e81611d42565b15612d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9590614978565b60405180910390fd5b612daa60008383612643565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dfa9190613c92565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ebb60008383612757565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612eee906137e8565b90600052602060002090601f016020900481019282612f105760008555612f57565b82601f10612f2957805160ff1916838001178555612f57565b82800160010185558215612f57579182015b82811115612f56578251825591602001919060010190612f3b565b5b509050612f649190612f68565b5090565b5b80821115612f81576000816000905550600101612f69565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612fce81612f99565b8114612fd957600080fd5b50565b600081359050612feb81612fc5565b92915050565b60006020828403121561300757613006612f8f565b5b600061301584828501612fdc565b91505092915050565b60008115159050919050565b6130338161301e565b82525050565b600060208201905061304e600083018461302a565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061307f82613054565b9050919050565b61308f81613074565b82525050565b60006020820190506130aa6000830184613086565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156130ea5780820151818401526020810190506130cf565b838111156130f9576000848401525b50505050565b6000601f19601f8301169050919050565b600061311b826130b0565b61312581856130bb565b93506131358185602086016130cc565b61313e816130ff565b840191505092915050565b600060208201905081810360008301526131638184613110565b905092915050565b6000819050919050565b61317e8161316b565b811461318957600080fd5b50565b60008135905061319b81613175565b92915050565b6000602082840312156131b7576131b6612f8f565b5b60006131c58482850161318c565b91505092915050565b6131d781613074565b81146131e257600080fd5b50565b6000813590506131f4816131ce565b92915050565b6000806040838503121561321157613210612f8f565b5b600061321f858286016131e5565b92505060206132308582860161318c565b9150509250929050565b6132438161316b565b82525050565b600060208201905061325e600083018461323a565b92915050565b60008060006060848603121561327d5761327c612f8f565b5b600061328b868287016131e5565b935050602061329c868287016131e5565b92505060406132ad8682870161318c565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6132f4826130ff565b810181811067ffffffffffffffff82111715613313576133126132bc565b5b80604052505050565b6000613326612f85565b905061333282826132eb565b919050565b600067ffffffffffffffff821115613352576133516132bc565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b61337b81613368565b811461338657600080fd5b50565b60008135905061339881613372565b92915050565b60006133b16133ac84613337565b61331c565b905080838252602082019050602084028301858111156133d4576133d3613363565b5b835b818110156133fd57806133e98882613389565b8452602084019350506020810190506133d6565b5050509392505050565b600082601f83011261341c5761341b6132b7565b5b813561342c84826020860161339e565b91505092915050565b6000806040838503121561344c5761344b612f8f565b5b600083013567ffffffffffffffff81111561346a57613469612f94565b5b61347685828601613407565b92505060206134878582860161318c565b9150509250929050565b600080fd5b600067ffffffffffffffff8211156134b1576134b06132bc565b5b6134ba826130ff565b9050602081019050919050565b82818337600083830152505050565b60006134e96134e484613496565b61331c565b90508281526020810184848401111561350557613504613491565b5b6135108482856134c7565b509392505050565b600082601f83011261352d5761352c6132b7565b5b813561353d8482602086016134d6565b91505092915050565b60006020828403121561355c5761355b612f8f565b5b600082013567ffffffffffffffff81111561357a57613579612f94565b5b61358684828501613518565b91505092915050565b6000602082840312156135a5576135a4612f8f565b5b60006135b3848285016131e5565b91505092915050565b6135c58161301e565b81146135d057600080fd5b50565b6000813590506135e2816135bc565b92915050565b600080604083850312156135ff576135fe612f8f565b5b600061360d858286016131e5565b925050602061361e858286016135d3565b9150509250929050565b600067ffffffffffffffff821115613643576136426132bc565b5b61364c826130ff565b9050602081019050919050565b600061366c61366784613628565b61331c565b90508281526020810184848401111561368857613687613491565b5b6136938482856134c7565b509392505050565b600082601f8301126136b0576136af6132b7565b5b81356136c0848260208601613659565b91505092915050565b600080600080608085870312156136e3576136e2612f8f565b5b60006136f1878288016131e5565b9450506020613702878288016131e5565b93505060406137138782880161318c565b925050606085013567ffffffffffffffff81111561373457613733612f94565b5b6137408782880161369b565b91505092959194509250565b60006020828403121561376257613761612f8f565b5b600061377084828501613389565b91505092915050565b600080604083850312156137905761378f612f8f565b5b600061379e858286016131e5565b92505060206137af858286016131e5565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061380057607f821691505b60208210811415613814576138136137b9565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613876602c836130bb565b91506138818261381a565b604082019050919050565b600060208201905081810360008301526138a581613869565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006139086021836130bb565b9150613913826138ac565b604082019050919050565b60006020820190508181036000830152613937816138fb565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061399a6038836130bb565b91506139a58261393e565b604082019050919050565b600060208201905081810360008301526139c98161398d565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613a2c6031836130bb565b9150613a37826139d0565b604082019050919050565b60006020820190508181036000830152613a5b81613a1f565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613abe602b836130bb565b9150613ac982613a62565b604082019050919050565b60006020820190508181036000830152613aed81613ab1565b9050919050565b7f53616c6520486173204e6f742053746172746564000000000000000000000000600082015250565b6000613b2a6014836130bb565b9150613b3582613af4565b602082019050919050565b60006020820190508181036000830152613b5981613b1d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b9a8261316b565b9150613ba58361316b565b925082821015613bb857613bb7613b60565b5b828203905092915050565b60008160601b9050919050565b6000613bdb82613bc3565b9050919050565b6000613bed82613bd0565b9050919050565b613c05613c0082613074565b613be2565b82525050565b6000613c178284613bf4565b60148201915081905092915050565b7f4e6f74206f6e2077686974656c69737400000000000000000000000000000000600082015250565b6000613c5c6010836130bb565b9150613c6782613c26565b602082019050919050565b60006020820190508181036000830152613c8b81613c4f565b9050919050565b6000613c9d8261316b565b9150613ca88361316b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613cdd57613cdc613b60565b5b828201905092915050565b7f45786365656473204d61782050726573616c6520416d6f756e7420506572205760008201527f616c6c6574000000000000000000000000000000000000000000000000000000602082015250565b6000613d446025836130bb565b9150613d4f82613ce8565b604082019050919050565b60006020820190508181036000830152613d7381613d37565b9050919050565b7f457863656564732050726573616c6520416d6f756e7400000000000000000000600082015250565b6000613db06016836130bb565b9150613dbb82613d7a565b602082019050919050565b60006020820190508181036000830152613ddf81613da3565b9050919050565b7f4578636565647320546f74616c20416d6f756e74730000000000000000000000600082015250565b6000613e1c6015836130bb565b9150613e2782613de6565b602082019050919050565b60006020820190508181036000830152613e4b81613e0f565b9050919050565b7f45786365656473204d617820416d6f756e7420506572205472616e736163746960008201527f6f6e000000000000000000000000000000000000000000000000000000000000602082015250565b6000613eae6022836130bb565b9150613eb982613e52565b604082019050919050565b60006020820190508181036000830152613edd81613ea1565b9050919050565b6000613eef8261316b565b9150613efa8361316b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f3357613f32613b60565b5b828202905092915050565b7f496e73756666696369656e742046756e64000000000000000000000000000000600082015250565b6000613f746011836130bb565b9150613f7f82613f3e565b602082019050919050565b60006020820190508181036000830152613fa381613f67565b9050919050565b6000613fb58261316b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613fe857613fe7613b60565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061402d8261316b565b91506140388361316b565b92508261404857614047613ff3565b5b828204905092915050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006140af602c836130bb565b91506140ba82614053565b604082019050919050565b600060208201905081810360008301526140de816140a2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061414a6020836130bb565b915061415582614114565b602082019050919050565b600060208201905081810360008301526141798161413d565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006141dc6029836130bb565b91506141e782614180565b604082019050919050565b6000602082019050818103600083015261420b816141cf565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061426e602a836130bb565b915061427982614212565b604082019050919050565b6000602082019050818103600083015261429d81614261565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614300602f836130bb565b915061430b826142a4565b604082019050919050565b6000602082019050818103600083015261432f816142f3565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154614363816137e8565b61436d8186614336565b945060018216600081146143885760018114614399576143cc565b60ff198316865281860193506143cc565b6143a285614341565b60005b838110156143c4578154818901526001820191506020810190506143a5565b838801955050505b50505092915050565b60006143e0826130b0565b6143ea8185614336565b93506143fa8185602086016130cc565b80840191505092915050565b60006144128286614356565b915061441e82856143d5565b915061442a8284614356565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006144936026836130bb565b915061449e82614437565b604082019050919050565b600060208201905081810360008301526144c281614486565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614525602c836130bb565b9150614530826144c9565b604082019050919050565b6000602082019050818103600083015261455481614518565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006145b76025836130bb565b91506145c28261455b565b604082019050919050565b600060208201905081810360008301526145e6816145aa565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006146496024836130bb565b9150614654826145ed565b604082019050919050565b600060208201905081810360008301526146788161463c565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006146b56019836130bb565b91506146c08261467f565b602082019050919050565b600060208201905081810360008301526146e4816146a8565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006147476032836130bb565b9150614752826146eb565b604082019050919050565b600060208201905081810360008301526147768161473a565b9050919050565b60006147888261316b565b91506147938361316b565b9250826147a3576147a2613ff3565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006147d5826147ae565b6147df81856147b9565b93506147ef8185602086016130cc565b6147f8816130ff565b840191505092915050565b60006080820190506148186000830187613086565b6148256020830186613086565b614832604083018561323a565b818103606083015261484481846147ca565b905095945050505050565b60008151905061485e81612fc5565b92915050565b60006020828403121561487a57614879612f8f565b5b60006148888482850161484f565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006148f66020836130bb565b9150614901826148c0565b602082019050919050565b60006020820190508181036000830152614925816148e9565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614962601c836130bb565b915061496d8261492c565b602082019050919050565b6000602082019050818103600083015261499181614955565b905091905056fea26469706673582212205ddb83cbe3214163a637fd75050a5ff8bed1ecd97414cc63cca390a43918e94964736f6c63430008090033

Deployed Bytecode Sourcemap

47923:3780:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39314:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48210:66;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26134:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27693:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27216:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48139:66;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39954:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48690:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48281:66;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28443:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48352:66;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39622:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28853:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48990:1742;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48736:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40144:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51057:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50844:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48848:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25828:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25558:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4730:103;;;;;;;;;;;;;:::i;:::-;;51160:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48822:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48494:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51257:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48641:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4079:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26303:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48592:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27986:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48791:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50946:105;;;;;;;;;;;;;:::i;:::-;;29109:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48423:66;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51447:253;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51359:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48541:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28212:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4988:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39314:224;39416:4;39455:35;39440:50;;;:11;:50;;;;:90;;;;39494:36;39518:11;39494:23;:36::i;:::-;39440:90;39433:97;;39314:224;;;:::o;48210:66::-;;;;;;;;;;;;;:::o;26134:100::-;26188:13;26221:5;26214:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26134:100;:::o;27693:221::-;27769:7;27797:16;27805:7;27797;:16::i;:::-;27789:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27882:15;:24;27898:7;27882:24;;;;;;;;;;;;;;;;;;;;;27875:31;;27693:221;;;:::o;27216:411::-;27297:13;27313:23;27328:7;27313:14;:23::i;:::-;27297:39;;27361:5;27355:11;;:2;:11;;;;27347:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27455:5;27439:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27464:37;27481:5;27488:12;:10;:12::i;:::-;27464:16;:37::i;:::-;27439:62;27417:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27598:21;27607:2;27611:7;27598:8;:21::i;:::-;27286:341;27216:411;;:::o;48139:66::-;;;;;;;;;;;;;:::o;39954:113::-;40015:7;40042:10;:17;;;;40035:24;;39954:113;:::o;48690:41::-;48730:1;48690:41;:::o;48281:66::-;;;;;;;;;;;;;:::o;28443:339::-;28638:41;28657:12;:10;:12::i;:::-;28671:7;28638:18;:41::i;:::-;28630:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28746:28;28756:4;28762:2;28766:7;28746:9;:28::i;:::-;28443:339;;;:::o;48352:66::-;;;;;;;;;;;;;:::o;39622:256::-;39719:7;39755:23;39772:5;39755:16;:23::i;:::-;39747:5;:31;39739:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;39844:12;:19;39857:5;39844:19;;;;;;;;;;;;;;;:26;39864:5;39844:26;;;;;;;;;;;;39837:33;;39622:256;;;;:::o;28853:185::-;28991:39;29008:4;29014:2;29018:7;28991:39;;;;;;;;;;;;:16;:39::i;:::-;28853:185;;;:::o;48990:1742::-;49069:13;49085:9;49069:25;;49101:15;49119:21;49129:10;49119:9;:21::i;:::-;49101:39;;49147:15;49165:6;49147:24;;49201:4;49186:19;;:11;;;;;;;;;;;:19;;;49178:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;48633:3;49259:9;;49241:15;:27;;;;:::i;:::-;:44;49237:1148;;;49381:4;49304:81;;:73;49323:6;49331:4;;49364:10;49347:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;49337:39;;;;;;49304:18;:73::i;:::-;:81;;;49296:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;48730:1;49433:7;49423;:17;;;;:::i;:::-;:34;;49415:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;48583:4;49530:7;49516:11;;:21;;;;:::i;:::-;:40;;49508:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;49237:1148;;;48532:4;49624:11;;49614:7;:21;;;;:::i;:::-;:36;;49606:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;48784:2;49693:7;:32;;49685:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;49773:12;48583:4;49798:11;;:29;49794:418;;;49847:1;49840:8;;49940:4;49863:81;;:73;49882:6;49890:4;;49923:10;49906:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;49896:39;;;;;;49863:18;:73::i;:::-;:81;;;49859:121;;;49967:1;49959:9;;;;;:::i;:::-;;;49859:121;50002:7;49994:4;:15;49990:100;;50032:7;50024:15;;;;;:::i;:::-;;;49990:100;;;50077:1;50070:8;;49990:100;50129:11;;48583:4;50111:29;;;;:::i;:::-;50104:4;:36;50100:103;;;50180:11;;48583:4;50162:29;;;;:::i;:::-;50155:36;;50100:103;49794:418;50235:4;50224:7;:15;50220:95;;50263:4;50252:15;;;;;:::i;:::-;;;50220:95;;;50304:1;50294:11;;50220:95;50348:7;48673:12;50340:15;;;;:::i;:::-;50331:5;:24;;50323:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;49597:788;49237:1148;50396:9;50391:92;50416:6;50412:1;:10;50391:92;;;50439:36;50449:10;50463:11;;50461:13;;;;;:::i;:::-;;;;;;;50439:9;:36::i;:::-;50425:3;;;;:::i;:::-;;;50391:92;;;;50497:6;;;;;;;;;;;50489:24;;:40;50526:2;50522:1;50514:5;:9;;;;:::i;:::-;:14;;;;:::i;:::-;50489:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50544:6;;;;;;;;;;;50536:24;;:40;50573:2;50569:1;50561:5;:9;;;;:::i;:::-;:14;;;;:::i;:::-;50536:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50591:6;;;;;;;;;;;50583:24;;:44;50622:4;50616:3;50608:5;:11;;;;:::i;:::-;:18;;;;:::i;:::-;50583:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50642:6;;;;;;;;;;;50634:24;;:44;50673:4;50667:3;50659:5;:11;;;;:::i;:::-;:18;;;;:::i;:::-;50634:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50693:6;;;;;;;;;;;50685:24;;:41;50722:3;50718:1;50710:5;:9;;;;:::i;:::-;:15;;;;:::i;:::-;50685:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49062:1670;;;48990:1742;;:::o;48736:50::-;48784:2;48736:50;:::o;40144:233::-;40219:7;40255:30;:28;:30::i;:::-;40247:5;:38;40239:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;40352:10;40363:5;40352:17;;;;;;;;:::i;:::-;;;;;;;;;;40345:24;;40144:233;;;:::o;51057:97::-;51098:7;51139:9;;51121:15;:27;;;;:::i;:::-;51114:34;;51057:97;:::o;50844:96::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50927:7:::1;50911:13;:23;;;;;;;;;;;;:::i;:::-;;50844:96:::0;:::o;48848:23::-;;;;;;;;;;;;;:::o;25828:239::-;25900:7;25920:13;25936:7;:16;25944:7;25936:16;;;;;;;;;;;;;;;;;;;;;25920:32;;25988:1;25971:19;;:5;:19;;;;25963:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26054:5;26047:12;;;25828:239;;;:::o;25558:208::-;25630:7;25675:1;25658:19;;:5;:19;;;;25650:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25742:9;:16;25752:5;25742:16;;;;;;;;;;;;;;;;25735:23;;25558:208;;;:::o;4730:103::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4795:30:::1;4822:1;4795:18;:30::i;:::-;4730:103::o:0;51160:91::-;51207:13;51236:9;51229:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51160:91;:::o;48822:21::-;;;;:::o;48494:42::-;48532:4;48494:42;:::o;51257:96::-;51335:12;51323:9;:24;;;;;;;;;;;;:::i;:::-;;51257:96;:::o;48641:44::-;48673:12;48641:44;:::o;4079:87::-;4125:7;4152:6;;;;;;;;;;;4145:13;;4079:87;:::o;26303:104::-;26359:13;26392:7;26385:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26303:104;:::o;48592:44::-;48633:3;48592:44;:::o;27986:155::-;28081:52;28100:12;:10;:12::i;:::-;28114:8;28124;28081:18;:52::i;:::-;27986:155;;:::o;48791:26::-;;;;:::o;50946:105::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51007:4:::1;50993:11;;:18;;;;;;;;;;;;;;;;;;51030:15;51018:9;:27;;;;50946:105::o:0;29109:328::-;29284:41;29303:12;:10;:12::i;:::-;29317:7;29284:18;:41::i;:::-;29276:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29390:39;29404:4;29410:2;29414:7;29423:5;29390:13;:39::i;:::-;29109:328;;;;:::o;48423:66::-;;;;;;;;;;;;;:::o;51447:253::-;51512:13;51542:16;51550:7;51542;:16::i;:::-;51534:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;51648:13;51663:18;:7;:16;:18::i;:::-;51683:9;51631:62;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51617:77;;51447:253;;;:::o;51359:82::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51427:8:::1;51420:4;:15;;;;51359:82:::0;:::o;48541:46::-;48583:4;48541:46;:::o;28212:164::-;28309:4;28333:18;:25;28352:5;28333:25;;;;;;;;;;;;;;;:35;28359:8;28333:35;;;;;;;;;;;;;;;;;;;;;;;;;28326:42;;28212:164;;;;:::o;4988:201::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5097:1:::1;5077:22;;:8;:22;;;;5069:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5153:28;5172:8;5153:18;:28::i;:::-;4988:201:::0;:::o;25189:305::-;25291:4;25343:25;25328:40;;;:11;:40;;;;:105;;;;25400:33;25385:48;;;:11;:48;;;;25328:105;:158;;;;25450:36;25474:11;25450:23;:36::i;:::-;25328:158;25308:178;;25189:305;;;:::o;30947:127::-;31012:4;31064:1;31036:30;;:7;:16;31044:7;31036:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31029:37;;30947:127;;;:::o;2803:98::-;2856:7;2883:10;2876:17;;2803:98;:::o;35093:174::-;35195:2;35168:15;:24;35184:7;35168:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35251:7;35247:2;35213:46;;35222:23;35237:7;35222:14;:23::i;:::-;35213:46;;;;;;;;;;;;35093:174;;:::o;31241:348::-;31334:4;31359:16;31367:7;31359;:16::i;:::-;31351:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31435:13;31451:23;31466:7;31451:14;:23::i;:::-;31435:39;;31504:5;31493:16;;:7;:16;;;:51;;;;31537:7;31513:31;;:20;31525:7;31513:11;:20::i;:::-;:31;;;31493:51;:87;;;;31548:32;31565:5;31572:7;31548:16;:32::i;:::-;31493:87;31485:96;;;31241:348;;;;:::o;34350:625::-;34509:4;34482:31;;:23;34497:7;34482:14;:23::i;:::-;:31;;;34474:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;34588:1;34574:16;;:2;:16;;;;34566:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34644:39;34665:4;34671:2;34675:7;34644:20;:39::i;:::-;34748:29;34765:1;34769:7;34748:8;:29::i;:::-;34809:1;34790:9;:15;34800:4;34790:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34838:1;34821:9;:13;34831:2;34821:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34869:2;34850:7;:16;34858:7;34850:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34908:7;34904:2;34889:27;;34898:4;34889:27;;;;;;;;;;;;34929:38;34949:4;34955:2;34959:7;34929:19;:38::i;:::-;34350:625;;;:::o;46385:190::-;46510:4;46563;46534:25;46547:5;46554:4;46534:12;:25::i;:::-;:33;46527:40;;46385:190;;;;;:::o;31931:110::-;32007:26;32017:2;32021:7;32007:26;;;;;;;;;;;;:9;:26::i;:::-;31931:110;;:::o;5349:191::-;5423:16;5442:6;;;;;;;;;;;5423:25;;5468:8;5459:6;;:17;;;;;;;;;;;;;;;;;;5523:8;5492:40;;5513:8;5492:40;;;;;;;;;;;;5412:128;5349:191;:::o;35409:315::-;35564:8;35555:17;;:5;:17;;;;35547:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;35651:8;35613:18;:25;35632:5;35613:25;;;;;;;;;;;;;;;:35;35639:8;35613:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;35697:8;35675:41;;35690:5;35675:41;;;35707:8;35675:41;;;;;;:::i;:::-;;;;;;;;35409:315;;;:::o;30319:::-;30476:28;30486:4;30492:2;30496:7;30476:9;:28::i;:::-;30523:48;30546:4;30552:2;30556:7;30565:5;30523:22;:48::i;:::-;30515:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30319:315;;;;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;16863:157::-;16948:4;16987:25;16972:40;;;:11;:40;;;;16965:47;;16863:157;;;:::o;40990:589::-;41134:45;41161:4;41167:2;41171:7;41134:26;:45::i;:::-;41212:1;41196:18;;:4;:18;;;41192:187;;;41231:40;41263:7;41231:31;:40::i;:::-;41192:187;;;41301:2;41293:10;;:4;:10;;;41289:90;;41320:47;41353:4;41359:7;41320:32;:47::i;:::-;41289:90;41192:187;41407:1;41393:16;;:2;:16;;;41389:183;;;41426:45;41463:7;41426:36;:45::i;:::-;41389:183;;;41499:4;41493:10;;:2;:10;;;41489:83;;41520:40;41548:2;41552:7;41520:27;:40::i;:::-;41489:83;41389:183;40990:589;;;:::o;38171:125::-;;;;:::o;46937:675::-;47020:7;47040:20;47063:4;47040:27;;47083:9;47078:497;47102:5;:12;47098:1;:16;47078:497;;;47136:20;47159:5;47165:1;47159:8;;;;;;;;:::i;:::-;;;;;;;;47136:31;;47202:12;47186;:28;47182:382;;47329:42;47344:12;47358;47329:14;:42::i;:::-;47314:57;;47182:382;;;47506:42;47521:12;47535;47506:14;:42::i;:::-;47491:57;;47182:382;47121:454;47116:3;;;;;:::i;:::-;;;;47078:497;;;;47592:12;47585:19;;;46937:675;;;;:::o;32268:321::-;32398:18;32404:2;32408:7;32398:5;:18::i;:::-;32449:54;32480:1;32484:2;32488:7;32497:5;32449:22;:54::i;:::-;32427:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32268:321;;;:::o;36289:799::-;36444:4;36465:15;:2;:13;;;:15::i;:::-;36461:620;;;36517:2;36501:36;;;36538:12;:10;:12::i;:::-;36552:4;36558:7;36567:5;36501:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36497:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36760:1;36743:6;:13;:18;36739:272;;;36786:60;;;;;;;;;;:::i;:::-;;;;;;;;36739:272;36961:6;36955:13;36946:6;36942:2;36938:15;36931:38;36497:529;36634:41;;;36624:51;;;:6;:51;;;;36617:58;;;;;36461:620;37065:4;37058:11;;36289:799;;;;;;;:::o;37660:126::-;;;;:::o;42302:164::-;42406:10;:17;;;;42379:15;:24;42395:7;42379:24;;;;;;;;;;;:44;;;;42434:10;42450:7;42434:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42302:164;:::o;43093:988::-;43359:22;43409:1;43384:22;43401:4;43384:16;:22::i;:::-;:26;;;;:::i;:::-;43359:51;;43421:18;43442:17;:26;43460:7;43442:26;;;;;;;;;;;;43421:47;;43589:14;43575:10;:28;43571:328;;43620:19;43642:12;:18;43655:4;43642:18;;;;;;;;;;;;;;;:34;43661:14;43642:34;;;;;;;;;;;;43620:56;;43726:11;43693:12;:18;43706:4;43693:18;;;;;;;;;;;;;;;:30;43712:10;43693:30;;;;;;;;;;;:44;;;;43843:10;43810:17;:30;43828:11;43810:30;;;;;;;;;;;:43;;;;43605:294;43571:328;43995:17;:26;44013:7;43995:26;;;;;;;;;;;43988:33;;;44039:12;:18;44052:4;44039:18;;;;;;;;;;;;;;;:34;44058:14;44039:34;;;;;;;;;;;44032:41;;;43174:907;;43093:988;;:::o;44376:1079::-;44629:22;44674:1;44654:10;:17;;;;:21;;;;:::i;:::-;44629:46;;44686:18;44707:15;:24;44723:7;44707:24;;;;;;;;;;;;44686:45;;45058:19;45080:10;45091:14;45080:26;;;;;;;;:::i;:::-;;;;;;;;;;45058:48;;45144:11;45119:10;45130;45119:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;45255:10;45224:15;:28;45240:11;45224:28;;;;;;;;;;;:41;;;;45396:15;:24;45412:7;45396:24;;;;;;;;;;;45389:31;;;45431:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44447:1008;;;44376:1079;:::o;41880:221::-;41965:14;41982:20;41999:2;41982:16;:20::i;:::-;41965:37;;42040:7;42013:12;:16;42026:2;42013:16;;;;;;;;;;;;;;;:24;42030:6;42013:24;;;;;;;;;;;:34;;;;42087:6;42058:17;:26;42076:7;42058:26;;;;;;;;;;;:35;;;;41954:147;41880:221;;:::o;47620:224::-;47688:13;47751:1;47745:4;47738:15;47780:1;47774:4;47767:15;47821:4;47815;47805:21;47796:30;;47620:224;;;;:::o;32925:439::-;33019:1;33005:16;;:2;:16;;;;32997:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33078:16;33086:7;33078;:16::i;:::-;33077:17;33069:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33140:45;33169:1;33173:2;33177:7;33140:20;:45::i;:::-;33215:1;33198:9;:13;33208:2;33198:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33246:2;33227:7;:16;33235:7;33227:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33291:7;33287:2;33266:33;;33283:1;33266:33;;;;;;;;;;;;33312:44;33340:1;33344:2;33348:7;33312:19;:44::i;:::-;32925:439;;:::o;6780:326::-;6840:4;7097:1;7075:7;:19;;;:23;7068:30;;6780:326;;;:::o;-1:-1:-1:-;;;;;;;:::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:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:118::-;1839:24;1857:5;1839:24;:::i;:::-;1834:3;1827:37;1752:118;;:::o;1876:222::-;1969:4;2007:2;1996:9;1992:18;1984:26;;2020:71;2088:1;2077:9;2073:17;2064:6;2020:71;:::i;:::-;1876:222;;;;:::o;2104:99::-;2156:6;2190:5;2184:12;2174:22;;2104:99;;;:::o;2209:169::-;2293:11;2327:6;2322:3;2315:19;2367:4;2362:3;2358:14;2343:29;;2209:169;;;;:::o;2384:307::-;2452:1;2462:113;2476:6;2473:1;2470:13;2462:113;;;2561:1;2556:3;2552:11;2546:18;2542:1;2537:3;2533:11;2526:39;2498:2;2495:1;2491:10;2486:15;;2462:113;;;2593:6;2590:1;2587:13;2584:101;;;2673:1;2664:6;2659:3;2655:16;2648:27;2584:101;2433:258;2384:307;;;:::o;2697:102::-;2738:6;2789:2;2785:7;2780:2;2773:5;2769:14;2765:28;2755:38;;2697:102;;;:::o;2805:364::-;2893:3;2921:39;2954:5;2921:39;:::i;:::-;2976:71;3040:6;3035:3;2976:71;:::i;:::-;2969:78;;3056:52;3101:6;3096:3;3089:4;3082:5;3078:16;3056:52;:::i;:::-;3133:29;3155:6;3133:29;:::i;:::-;3128:3;3124:39;3117:46;;2897:272;2805:364;;;;:::o;3175:313::-;3288:4;3326:2;3315:9;3311:18;3303:26;;3375:9;3369:4;3365:20;3361:1;3350:9;3346:17;3339:47;3403:78;3476:4;3467:6;3403:78;:::i;:::-;3395:86;;3175:313;;;;:::o;3494:77::-;3531:7;3560:5;3549:16;;3494:77;;;:::o;3577:122::-;3650:24;3668:5;3650:24;:::i;:::-;3643:5;3640:35;3630:63;;3689:1;3686;3679:12;3630:63;3577:122;:::o;3705:139::-;3751:5;3789:6;3776:20;3767:29;;3805:33;3832:5;3805:33;:::i;:::-;3705:139;;;;:::o;3850:329::-;3909:6;3958:2;3946:9;3937:7;3933:23;3929:32;3926:119;;;3964:79;;:::i;:::-;3926:119;4084:1;4109:53;4154:7;4145:6;4134:9;4130:22;4109:53;:::i;:::-;4099:63;;4055:117;3850:329;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:117::-;6024:1;6021;6014:12;6038:180;6086:77;6083:1;6076:88;6183:4;6180:1;6173:15;6207:4;6204:1;6197:15;6224:281;6307:27;6329:4;6307:27;:::i;:::-;6299:6;6295:40;6437:6;6425:10;6422:22;6401:18;6389:10;6386:34;6383:62;6380:88;;;6448:18;;:::i;:::-;6380:88;6488:10;6484:2;6477:22;6267:238;6224:281;;:::o;6511:129::-;6545:6;6572:20;;:::i;:::-;6562:30;;6601:33;6629:4;6621:6;6601:33;:::i;:::-;6511:129;;;:::o;6646:311::-;6723:4;6813:18;6805:6;6802:30;6799:56;;;6835:18;;:::i;:::-;6799:56;6885:4;6877:6;6873:17;6865:25;;6945:4;6939;6935:15;6927:23;;6646:311;;;:::o;6963:117::-;7072:1;7069;7062:12;7086:77;7123:7;7152:5;7141:16;;7086:77;;;:::o;7169:122::-;7242:24;7260:5;7242:24;:::i;:::-;7235:5;7232:35;7222:63;;7281:1;7278;7271:12;7222:63;7169:122;:::o;7297:139::-;7343:5;7381:6;7368:20;7359:29;;7397:33;7424:5;7397:33;:::i;:::-;7297:139;;;;:::o;7459:710::-;7555:5;7580:81;7596:64;7653:6;7596:64;:::i;:::-;7580:81;:::i;:::-;7571:90;;7681:5;7710:6;7703:5;7696:21;7744:4;7737:5;7733:16;7726:23;;7797:4;7789:6;7785:17;7777:6;7773:30;7826:3;7818:6;7815:15;7812:122;;;7845:79;;:::i;:::-;7812:122;7960:6;7943:220;7977:6;7972:3;7969:15;7943:220;;;8052:3;8081:37;8114:3;8102:10;8081:37;:::i;:::-;8076:3;8069:50;8148:4;8143:3;8139:14;8132:21;;8019:144;8003:4;7998:3;7994:14;7987:21;;7943:220;;;7947:21;7561:608;;7459:710;;;;;:::o;8192:370::-;8263:5;8312:3;8305:4;8297:6;8293:17;8289:27;8279:122;;8320:79;;:::i;:::-;8279:122;8437:6;8424:20;8462:94;8552:3;8544:6;8537:4;8529:6;8525:17;8462:94;:::i;:::-;8453:103;;8269:293;8192:370;;;;:::o;8568:684::-;8661:6;8669;8718:2;8706:9;8697:7;8693:23;8689:32;8686:119;;;8724:79;;:::i;:::-;8686:119;8872:1;8861:9;8857:17;8844:31;8902:18;8894:6;8891:30;8888:117;;;8924:79;;:::i;:::-;8888:117;9029:78;9099:7;9090:6;9079:9;9075:22;9029:78;:::i;:::-;9019:88;;8815:302;9156:2;9182:53;9227:7;9218:6;9207:9;9203:22;9182:53;:::i;:::-;9172:63;;9127:118;8568:684;;;;;:::o;9258:117::-;9367:1;9364;9357:12;9381:308;9443:4;9533:18;9525:6;9522:30;9519:56;;;9555:18;;:::i;:::-;9519:56;9593:29;9615:6;9593:29;:::i;:::-;9585:37;;9677:4;9671;9667:15;9659:23;;9381:308;;;:::o;9695:154::-;9779:6;9774:3;9769;9756:30;9841:1;9832:6;9827:3;9823:16;9816:27;9695:154;;;:::o;9855:412::-;9933:5;9958:66;9974:49;10016:6;9974:49;:::i;:::-;9958:66;:::i;:::-;9949:75;;10047:6;10040:5;10033:21;10085:4;10078:5;10074:16;10123:3;10114:6;10109:3;10105:16;10102:25;10099:112;;;10130:79;;:::i;:::-;10099:112;10220:41;10254:6;10249:3;10244;10220:41;:::i;:::-;9939:328;9855:412;;;;;:::o;10287:340::-;10343:5;10392:3;10385:4;10377:6;10373:17;10369:27;10359:122;;10400:79;;:::i;:::-;10359:122;10517:6;10504:20;10542:79;10617:3;10609:6;10602:4;10594:6;10590:17;10542:79;:::i;:::-;10533:88;;10349:278;10287:340;;;;:::o;10633:509::-;10702:6;10751:2;10739:9;10730:7;10726:23;10722:32;10719:119;;;10757:79;;:::i;:::-;10719:119;10905:1;10894:9;10890:17;10877:31;10935:18;10927:6;10924:30;10921:117;;;10957:79;;:::i;:::-;10921:117;11062:63;11117:7;11108:6;11097:9;11093:22;11062:63;:::i;:::-;11052:73;;10848:287;10633:509;;;;:::o;11148:329::-;11207:6;11256:2;11244:9;11235:7;11231:23;11227:32;11224:119;;;11262:79;;:::i;:::-;11224:119;11382:1;11407:53;11452:7;11443:6;11432:9;11428:22;11407:53;:::i;:::-;11397:63;;11353:117;11148:329;;;;:::o;11483:116::-;11553:21;11568:5;11553:21;:::i;:::-;11546:5;11543:32;11533:60;;11589:1;11586;11579:12;11533:60;11483:116;:::o;11605:133::-;11648:5;11686:6;11673:20;11664:29;;11702:30;11726:5;11702:30;:::i;:::-;11605:133;;;;:::o;11744:468::-;11809:6;11817;11866:2;11854:9;11845:7;11841:23;11837:32;11834:119;;;11872:79;;:::i;:::-;11834:119;11992:1;12017:53;12062:7;12053:6;12042:9;12038:22;12017:53;:::i;:::-;12007:63;;11963:117;12119:2;12145:50;12187:7;12178:6;12167:9;12163:22;12145:50;:::i;:::-;12135:60;;12090:115;11744:468;;;;;:::o;12218:307::-;12279:4;12369:18;12361:6;12358:30;12355:56;;;12391:18;;:::i;:::-;12355:56;12429:29;12451:6;12429:29;:::i;:::-;12421:37;;12513:4;12507;12503:15;12495:23;;12218:307;;;:::o;12531:410::-;12608:5;12633:65;12649:48;12690:6;12649:48;:::i;:::-;12633:65;:::i;:::-;12624:74;;12721:6;12714:5;12707:21;12759:4;12752:5;12748:16;12797:3;12788:6;12783:3;12779:16;12776:25;12773:112;;;12804:79;;:::i;:::-;12773:112;12894:41;12928:6;12923:3;12918;12894:41;:::i;:::-;12614:327;12531:410;;;;;:::o;12960:338::-;13015:5;13064:3;13057:4;13049:6;13045:17;13041:27;13031:122;;13072:79;;:::i;:::-;13031:122;13189:6;13176:20;13214:78;13288:3;13280:6;13273:4;13265:6;13261:17;13214:78;:::i;:::-;13205:87;;13021:277;12960:338;;;;:::o;13304:943::-;13399:6;13407;13415;13423;13472:3;13460:9;13451:7;13447:23;13443:33;13440:120;;;13479:79;;:::i;:::-;13440:120;13599:1;13624:53;13669:7;13660:6;13649:9;13645:22;13624:53;:::i;:::-;13614:63;;13570:117;13726:2;13752:53;13797:7;13788:6;13777:9;13773:22;13752:53;:::i;:::-;13742:63;;13697:118;13854:2;13880:53;13925:7;13916:6;13905:9;13901:22;13880:53;:::i;:::-;13870:63;;13825:118;14010:2;13999:9;13995:18;13982:32;14041:18;14033:6;14030:30;14027:117;;;14063:79;;:::i;:::-;14027:117;14168:62;14222:7;14213:6;14202:9;14198:22;14168:62;:::i;:::-;14158:72;;13953:287;13304:943;;;;;;;:::o;14253:329::-;14312:6;14361:2;14349:9;14340:7;14336:23;14332:32;14329:119;;;14367:79;;:::i;:::-;14329:119;14487:1;14512:53;14557:7;14548:6;14537:9;14533:22;14512:53;:::i;:::-;14502:63;;14458:117;14253:329;;;;:::o;14588:474::-;14656:6;14664;14713:2;14701:9;14692:7;14688:23;14684:32;14681:119;;;14719:79;;:::i;:::-;14681:119;14839:1;14864:53;14909:7;14900:6;14889:9;14885:22;14864:53;:::i;:::-;14854:63;;14810:117;14966:2;14992:53;15037:7;15028:6;15017:9;15013:22;14992:53;:::i;:::-;14982:63;;14937:118;14588:474;;;;;:::o;15068:180::-;15116:77;15113:1;15106:88;15213:4;15210:1;15203:15;15237:4;15234:1;15227:15;15254:320;15298:6;15335:1;15329:4;15325:12;15315:22;;15382:1;15376:4;15372:12;15403:18;15393:81;;15459:4;15451:6;15447:17;15437:27;;15393:81;15521:2;15513:6;15510:14;15490:18;15487:38;15484:84;;;15540:18;;:::i;:::-;15484:84;15305:269;15254:320;;;:::o;15580:231::-;15720:34;15716:1;15708:6;15704:14;15697:58;15789:14;15784:2;15776:6;15772:15;15765:39;15580:231;:::o;15817:366::-;15959:3;15980:67;16044:2;16039:3;15980:67;:::i;:::-;15973:74;;16056:93;16145:3;16056:93;:::i;:::-;16174:2;16169:3;16165:12;16158:19;;15817:366;;;:::o;16189:419::-;16355:4;16393:2;16382:9;16378:18;16370:26;;16442:9;16436:4;16432:20;16428:1;16417:9;16413:17;16406:47;16470:131;16596:4;16470:131;:::i;:::-;16462:139;;16189:419;;;:::o;16614:220::-;16754:34;16750:1;16742:6;16738:14;16731:58;16823:3;16818:2;16810:6;16806:15;16799:28;16614:220;:::o;16840:366::-;16982:3;17003:67;17067:2;17062:3;17003:67;:::i;:::-;16996:74;;17079:93;17168:3;17079:93;:::i;:::-;17197:2;17192:3;17188:12;17181:19;;16840:366;;;:::o;17212:419::-;17378:4;17416:2;17405:9;17401:18;17393:26;;17465:9;17459:4;17455:20;17451:1;17440:9;17436:17;17429:47;17493:131;17619:4;17493:131;:::i;:::-;17485:139;;17212:419;;;:::o;17637:243::-;17777:34;17773:1;17765:6;17761:14;17754:58;17846:26;17841:2;17833:6;17829:15;17822:51;17637:243;:::o;17886:366::-;18028:3;18049:67;18113:2;18108:3;18049:67;:::i;:::-;18042:74;;18125:93;18214:3;18125:93;:::i;:::-;18243:2;18238:3;18234:12;18227:19;;17886:366;;;:::o;18258:419::-;18424:4;18462:2;18451:9;18447:18;18439:26;;18511:9;18505:4;18501:20;18497:1;18486:9;18482:17;18475:47;18539:131;18665:4;18539:131;:::i;:::-;18531:139;;18258:419;;;:::o;18683:236::-;18823:34;18819:1;18811:6;18807:14;18800:58;18892:19;18887:2;18879:6;18875:15;18868:44;18683:236;:::o;18925:366::-;19067:3;19088:67;19152:2;19147:3;19088:67;:::i;:::-;19081:74;;19164:93;19253:3;19164:93;:::i;:::-;19282:2;19277:3;19273:12;19266:19;;18925:366;;;:::o;19297:419::-;19463:4;19501:2;19490:9;19486:18;19478:26;;19550:9;19544:4;19540:20;19536:1;19525:9;19521:17;19514:47;19578:131;19704:4;19578:131;:::i;:::-;19570:139;;19297:419;;;:::o;19722:230::-;19862:34;19858:1;19850:6;19846:14;19839:58;19931:13;19926:2;19918:6;19914:15;19907:38;19722:230;:::o;19958:366::-;20100:3;20121:67;20185:2;20180:3;20121:67;:::i;:::-;20114:74;;20197:93;20286:3;20197:93;:::i;:::-;20315:2;20310:3;20306:12;20299:19;;19958:366;;;:::o;20330:419::-;20496:4;20534:2;20523:9;20519:18;20511:26;;20583:9;20577:4;20573:20;20569:1;20558:9;20554:17;20547:47;20611:131;20737:4;20611:131;:::i;:::-;20603:139;;20330:419;;;:::o;20755:170::-;20895:22;20891:1;20883:6;20879:14;20872:46;20755:170;:::o;20931:366::-;21073:3;21094:67;21158:2;21153:3;21094:67;:::i;:::-;21087:74;;21170:93;21259:3;21170:93;:::i;:::-;21288:2;21283:3;21279:12;21272:19;;20931:366;;;:::o;21303:419::-;21469:4;21507:2;21496:9;21492:18;21484:26;;21556:9;21550:4;21546:20;21542:1;21531:9;21527:17;21520:47;21584:131;21710:4;21584:131;:::i;:::-;21576:139;;21303:419;;;:::o;21728:180::-;21776:77;21773:1;21766:88;21873:4;21870:1;21863:15;21897:4;21894:1;21887:15;21914:191;21954:4;21974:20;21992:1;21974:20;:::i;:::-;21969:25;;22008:20;22026:1;22008:20;:::i;:::-;22003:25;;22047:1;22044;22041:8;22038:34;;;22052:18;;:::i;:::-;22038:34;22097:1;22094;22090:9;22082:17;;21914:191;;;;:::o;22111:94::-;22144:8;22192:5;22188:2;22184:14;22163:35;;22111:94;;;:::o;22211:::-;22250:7;22279:20;22293:5;22279:20;:::i;:::-;22268:31;;22211:94;;;:::o;22311:100::-;22350:7;22379:26;22399:5;22379:26;:::i;:::-;22368:37;;22311:100;;;:::o;22417:157::-;22522:45;22542:24;22560:5;22542:24;:::i;:::-;22522:45;:::i;:::-;22517:3;22510:58;22417:157;;:::o;22580:256::-;22692:3;22707:75;22778:3;22769:6;22707:75;:::i;:::-;22807:2;22802:3;22798:12;22791:19;;22827:3;22820:10;;22580:256;;;;:::o;22842:166::-;22982:18;22978:1;22970:6;22966:14;22959:42;22842:166;:::o;23014:366::-;23156:3;23177:67;23241:2;23236:3;23177:67;:::i;:::-;23170:74;;23253:93;23342:3;23253:93;:::i;:::-;23371:2;23366:3;23362:12;23355:19;;23014:366;;;:::o;23386:419::-;23552:4;23590:2;23579:9;23575:18;23567:26;;23639:9;23633:4;23629:20;23625:1;23614:9;23610:17;23603:47;23667:131;23793:4;23667:131;:::i;:::-;23659:139;;23386:419;;;:::o;23811:305::-;23851:3;23870:20;23888:1;23870:20;:::i;:::-;23865:25;;23904:20;23922:1;23904:20;:::i;:::-;23899:25;;24058:1;23990:66;23986:74;23983:1;23980:81;23977:107;;;24064:18;;:::i;:::-;23977:107;24108:1;24105;24101:9;24094:16;;23811:305;;;;:::o;24122:224::-;24262:34;24258:1;24250:6;24246:14;24239:58;24331:7;24326:2;24318:6;24314:15;24307:32;24122:224;:::o;24352:366::-;24494:3;24515:67;24579:2;24574:3;24515:67;:::i;:::-;24508:74;;24591:93;24680:3;24591:93;:::i;:::-;24709:2;24704:3;24700:12;24693:19;;24352:366;;;:::o;24724:419::-;24890:4;24928:2;24917:9;24913:18;24905:26;;24977:9;24971:4;24967:20;24963:1;24952:9;24948:17;24941:47;25005:131;25131:4;25005:131;:::i;:::-;24997:139;;24724:419;;;:::o;25149:172::-;25289:24;25285:1;25277:6;25273:14;25266:48;25149:172;:::o;25327:366::-;25469:3;25490:67;25554:2;25549:3;25490:67;:::i;:::-;25483:74;;25566:93;25655:3;25566:93;:::i;:::-;25684:2;25679:3;25675:12;25668:19;;25327:366;;;:::o;25699:419::-;25865:4;25903:2;25892:9;25888:18;25880:26;;25952:9;25946:4;25942:20;25938:1;25927:9;25923:17;25916:47;25980:131;26106:4;25980:131;:::i;:::-;25972:139;;25699:419;;;:::o;26124:171::-;26264:23;26260:1;26252:6;26248:14;26241:47;26124:171;:::o;26301:366::-;26443:3;26464:67;26528:2;26523:3;26464:67;:::i;:::-;26457:74;;26540:93;26629:3;26540:93;:::i;:::-;26658:2;26653:3;26649:12;26642:19;;26301:366;;;:::o;26673:419::-;26839:4;26877:2;26866:9;26862:18;26854:26;;26926:9;26920:4;26916:20;26912:1;26901:9;26897:17;26890:47;26954:131;27080:4;26954:131;:::i;:::-;26946:139;;26673:419;;;:::o;27098:221::-;27238:34;27234:1;27226:6;27222:14;27215:58;27307:4;27302:2;27294:6;27290:15;27283:29;27098:221;:::o;27325:366::-;27467:3;27488:67;27552:2;27547:3;27488:67;:::i;:::-;27481:74;;27564:93;27653:3;27564:93;:::i;:::-;27682:2;27677:3;27673:12;27666:19;;27325:366;;;:::o;27697:419::-;27863:4;27901:2;27890:9;27886:18;27878:26;;27950:9;27944:4;27940:20;27936:1;27925:9;27921:17;27914:47;27978:131;28104:4;27978:131;:::i;:::-;27970:139;;27697:419;;;:::o;28122:348::-;28162:7;28185:20;28203:1;28185:20;:::i;:::-;28180:25;;28219:20;28237:1;28219:20;:::i;:::-;28214:25;;28407:1;28339:66;28335:74;28332:1;28329:81;28324:1;28317:9;28310:17;28306:105;28303:131;;;28414:18;;:::i;:::-;28303:131;28462:1;28459;28455:9;28444:20;;28122:348;;;;:::o;28476:167::-;28616:19;28612:1;28604:6;28600:14;28593:43;28476:167;:::o;28649:366::-;28791:3;28812:67;28876:2;28871:3;28812:67;:::i;:::-;28805:74;;28888:93;28977:3;28888:93;:::i;:::-;29006:2;29001:3;28997:12;28990:19;;28649:366;;;:::o;29021:419::-;29187:4;29225:2;29214:9;29210:18;29202:26;;29274:9;29268:4;29264:20;29260:1;29249:9;29245:17;29238:47;29302:131;29428:4;29302:131;:::i;:::-;29294:139;;29021:419;;;:::o;29446:233::-;29485:3;29508:24;29526:5;29508:24;:::i;:::-;29499:33;;29554:66;29547:5;29544:77;29541:103;;;29624:18;;:::i;:::-;29541:103;29671:1;29664:5;29660:13;29653:20;;29446:233;;;:::o;29685:180::-;29733:77;29730:1;29723:88;29830:4;29827:1;29820:15;29854:4;29851:1;29844:15;29871:185;29911:1;29928:20;29946:1;29928:20;:::i;:::-;29923:25;;29962:20;29980:1;29962:20;:::i;:::-;29957:25;;30001:1;29991:35;;30006:18;;:::i;:::-;29991:35;30048:1;30045;30041:9;30036:14;;29871:185;;;;:::o;30062:231::-;30202:34;30198:1;30190:6;30186:14;30179:58;30271:14;30266:2;30258:6;30254:15;30247:39;30062:231;:::o;30299:366::-;30441:3;30462:67;30526:2;30521:3;30462:67;:::i;:::-;30455:74;;30538:93;30627:3;30538:93;:::i;:::-;30656:2;30651:3;30647:12;30640:19;;30299:366;;;:::o;30671:419::-;30837:4;30875:2;30864:9;30860:18;30852:26;;30924:9;30918:4;30914:20;30910:1;30899:9;30895:17;30888:47;30952:131;31078:4;30952:131;:::i;:::-;30944:139;;30671:419;;;:::o;31096:180::-;31144:77;31141:1;31134:88;31241:4;31238:1;31231:15;31265:4;31262:1;31255:15;31282:182;31422:34;31418:1;31410:6;31406:14;31399:58;31282:182;:::o;31470:366::-;31612:3;31633:67;31697:2;31692:3;31633:67;:::i;:::-;31626:74;;31709:93;31798:3;31709:93;:::i;:::-;31827:2;31822:3;31818:12;31811:19;;31470:366;;;:::o;31842:419::-;32008:4;32046:2;32035:9;32031:18;32023:26;;32095:9;32089:4;32085:20;32081:1;32070:9;32066:17;32059:47;32123:131;32249:4;32123:131;:::i;:::-;32115:139;;31842:419;;;:::o;32267:228::-;32407:34;32403:1;32395:6;32391:14;32384:58;32476:11;32471:2;32463:6;32459:15;32452:36;32267:228;:::o;32501:366::-;32643:3;32664:67;32728:2;32723:3;32664:67;:::i;:::-;32657:74;;32740:93;32829:3;32740:93;:::i;:::-;32858:2;32853:3;32849:12;32842:19;;32501:366;;;:::o;32873:419::-;33039:4;33077:2;33066:9;33062:18;33054:26;;33126:9;33120:4;33116:20;33112:1;33101:9;33097:17;33090:47;33154:131;33280:4;33154:131;:::i;:::-;33146:139;;32873:419;;;:::o;33298:229::-;33438:34;33434:1;33426:6;33422:14;33415:58;33507:12;33502:2;33494:6;33490:15;33483:37;33298:229;:::o;33533:366::-;33675:3;33696:67;33760:2;33755:3;33696:67;:::i;:::-;33689:74;;33772:93;33861:3;33772:93;:::i;:::-;33890:2;33885:3;33881:12;33874:19;;33533:366;;;:::o;33905:419::-;34071:4;34109:2;34098:9;34094:18;34086:26;;34158:9;34152:4;34148:20;34144:1;34133:9;34129:17;34122:47;34186:131;34312:4;34186:131;:::i;:::-;34178:139;;33905:419;;;:::o;34330:234::-;34470:34;34466:1;34458:6;34454:14;34447:58;34539:17;34534:2;34526:6;34522:15;34515:42;34330:234;:::o;34570:366::-;34712:3;34733:67;34797:2;34792:3;34733:67;:::i;:::-;34726:74;;34809:93;34898:3;34809:93;:::i;:::-;34927:2;34922:3;34918:12;34911:19;;34570:366;;;:::o;34942:419::-;35108:4;35146:2;35135:9;35131:18;35123:26;;35195:9;35189:4;35185:20;35181:1;35170:9;35166:17;35159:47;35223:131;35349:4;35223:131;:::i;:::-;35215:139;;34942:419;;;:::o;35367:148::-;35469:11;35506:3;35491:18;;35367:148;;;;:::o;35521:141::-;35570:4;35593:3;35585:11;;35616:3;35613:1;35606:14;35650:4;35647:1;35637:18;35629:26;;35521:141;;;:::o;35692:845::-;35795:3;35832:5;35826:12;35861:36;35887:9;35861:36;:::i;:::-;35913:89;35995:6;35990:3;35913:89;:::i;:::-;35906:96;;36033:1;36022:9;36018:17;36049:1;36044:137;;;;36195:1;36190:341;;;;36011:520;;36044:137;36128:4;36124:9;36113;36109:25;36104:3;36097:38;36164:6;36159:3;36155:16;36148:23;;36044:137;;36190:341;36257:38;36289:5;36257:38;:::i;:::-;36317:1;36331:154;36345:6;36342:1;36339:13;36331:154;;;36419:7;36413:14;36409:1;36404:3;36400:11;36393:35;36469:1;36460:7;36456:15;36445:26;;36367:4;36364:1;36360:12;36355:17;;36331:154;;;36514:6;36509:3;36505:16;36498:23;;36197:334;;36011:520;;35799:738;;35692:845;;;;:::o;36543:377::-;36649:3;36677:39;36710:5;36677:39;:::i;:::-;36732:89;36814:6;36809:3;36732:89;:::i;:::-;36725:96;;36830:52;36875:6;36870:3;36863:4;36856:5;36852:16;36830:52;:::i;:::-;36907:6;36902:3;36898:16;36891:23;;36653:267;36543:377;;;;:::o;36926:583::-;37148:3;37170:92;37258:3;37249:6;37170:92;:::i;:::-;37163:99;;37279:95;37370:3;37361:6;37279:95;:::i;:::-;37272:102;;37391:92;37479:3;37470:6;37391:92;:::i;:::-;37384:99;;37500:3;37493:10;;36926:583;;;;;;:::o;37515:225::-;37655:34;37651:1;37643:6;37639:14;37632:58;37724:8;37719:2;37711:6;37707:15;37700:33;37515:225;:::o;37746:366::-;37888:3;37909:67;37973:2;37968:3;37909:67;:::i;:::-;37902:74;;37985:93;38074:3;37985:93;:::i;:::-;38103:2;38098:3;38094:12;38087:19;;37746:366;;;:::o;38118:419::-;38284:4;38322:2;38311:9;38307:18;38299:26;;38371:9;38365:4;38361:20;38357:1;38346:9;38342:17;38335:47;38399:131;38525:4;38399:131;:::i;:::-;38391:139;;38118:419;;;:::o;38543:231::-;38683:34;38679:1;38671:6;38667:14;38660:58;38752:14;38747:2;38739:6;38735:15;38728:39;38543:231;:::o;38780:366::-;38922:3;38943:67;39007:2;39002:3;38943:67;:::i;:::-;38936:74;;39019:93;39108:3;39019:93;:::i;:::-;39137:2;39132:3;39128:12;39121:19;;38780:366;;;:::o;39152:419::-;39318:4;39356:2;39345:9;39341:18;39333:26;;39405:9;39399:4;39395:20;39391:1;39380:9;39376:17;39369:47;39433:131;39559:4;39433:131;:::i;:::-;39425:139;;39152:419;;;:::o;39577:224::-;39717:34;39713:1;39705:6;39701:14;39694:58;39786:7;39781:2;39773:6;39769:15;39762:32;39577:224;:::o;39807:366::-;39949:3;39970:67;40034:2;40029:3;39970:67;:::i;:::-;39963:74;;40046:93;40135:3;40046:93;:::i;:::-;40164:2;40159:3;40155:12;40148:19;;39807:366;;;:::o;40179:419::-;40345:4;40383:2;40372:9;40368:18;40360:26;;40432:9;40426:4;40422:20;40418:1;40407:9;40403:17;40396:47;40460:131;40586:4;40460:131;:::i;:::-;40452:139;;40179:419;;;:::o;40604:223::-;40744:34;40740:1;40732:6;40728:14;40721:58;40813:6;40808:2;40800:6;40796:15;40789:31;40604:223;:::o;40833:366::-;40975:3;40996:67;41060:2;41055:3;40996:67;:::i;:::-;40989:74;;41072:93;41161:3;41072:93;:::i;:::-;41190:2;41185:3;41181:12;41174:19;;40833:366;;;:::o;41205:419::-;41371:4;41409:2;41398:9;41394:18;41386:26;;41458:9;41452:4;41448:20;41444:1;41433:9;41429:17;41422:47;41486:131;41612:4;41486:131;:::i;:::-;41478:139;;41205:419;;;:::o;41630:175::-;41770:27;41766:1;41758:6;41754:14;41747:51;41630:175;:::o;41811:366::-;41953:3;41974:67;42038:2;42033:3;41974:67;:::i;:::-;41967:74;;42050:93;42139:3;42050:93;:::i;:::-;42168:2;42163:3;42159:12;42152:19;;41811:366;;;:::o;42183:419::-;42349:4;42387:2;42376:9;42372:18;42364:26;;42436:9;42430:4;42426:20;42422:1;42411:9;42407:17;42400:47;42464:131;42590:4;42464:131;:::i;:::-;42456:139;;42183:419;;;:::o;42608:237::-;42748:34;42744:1;42736:6;42732:14;42725:58;42817:20;42812:2;42804:6;42800:15;42793:45;42608:237;:::o;42851:366::-;42993:3;43014:67;43078:2;43073:3;43014:67;:::i;:::-;43007:74;;43090:93;43179:3;43090:93;:::i;:::-;43208:2;43203:3;43199:12;43192:19;;42851:366;;;:::o;43223:419::-;43389:4;43427:2;43416:9;43412:18;43404:26;;43476:9;43470:4;43466:20;43462:1;43451:9;43447:17;43440:47;43504:131;43630:4;43504:131;:::i;:::-;43496:139;;43223:419;;;:::o;43648:176::-;43680:1;43697:20;43715:1;43697:20;:::i;:::-;43692:25;;43731:20;43749:1;43731:20;:::i;:::-;43726:25;;43770:1;43760:35;;43775:18;;:::i;:::-;43760:35;43816:1;43813;43809:9;43804:14;;43648:176;;;;:::o;43830:98::-;43881:6;43915:5;43909:12;43899:22;;43830:98;;;:::o;43934:168::-;44017:11;44051:6;44046:3;44039:19;44091:4;44086:3;44082:14;44067:29;;43934:168;;;;:::o;44108:360::-;44194:3;44222:38;44254:5;44222:38;:::i;:::-;44276:70;44339:6;44334:3;44276:70;:::i;:::-;44269:77;;44355:52;44400:6;44395:3;44388:4;44381:5;44377:16;44355:52;:::i;:::-;44432:29;44454:6;44432:29;:::i;:::-;44427:3;44423:39;44416:46;;44198:270;44108:360;;;;:::o;44474:640::-;44669:4;44707:3;44696:9;44692:19;44684:27;;44721:71;44789:1;44778:9;44774:17;44765:6;44721:71;:::i;:::-;44802:72;44870:2;44859:9;44855:18;44846:6;44802:72;:::i;:::-;44884;44952:2;44941:9;44937:18;44928:6;44884:72;:::i;:::-;45003:9;44997:4;44993:20;44988:2;44977:9;44973:18;44966:48;45031:76;45102:4;45093:6;45031:76;:::i;:::-;45023:84;;44474:640;;;;;;;:::o;45120:141::-;45176:5;45207:6;45201:13;45192:22;;45223:32;45249:5;45223:32;:::i;:::-;45120:141;;;;:::o;45267:349::-;45336:6;45385:2;45373:9;45364:7;45360:23;45356:32;45353:119;;;45391:79;;:::i;:::-;45353:119;45511:1;45536:63;45591:7;45582:6;45571:9;45567:22;45536:63;:::i;:::-;45526:73;;45482:127;45267:349;;;;:::o;45622:180::-;45670:77;45667:1;45660:88;45767:4;45764:1;45757:15;45791:4;45788:1;45781:15;45808:182;45948:34;45944:1;45936:6;45932:14;45925:58;45808:182;:::o;45996:366::-;46138:3;46159:67;46223:2;46218:3;46159:67;:::i;:::-;46152:74;;46235:93;46324:3;46235:93;:::i;:::-;46353:2;46348:3;46344:12;46337:19;;45996:366;;;:::o;46368:419::-;46534:4;46572:2;46561:9;46557:18;46549:26;;46621:9;46615:4;46611:20;46607:1;46596:9;46592:17;46585:47;46649:131;46775:4;46649:131;:::i;:::-;46641:139;;46368:419;;;:::o;46793:178::-;46933:30;46929:1;46921:6;46917:14;46910:54;46793:178;:::o;46977:366::-;47119:3;47140:67;47204:2;47199:3;47140:67;:::i;:::-;47133:74;;47216:93;47305:3;47216:93;:::i;:::-;47334:2;47329:3;47325:12;47318:19;;46977:366;;;:::o;47349:419::-;47515:4;47553:2;47542:9;47538:18;47530:26;;47602:9;47596:4;47592:20;47588:1;47577:9;47573:17;47566:47;47630:131;47756:4;47630:131;:::i;:::-;47622:139;;47349:419;;;:::o

Swarm Source

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