ETH Price: $3,254.17 (+3.17%)
Gas: 3 Gwei

Token

Midnight Munchies (MND)
 

Overview

Max Total Supply

806 MND

Holders

349

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
freshestkicks.eth
Balance
1 MND
0xc7d2219291c9da4f183074cd7ed210f32ca217ed
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:
MidnightMunchies

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-12
*/

/**
 *Submitted for verification at Etherscan.io on 2021-08-28
*/

//SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.10;

/**
 * @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);
}


/**
 * @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;
    }
}


/**
 * @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;
}

/**
 * @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);
}


/**
 * @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);
}


/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


/*
 * @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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}


/**
 * @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;

    string internal _tokenURI;


    // 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;
    }
    
    /// @notice It all points to base reality being a higher order of consciousness, take a deep dive into the work of Jacobo Grinberg.

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

    /**
     * @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 uri = _baseURI();
        return
            bytes(uri).length > 0
                ? string(abi.encodePacked(uri, _tokenId.toString(),".json"))
                : "";
    }

   
    /**
     * @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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(address from, address to, uint256 tokenId) public virtual override {
        //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);
    }

    /**
     * @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);
    }

    /**
     * @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 of token that is not own");
        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);
    }

    /**
     * @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 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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` 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 { }
}


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 ()  {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}



/**
 * @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 tokenId);

    /**
     * @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);
}

/**
 * @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();
    }
}


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

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

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

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

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



contract MidnightMunchies is ERC721Enumerable,Ownable() {
    
    IERC721Enumerable MembershipToken;
    
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;
    
    uint256 public maxSupply;
    uint256 public lockedTime;
    bool public sale; 
    
    mapping(uint256 => uint256) public usedMembershipToken;
    
    event NftBought(address indexed, uint256 tokenId, uint256 memberShipTokenId);
    
    constructor(address _tokenAddress) ERC721("Midnight Munchies", "MND"){
        MembershipToken = IERC721Enumerable(_tokenAddress);
        maxSupply = 5555;
        _tokenURI = 'https://ipfs.io/ipfs/QmR8qos4anNBL6qEEXMUX6tMnz7mrVu7qE6wEKdTTc76Ys/';
        lockedTime = 1639872000; // Dec 19 2021 
        sale = false;
        
    } 
    
    function buyNft(uint256 _count,uint256[] memory tokenId) public {
        require(totalSupply() + _count <= maxSupply,"ERROR: max limit reached");
        require(_count <= 10 && tokenId.length <= 10,"ERROR: max 10 mint per transaction");
        require(_count == tokenId.length,"ERROR: wrong token ID or count");
        require(sale,"ERROR: not on sale");

        if(block.timestamp < lockedTime){
            require(_count <= MembershipToken.balanceOf(msg.sender),"ERROR: not enough MembershipToken");
            for(uint256 i=0; i<tokenId.length; i++){
                require(msg.sender == MembershipToken.ownerOf(tokenId[i]),"ERROR: u don't have this token ID");
                if(usedMembershipToken[tokenId[i]] != 0) require(usedMembershipToken[tokenId[i]] <= block.timestamp ,"ERROR: this Membership Token is already used");
            }
        }
        
        for(uint256 j=0; j< _count; j++){
            _tokenIds.increment();
            uint256 newItemId = _tokenIds.current();
            
            mintNft(newItemId);
            
            usedMembershipToken[tokenId[j]] = lockedTime;
            
            emit NftBought(msg.sender,newItemId,tokenId[j]);
        }

    }

    function changeTokenUri(string memory _newUri) public onlyOwner {
        _tokenURI = _newUri;
    } 

    function unLockSale() public onlyOwner {
        sale = true;
    }

    function lockSale() public onlyOwner {
        sale = false;
    }

    function changeLockTime(uint256 newTime) public onlyOwner {
        lockedTime = newTime;
    }

    function mintNft(uint256 _id) internal {
        _safeMint(msg.sender,_id);
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"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":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"memberShipTokenId","type":"uint256"}],"name":"NftBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"}],"name":"buyNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTime","type":"uint256"}],"name":"changeLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newUri","type":"string"}],"name":"changeTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"sale","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unLockSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usedMembershipToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50604051620048e2380380620048e2833981810160405281019062000037919062000353565b6040518060400160405280601181526020017f4d69646e69676874204d756e63686965730000000000000000000000000000008152506040518060400160405280600381526020017f4d4e4400000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000bb92919062000239565b508060019080519060200190620000d492919062000239565b5050506000620000e96200023160201b60201c565b905080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35080600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506115b3600e819055506040518060800160405280604481526020016200489e60449139600290805190602001906200020392919062000239565b506361be7600600f819055506000601060006101000a81548160ff02191690831515021790555050620003ea565b600033905090565b8280546200024790620003b4565b90600052602060002090601f0160209004810192826200026b5760008555620002b7565b82601f106200028657805160ff1916838001178555620002b7565b82800160010185558215620002b7579182015b82811115620002b657825182559160200191906001019062000299565b5b509050620002c69190620002ca565b5090565b5b80821115620002e5576000816000905550600101620002cb565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200031b82620002ee565b9050919050565b6200032d816200030e565b81146200033957600080fd5b50565b6000815190506200034d8162000322565b92915050565b6000602082840312156200036c576200036b620002e9565b5b60006200037c848285016200033c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003cd57607f821691505b60208210811415620003e457620003e362000385565b5b50919050565b6144a480620003fa6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c8063715018a6116100f9578063a8b3820511610097578063d5abeb0111610071578063d5abeb01146104df578063e985e9c5146104fd578063f2fde38b1461052d578063f82c086514610549576101c4565b8063a8b3820514610475578063b88d4fde14610493578063c87b56dd146104af576101c4565b806395d89b41116100d357806395d89b411461040357806396cf522714610421578063a20e08ca1461043d578063a22cb46514610459576101c4565b8063715018a6146103d1578063884e53ad146103db5780638da5cb5b146103e5576101c4565b80632f745c59116101665780636352211e116101405780636352211e14610323578063635a25c2146103535780636ad1fe021461038357806370a08231146103a1576101c4565b80632f745c59146102a757806342842e0e146102d75780634f6ccce7146102f3576101c4565b8063081812fc116101a2578063081812fc14610221578063095ea7b31461025157806318160ddd1461026d57806323b872dd1461028b576101c4565b806301ffc9a7146101c957806306fdde03146101f957806307c60dac14610217575b600080fd5b6101e360048036038101906101de9190612b38565b610565565b6040516101f09190612b80565b60405180910390f35b6102016105df565b60405161020e9190612c34565b60405180910390f35b61021f610671565b005b61023b60048036038101906102369190612c8c565b610725565b6040516102489190612cfa565b60405180910390f35b61026b60048036038101906102669190612d41565b6107aa565b005b6102756108c2565b6040516102829190612d90565b60405180910390f35b6102a560048036038101906102a09190612dab565b6108cf565b005b6102c160048036038101906102bc9190612d41565b61092f565b6040516102ce9190612d90565b60405180910390f35b6102f160048036038101906102ec9190612dab565b6109d4565b005b61030d60048036038101906103089190612c8c565b6109f4565b60405161031a9190612d90565b60405180910390f35b61033d60048036038101906103389190612c8c565b610a65565b60405161034a9190612cfa565b60405180910390f35b61036d60048036038101906103689190612c8c565b610b17565b60405161037a9190612d90565b60405180910390f35b61038b610b2f565b6040516103989190612b80565b60405180910390f35b6103bb60048036038101906103b69190612dfe565b610b42565b6040516103c89190612d90565b60405180910390f35b6103d9610bfa565b005b6103e3610d52565b005b6103ed610e06565b6040516103fa9190612cfa565b60405180910390f35b61040b610e30565b6040516104189190612c34565b60405180910390f35b61043b60048036038101906104369190612c8c565b610ec2565b005b61045760048036038101906104529190612f60565b610f63565b005b610473600480360381019061046e9190612fd5565b611014565b005b61047d611195565b60405161048a9190612d90565b60405180910390f35b6104ad60048036038101906104a891906130b6565b61119b565b005b6104c960048036038101906104c49190612c8c565b6111fd565b6040516104d69190612c34565b60405180910390f35b6104e76112a4565b6040516104f49190612d90565b60405180910390f35b61051760048036038101906105129190613139565b6112aa565b6040516105249190612b80565b60405180910390f35b61054760048036038101906105429190612dfe565b61133e565b005b610563600480360381019061055e9190613241565b611505565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105d857506105d7826119f5565b5b9050919050565b6060600080546105ee906132cc565b80601f016020809104026020016040519081016040528092919081815260200182805461061a906132cc565b80156106675780601f1061063c57610100808354040283529160200191610667565b820191906000526020600020905b81548152906001019060200180831161064a57829003601f168201915b5050505050905090565b610679611ad7565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ff9061334a565b60405180910390fd5b6000601060006101000a81548160ff021916908315150217905550565b600061073082611adf565b61076f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610766906133dc565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107b582610a65565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081d9061346e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610845611ad7565b73ffffffffffffffffffffffffffffffffffffffff16148061087457506108738161086e611ad7565b6112aa565b5b6108b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108aa90613500565b60405180910390fd5b6108bd8383611b4b565b505050565b6000600980549050905090565b6108e06108da611ad7565b82611c04565b61091f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091690613592565b60405180910390fd5b61092a838383611ce2565b505050565b600061093a83610b42565b821061097b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097290613624565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109ef8383836040518060200160405280600081525061119b565b505050565b60006109fe6108c2565b8210610a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a36906136b6565b60405180910390fd5b60098281548110610a5357610a526136d6565b5b90600052602060002001549050919050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0590613777565b60405180910390fd5b80915050919050565b60116020528060005260406000206000915090505481565b601060009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610baa90613809565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c02611ad7565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c889061334a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b610d5a611ad7565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de09061334a565b60405180910390fd5b6001601060006101000a81548160ff021916908315150217905550565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e3f906132cc565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6b906132cc565b8015610eb85780601f10610e8d57610100808354040283529160200191610eb8565b820191906000526020600020905b815481529060010190602001808311610e9b57829003601f168201915b5050505050905090565b610eca611ad7565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f509061334a565b60405180910390fd5b80600f8190555050565b610f6b611ad7565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff19061334a565b60405180910390fd5b8060029080519060200190611010929190612a29565b5050565b61101c611ad7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561108a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108190613875565b60405180910390fd5b8060066000611097611ad7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611144611ad7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111899190612b80565b60405180910390a35050565b600f5481565b6111ac6111a6611ad7565b83611c04565b6111eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e290613592565b60405180910390fd5b6111f784848484611f3e565b50505050565b606061120882611adf565b611247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123e90613907565b60405180910390fd5b6000611251611f9a565b90506000815111611271576040518060200160405280600081525061129c565b8061127b8461202c565b60405160200161128c9291906139af565b6040516020818303038152906040525b915050919050565b600e5481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611346611ad7565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cc9061334a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c90613a50565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e54826115116108c2565b61151b9190613a9f565b111561155c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155390613b41565b60405180910390fd5b600a821115801561156f5750600a815111155b6115ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a590613bd3565b60405180910390fd5b805182146115f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e890613c3f565b60405180910390fd5b601060009054906101000a900460ff16611640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163790613cab565b60405180910390fd5b600f5442101561191257600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016116a59190612cfa565b602060405180830381865afa1580156116c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e69190613ce0565b821115611728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171f90613d7f565b60405180910390fd5b60005b815181101561191057600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e838381518110611785576117846136d6565b5b60200260200101516040518263ffffffff1660e01b81526004016117a99190612d90565b602060405180830381865afa1580156117c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ea9190613db4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184e90613e53565b60405180910390fd5b6000601160008484815181106118705761186f6136d6565b5b6020026020010151815260200190815260200160002054146118fd5742601160008484815181106118a4576118a36136d6565b5b602002602001015181526020019081526020016000205411156118fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f390613ee5565b60405180910390fd5b5b808061190890613f05565b91505061172b565b505b60005b828110156119f057611927600d61218d565b6000611933600d6121a3565b905061193e816121b1565b600f5460116000858581518110611958576119576136d6565b5b60200260200101518152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167f6cde4ed53ecc43e1126a8b2b9e8ad2f4ec18d9f7834636ed981cfa61960be370828585815181106119be576119bd6136d6565b5b60200260200101516040516119d4929190613f4e565b60405180910390a25080806119e890613f05565b915050611915565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ac057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ad05750611acf826121be565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611bbe83610a65565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c0f82611adf565b611c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4590613fe9565b60405180910390fd5b6000611c5983610a65565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611cc857508373ffffffffffffffffffffffffffffffffffffffff16611cb084610725565b73ffffffffffffffffffffffffffffffffffffffff16145b80611cd95750611cd881856112aa565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d0282610a65565b73ffffffffffffffffffffffffffffffffffffffff1614611d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4f9061407b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbf9061410d565b60405180910390fd5b611dd3838383612228565b611dde600082611b4b565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e2e919061412d565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e859190613a9f565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611f49848484611ce2565b611f558484848461233c565b611f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8b906141d3565b60405180910390fd5b50505050565b606060028054611fa9906132cc565b80601f0160208091040260200160405190810160405280929190818152602001828054611fd5906132cc565b80156120225780601f10611ff757610100808354040283529160200191612022565b820191906000526020600020905b81548152906001019060200180831161200557829003601f168201915b5050505050905090565b60606000821415612074576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612188565b600082905060005b600082146120a657808061208f90613f05565b915050600a8261209f9190614222565b915061207c565b60008167ffffffffffffffff8111156120c2576120c1612e35565b5b6040519080825280601f01601f1916602001820160405280156120f45781602001600182028036833780820191505090505b5090505b600085146121815760018261210d919061412d565b9150600a8561211c9190614253565b60306121289190613a9f565b60f81b81838151811061213e5761213d6136d6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561217a9190614222565b94506120f8565b8093505050505b919050565b6001816000016000828254019250508190555050565b600081600001549050919050565b6121bb33826124c4565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6122338383836124e2565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561227657612271816124e7565b6122b5565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146122b4576122b38382612530565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122f8576122f38161269d565b612337565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461233657612335828261276e565b5b5b505050565b600061235d8473ffffffffffffffffffffffffffffffffffffffff166127ed565b156124b7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612386611ad7565b8786866040518563ffffffff1660e01b81526004016123a894939291906142d9565b6020604051808303816000875af19250505080156123e457506040513d601f19601f820116820180604052508101906123e1919061433a565b60015b612467573d8060008114612414576040519150601f19603f3d011682016040523d82523d6000602084013e612419565b606091505b5060008151141561245f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612456906141d3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124bc565b600190505b949350505050565b6124de828260405180602001604052806000815250612800565b5050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161253d84610b42565b612547919061412d565b905060006008600084815260200190815260200160002054905081811461262c576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506126b1919061412d565b90506000600a60008481526020019081526020016000205490506000600983815481106126e1576126e06136d6565b5b906000526020600020015490508060098381548110612703576127026136d6565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061275257612751614367565b5b6001900381819060005260206000200160009055905550505050565b600061277983610b42565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b61280a838361285b565b612817600084848461233c565b612856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284d906141d3565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c2906143e2565b60405180910390fd5b6128d481611adf565b15612914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290b9061444e565b60405180910390fd5b61292060008383612228565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129709190613a9f565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612a35906132cc565b90600052602060002090601f016020900481019282612a575760008555612a9e565b82601f10612a7057805160ff1916838001178555612a9e565b82800160010185558215612a9e579182015b82811115612a9d578251825591602001919060010190612a82565b5b509050612aab9190612aaf565b5090565b5b80821115612ac8576000816000905550600101612ab0565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b1581612ae0565b8114612b2057600080fd5b50565b600081359050612b3281612b0c565b92915050565b600060208284031215612b4e57612b4d612ad6565b5b6000612b5c84828501612b23565b91505092915050565b60008115159050919050565b612b7a81612b65565b82525050565b6000602082019050612b956000830184612b71565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612bd5578082015181840152602081019050612bba565b83811115612be4576000848401525b50505050565b6000601f19601f8301169050919050565b6000612c0682612b9b565b612c108185612ba6565b9350612c20818560208601612bb7565b612c2981612bea565b840191505092915050565b60006020820190508181036000830152612c4e8184612bfb565b905092915050565b6000819050919050565b612c6981612c56565b8114612c7457600080fd5b50565b600081359050612c8681612c60565b92915050565b600060208284031215612ca257612ca1612ad6565b5b6000612cb084828501612c77565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ce482612cb9565b9050919050565b612cf481612cd9565b82525050565b6000602082019050612d0f6000830184612ceb565b92915050565b612d1e81612cd9565b8114612d2957600080fd5b50565b600081359050612d3b81612d15565b92915050565b60008060408385031215612d5857612d57612ad6565b5b6000612d6685828601612d2c565b9250506020612d7785828601612c77565b9150509250929050565b612d8a81612c56565b82525050565b6000602082019050612da56000830184612d81565b92915050565b600080600060608486031215612dc457612dc3612ad6565b5b6000612dd286828701612d2c565b9350506020612de386828701612d2c565b9250506040612df486828701612c77565b9150509250925092565b600060208284031215612e1457612e13612ad6565b5b6000612e2284828501612d2c565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612e6d82612bea565b810181811067ffffffffffffffff82111715612e8c57612e8b612e35565b5b80604052505050565b6000612e9f612acc565b9050612eab8282612e64565b919050565b600067ffffffffffffffff821115612ecb57612eca612e35565b5b612ed482612bea565b9050602081019050919050565b82818337600083830152505050565b6000612f03612efe84612eb0565b612e95565b905082815260208101848484011115612f1f57612f1e612e30565b5b612f2a848285612ee1565b509392505050565b600082601f830112612f4757612f46612e2b565b5b8135612f57848260208601612ef0565b91505092915050565b600060208284031215612f7657612f75612ad6565b5b600082013567ffffffffffffffff811115612f9457612f93612adb565b5b612fa084828501612f32565b91505092915050565b612fb281612b65565b8114612fbd57600080fd5b50565b600081359050612fcf81612fa9565b92915050565b60008060408385031215612fec57612feb612ad6565b5b6000612ffa85828601612d2c565b925050602061300b85828601612fc0565b9150509250929050565b600067ffffffffffffffff8211156130305761302f612e35565b5b61303982612bea565b9050602081019050919050565b600061305961305484613015565b612e95565b90508281526020810184848401111561307557613074612e30565b5b613080848285612ee1565b509392505050565b600082601f83011261309d5761309c612e2b565b5b81356130ad848260208601613046565b91505092915050565b600080600080608085870312156130d0576130cf612ad6565b5b60006130de87828801612d2c565b94505060206130ef87828801612d2c565b935050604061310087828801612c77565b925050606085013567ffffffffffffffff81111561312157613120612adb565b5b61312d87828801613088565b91505092959194509250565b600080604083850312156131505761314f612ad6565b5b600061315e85828601612d2c565b925050602061316f85828601612d2c565b9150509250929050565b600067ffffffffffffffff82111561319457613193612e35565b5b602082029050602081019050919050565b600080fd5b60006131bd6131b884613179565b612e95565b905080838252602082019050602084028301858111156131e0576131df6131a5565b5b835b8181101561320957806131f58882612c77565b8452602084019350506020810190506131e2565b5050509392505050565b600082601f83011261322857613227612e2b565b5b81356132388482602086016131aa565b91505092915050565b6000806040838503121561325857613257612ad6565b5b600061326685828601612c77565b925050602083013567ffffffffffffffff81111561328757613286612adb565b5b61329385828601613213565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806132e457607f821691505b602082108114156132f8576132f761329d565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613334602083612ba6565b915061333f826132fe565b602082019050919050565b6000602082019050818103600083015261336381613327565b9050919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006133c6602c83612ba6565b91506133d18261336a565b604082019050919050565b600060208201905081810360008301526133f5816133b9565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613458602183612ba6565b9150613463826133fc565b604082019050919050565b600060208201905081810360008301526134878161344b565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006134ea603883612ba6565b91506134f58261348e565b604082019050919050565b60006020820190508181036000830152613519816134dd565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061357c603183612ba6565b915061358782613520565b604082019050919050565b600060208201905081810360008301526135ab8161356f565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061360e602b83612ba6565b9150613619826135b2565b604082019050919050565b6000602082019050818103600083015261363d81613601565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006136a0602c83612ba6565b91506136ab82613644565b604082019050919050565b600060208201905081810360008301526136cf81613693565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613761602983612ba6565b915061376c82613705565b604082019050919050565b6000602082019050818103600083015261379081613754565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006137f3602a83612ba6565b91506137fe82613797565b604082019050919050565b60006020820190508181036000830152613822816137e6565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061385f601983612ba6565b915061386a82613829565b602082019050919050565b6000602082019050818103600083015261388e81613852565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006138f1602f83612ba6565b91506138fc82613895565b604082019050919050565b60006020820190508181036000830152613920816138e4565b9050919050565b600081905092915050565b600061393d82612b9b565b6139478185613927565b9350613957818560208601612bb7565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613999600583613927565b91506139a482613963565b600582019050919050565b60006139bb8285613932565b91506139c78284613932565b91506139d28261398c565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613a3a602683612ba6565b9150613a45826139de565b604082019050919050565b60006020820190508181036000830152613a6981613a2d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613aaa82612c56565b9150613ab583612c56565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613aea57613ae9613a70565b5b828201905092915050565b7f4552524f523a206d6178206c696d697420726561636865640000000000000000600082015250565b6000613b2b601883612ba6565b9150613b3682613af5565b602082019050919050565b60006020820190508181036000830152613b5a81613b1e565b9050919050565b7f4552524f523a206d6178203130206d696e7420706572207472616e736163746960008201527f6f6e000000000000000000000000000000000000000000000000000000000000602082015250565b6000613bbd602283612ba6565b9150613bc882613b61565b604082019050919050565b60006020820190508181036000830152613bec81613bb0565b9050919050565b7f4552524f523a2077726f6e6720746f6b656e204944206f7220636f756e740000600082015250565b6000613c29601e83612ba6565b9150613c3482613bf3565b602082019050919050565b60006020820190508181036000830152613c5881613c1c565b9050919050565b7f4552524f523a206e6f74206f6e2073616c650000000000000000000000000000600082015250565b6000613c95601283612ba6565b9150613ca082613c5f565b602082019050919050565b60006020820190508181036000830152613cc481613c88565b9050919050565b600081519050613cda81612c60565b92915050565b600060208284031215613cf657613cf5612ad6565b5b6000613d0484828501613ccb565b91505092915050565b7f4552524f523a206e6f7420656e6f756768204d656d62657273686970546f6b6560008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d69602183612ba6565b9150613d7482613d0d565b604082019050919050565b60006020820190508181036000830152613d9881613d5c565b9050919050565b600081519050613dae81612d15565b92915050565b600060208284031215613dca57613dc9612ad6565b5b6000613dd884828501613d9f565b91505092915050565b7f4552524f523a207520646f6e27742068617665207468697320746f6b656e204960008201527f4400000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e3d602183612ba6565b9150613e4882613de1565b604082019050919050565b60006020820190508181036000830152613e6c81613e30565b9050919050565b7f4552524f523a2074686973204d656d6265727368697020546f6b656e2069732060008201527f616c726561647920757365640000000000000000000000000000000000000000602082015250565b6000613ecf602c83612ba6565b9150613eda82613e73565b604082019050919050565b60006020820190508181036000830152613efe81613ec2565b9050919050565b6000613f1082612c56565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f4357613f42613a70565b5b600182019050919050565b6000604082019050613f636000830185612d81565b613f706020830184612d81565b9392505050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613fd3602c83612ba6565b9150613fde82613f77565b604082019050919050565b6000602082019050818103600083015261400281613fc6565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614065602983612ba6565b915061407082614009565b604082019050919050565b6000602082019050818103600083015261409481614058565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006140f7602483612ba6565b91506141028261409b565b604082019050919050565b60006020820190508181036000830152614126816140ea565b9050919050565b600061413882612c56565b915061414383612c56565b92508282101561415657614155613a70565b5b828203905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006141bd603283612ba6565b91506141c882614161565b604082019050919050565b600060208201905081810360008301526141ec816141b0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061422d82612c56565b915061423883612c56565b925082614248576142476141f3565b5b828204905092915050565b600061425e82612c56565b915061426983612c56565b925082614279576142786141f3565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006142ab82614284565b6142b5818561428f565b93506142c5818560208601612bb7565b6142ce81612bea565b840191505092915050565b60006080820190506142ee6000830187612ceb565b6142fb6020830186612ceb565b6143086040830185612d81565b818103606083015261431a81846142a0565b905095945050505050565b60008151905061433481612b0c565b92915050565b6000602082840312156143505761434f612ad6565b5b600061435e84828501614325565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006143cc602083612ba6565b91506143d782614396565b602082019050919050565b600060208201905081810360008301526143fb816143bf565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614438601c83612ba6565b915061444382614402565b602082019050919050565b600060208201905081810360008301526144678161442b565b905091905056fea264697066735822122017f9e67d5b998bad0520f2cca8beac8d19d6af581233001aedd15fe73f7d423164736f6c634300080a003368747470733a2f2f697066732e696f2f697066732f516d5238716f7334616e4e424c36714545584d555836744d6e7a376d7256753771453677454b64545463373659732f00000000000000000000000083b7261db8c795701c6fc86d1fcd073ece940e10

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101c45760003560e01c8063715018a6116100f9578063a8b3820511610097578063d5abeb0111610071578063d5abeb01146104df578063e985e9c5146104fd578063f2fde38b1461052d578063f82c086514610549576101c4565b8063a8b3820514610475578063b88d4fde14610493578063c87b56dd146104af576101c4565b806395d89b41116100d357806395d89b411461040357806396cf522714610421578063a20e08ca1461043d578063a22cb46514610459576101c4565b8063715018a6146103d1578063884e53ad146103db5780638da5cb5b146103e5576101c4565b80632f745c59116101665780636352211e116101405780636352211e14610323578063635a25c2146103535780636ad1fe021461038357806370a08231146103a1576101c4565b80632f745c59146102a757806342842e0e146102d75780634f6ccce7146102f3576101c4565b8063081812fc116101a2578063081812fc14610221578063095ea7b31461025157806318160ddd1461026d57806323b872dd1461028b576101c4565b806301ffc9a7146101c957806306fdde03146101f957806307c60dac14610217575b600080fd5b6101e360048036038101906101de9190612b38565b610565565b6040516101f09190612b80565b60405180910390f35b6102016105df565b60405161020e9190612c34565b60405180910390f35b61021f610671565b005b61023b60048036038101906102369190612c8c565b610725565b6040516102489190612cfa565b60405180910390f35b61026b60048036038101906102669190612d41565b6107aa565b005b6102756108c2565b6040516102829190612d90565b60405180910390f35b6102a560048036038101906102a09190612dab565b6108cf565b005b6102c160048036038101906102bc9190612d41565b61092f565b6040516102ce9190612d90565b60405180910390f35b6102f160048036038101906102ec9190612dab565b6109d4565b005b61030d60048036038101906103089190612c8c565b6109f4565b60405161031a9190612d90565b60405180910390f35b61033d60048036038101906103389190612c8c565b610a65565b60405161034a9190612cfa565b60405180910390f35b61036d60048036038101906103689190612c8c565b610b17565b60405161037a9190612d90565b60405180910390f35b61038b610b2f565b6040516103989190612b80565b60405180910390f35b6103bb60048036038101906103b69190612dfe565b610b42565b6040516103c89190612d90565b60405180910390f35b6103d9610bfa565b005b6103e3610d52565b005b6103ed610e06565b6040516103fa9190612cfa565b60405180910390f35b61040b610e30565b6040516104189190612c34565b60405180910390f35b61043b60048036038101906104369190612c8c565b610ec2565b005b61045760048036038101906104529190612f60565b610f63565b005b610473600480360381019061046e9190612fd5565b611014565b005b61047d611195565b60405161048a9190612d90565b60405180910390f35b6104ad60048036038101906104a891906130b6565b61119b565b005b6104c960048036038101906104c49190612c8c565b6111fd565b6040516104d69190612c34565b60405180910390f35b6104e76112a4565b6040516104f49190612d90565b60405180910390f35b61051760048036038101906105129190613139565b6112aa565b6040516105249190612b80565b60405180910390f35b61054760048036038101906105429190612dfe565b61133e565b005b610563600480360381019061055e9190613241565b611505565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105d857506105d7826119f5565b5b9050919050565b6060600080546105ee906132cc565b80601f016020809104026020016040519081016040528092919081815260200182805461061a906132cc565b80156106675780601f1061063c57610100808354040283529160200191610667565b820191906000526020600020905b81548152906001019060200180831161064a57829003601f168201915b5050505050905090565b610679611ad7565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ff9061334a565b60405180910390fd5b6000601060006101000a81548160ff021916908315150217905550565b600061073082611adf565b61076f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610766906133dc565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107b582610a65565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081d9061346e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610845611ad7565b73ffffffffffffffffffffffffffffffffffffffff16148061087457506108738161086e611ad7565b6112aa565b5b6108b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108aa90613500565b60405180910390fd5b6108bd8383611b4b565b505050565b6000600980549050905090565b6108e06108da611ad7565b82611c04565b61091f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091690613592565b60405180910390fd5b61092a838383611ce2565b505050565b600061093a83610b42565b821061097b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097290613624565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109ef8383836040518060200160405280600081525061119b565b505050565b60006109fe6108c2565b8210610a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a36906136b6565b60405180910390fd5b60098281548110610a5357610a526136d6565b5b90600052602060002001549050919050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0590613777565b60405180910390fd5b80915050919050565b60116020528060005260406000206000915090505481565b601060009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610baa90613809565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c02611ad7565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c889061334a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b610d5a611ad7565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de09061334a565b60405180910390fd5b6001601060006101000a81548160ff021916908315150217905550565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e3f906132cc565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6b906132cc565b8015610eb85780601f10610e8d57610100808354040283529160200191610eb8565b820191906000526020600020905b815481529060010190602001808311610e9b57829003601f168201915b5050505050905090565b610eca611ad7565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f509061334a565b60405180910390fd5b80600f8190555050565b610f6b611ad7565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff19061334a565b60405180910390fd5b8060029080519060200190611010929190612a29565b5050565b61101c611ad7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561108a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108190613875565b60405180910390fd5b8060066000611097611ad7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611144611ad7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111899190612b80565b60405180910390a35050565b600f5481565b6111ac6111a6611ad7565b83611c04565b6111eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e290613592565b60405180910390fd5b6111f784848484611f3e565b50505050565b606061120882611adf565b611247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123e90613907565b60405180910390fd5b6000611251611f9a565b90506000815111611271576040518060200160405280600081525061129c565b8061127b8461202c565b60405160200161128c9291906139af565b6040516020818303038152906040525b915050919050565b600e5481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611346611ad7565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cc9061334a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c90613a50565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e54826115116108c2565b61151b9190613a9f565b111561155c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155390613b41565b60405180910390fd5b600a821115801561156f5750600a815111155b6115ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a590613bd3565b60405180910390fd5b805182146115f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e890613c3f565b60405180910390fd5b601060009054906101000a900460ff16611640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163790613cab565b60405180910390fd5b600f5442101561191257600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016116a59190612cfa565b602060405180830381865afa1580156116c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e69190613ce0565b821115611728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171f90613d7f565b60405180910390fd5b60005b815181101561191057600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e838381518110611785576117846136d6565b5b60200260200101516040518263ffffffff1660e01b81526004016117a99190612d90565b602060405180830381865afa1580156117c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ea9190613db4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184e90613e53565b60405180910390fd5b6000601160008484815181106118705761186f6136d6565b5b6020026020010151815260200190815260200160002054146118fd5742601160008484815181106118a4576118a36136d6565b5b602002602001015181526020019081526020016000205411156118fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f390613ee5565b60405180910390fd5b5b808061190890613f05565b91505061172b565b505b60005b828110156119f057611927600d61218d565b6000611933600d6121a3565b905061193e816121b1565b600f5460116000858581518110611958576119576136d6565b5b60200260200101518152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167f6cde4ed53ecc43e1126a8b2b9e8ad2f4ec18d9f7834636ed981cfa61960be370828585815181106119be576119bd6136d6565b5b60200260200101516040516119d4929190613f4e565b60405180910390a25080806119e890613f05565b915050611915565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ac057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ad05750611acf826121be565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611bbe83610a65565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c0f82611adf565b611c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4590613fe9565b60405180910390fd5b6000611c5983610a65565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611cc857508373ffffffffffffffffffffffffffffffffffffffff16611cb084610725565b73ffffffffffffffffffffffffffffffffffffffff16145b80611cd95750611cd881856112aa565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d0282610a65565b73ffffffffffffffffffffffffffffffffffffffff1614611d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4f9061407b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbf9061410d565b60405180910390fd5b611dd3838383612228565b611dde600082611b4b565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e2e919061412d565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e859190613a9f565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611f49848484611ce2565b611f558484848461233c565b611f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8b906141d3565b60405180910390fd5b50505050565b606060028054611fa9906132cc565b80601f0160208091040260200160405190810160405280929190818152602001828054611fd5906132cc565b80156120225780601f10611ff757610100808354040283529160200191612022565b820191906000526020600020905b81548152906001019060200180831161200557829003601f168201915b5050505050905090565b60606000821415612074576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612188565b600082905060005b600082146120a657808061208f90613f05565b915050600a8261209f9190614222565b915061207c565b60008167ffffffffffffffff8111156120c2576120c1612e35565b5b6040519080825280601f01601f1916602001820160405280156120f45781602001600182028036833780820191505090505b5090505b600085146121815760018261210d919061412d565b9150600a8561211c9190614253565b60306121289190613a9f565b60f81b81838151811061213e5761213d6136d6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561217a9190614222565b94506120f8565b8093505050505b919050565b6001816000016000828254019250508190555050565b600081600001549050919050565b6121bb33826124c4565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6122338383836124e2565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561227657612271816124e7565b6122b5565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146122b4576122b38382612530565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122f8576122f38161269d565b612337565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461233657612335828261276e565b5b5b505050565b600061235d8473ffffffffffffffffffffffffffffffffffffffff166127ed565b156124b7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612386611ad7565b8786866040518563ffffffff1660e01b81526004016123a894939291906142d9565b6020604051808303816000875af19250505080156123e457506040513d601f19601f820116820180604052508101906123e1919061433a565b60015b612467573d8060008114612414576040519150601f19603f3d011682016040523d82523d6000602084013e612419565b606091505b5060008151141561245f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612456906141d3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124bc565b600190505b949350505050565b6124de828260405180602001604052806000815250612800565b5050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161253d84610b42565b612547919061412d565b905060006008600084815260200190815260200160002054905081811461262c576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506126b1919061412d565b90506000600a60008481526020019081526020016000205490506000600983815481106126e1576126e06136d6565b5b906000526020600020015490508060098381548110612703576127026136d6565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061275257612751614367565b5b6001900381819060005260206000200160009055905550505050565b600061277983610b42565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b61280a838361285b565b612817600084848461233c565b612856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284d906141d3565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c2906143e2565b60405180910390fd5b6128d481611adf565b15612914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290b9061444e565b60405180910390fd5b61292060008383612228565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129709190613a9f565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612a35906132cc565b90600052602060002090601f016020900481019282612a575760008555612a9e565b82601f10612a7057805160ff1916838001178555612a9e565b82800160010185558215612a9e579182015b82811115612a9d578251825591602001919060010190612a82565b5b509050612aab9190612aaf565b5090565b5b80821115612ac8576000816000905550600101612ab0565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b1581612ae0565b8114612b2057600080fd5b50565b600081359050612b3281612b0c565b92915050565b600060208284031215612b4e57612b4d612ad6565b5b6000612b5c84828501612b23565b91505092915050565b60008115159050919050565b612b7a81612b65565b82525050565b6000602082019050612b956000830184612b71565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612bd5578082015181840152602081019050612bba565b83811115612be4576000848401525b50505050565b6000601f19601f8301169050919050565b6000612c0682612b9b565b612c108185612ba6565b9350612c20818560208601612bb7565b612c2981612bea565b840191505092915050565b60006020820190508181036000830152612c4e8184612bfb565b905092915050565b6000819050919050565b612c6981612c56565b8114612c7457600080fd5b50565b600081359050612c8681612c60565b92915050565b600060208284031215612ca257612ca1612ad6565b5b6000612cb084828501612c77565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ce482612cb9565b9050919050565b612cf481612cd9565b82525050565b6000602082019050612d0f6000830184612ceb565b92915050565b612d1e81612cd9565b8114612d2957600080fd5b50565b600081359050612d3b81612d15565b92915050565b60008060408385031215612d5857612d57612ad6565b5b6000612d6685828601612d2c565b9250506020612d7785828601612c77565b9150509250929050565b612d8a81612c56565b82525050565b6000602082019050612da56000830184612d81565b92915050565b600080600060608486031215612dc457612dc3612ad6565b5b6000612dd286828701612d2c565b9350506020612de386828701612d2c565b9250506040612df486828701612c77565b9150509250925092565b600060208284031215612e1457612e13612ad6565b5b6000612e2284828501612d2c565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612e6d82612bea565b810181811067ffffffffffffffff82111715612e8c57612e8b612e35565b5b80604052505050565b6000612e9f612acc565b9050612eab8282612e64565b919050565b600067ffffffffffffffff821115612ecb57612eca612e35565b5b612ed482612bea565b9050602081019050919050565b82818337600083830152505050565b6000612f03612efe84612eb0565b612e95565b905082815260208101848484011115612f1f57612f1e612e30565b5b612f2a848285612ee1565b509392505050565b600082601f830112612f4757612f46612e2b565b5b8135612f57848260208601612ef0565b91505092915050565b600060208284031215612f7657612f75612ad6565b5b600082013567ffffffffffffffff811115612f9457612f93612adb565b5b612fa084828501612f32565b91505092915050565b612fb281612b65565b8114612fbd57600080fd5b50565b600081359050612fcf81612fa9565b92915050565b60008060408385031215612fec57612feb612ad6565b5b6000612ffa85828601612d2c565b925050602061300b85828601612fc0565b9150509250929050565b600067ffffffffffffffff8211156130305761302f612e35565b5b61303982612bea565b9050602081019050919050565b600061305961305484613015565b612e95565b90508281526020810184848401111561307557613074612e30565b5b613080848285612ee1565b509392505050565b600082601f83011261309d5761309c612e2b565b5b81356130ad848260208601613046565b91505092915050565b600080600080608085870312156130d0576130cf612ad6565b5b60006130de87828801612d2c565b94505060206130ef87828801612d2c565b935050604061310087828801612c77565b925050606085013567ffffffffffffffff81111561312157613120612adb565b5b61312d87828801613088565b91505092959194509250565b600080604083850312156131505761314f612ad6565b5b600061315e85828601612d2c565b925050602061316f85828601612d2c565b9150509250929050565b600067ffffffffffffffff82111561319457613193612e35565b5b602082029050602081019050919050565b600080fd5b60006131bd6131b884613179565b612e95565b905080838252602082019050602084028301858111156131e0576131df6131a5565b5b835b8181101561320957806131f58882612c77565b8452602084019350506020810190506131e2565b5050509392505050565b600082601f83011261322857613227612e2b565b5b81356132388482602086016131aa565b91505092915050565b6000806040838503121561325857613257612ad6565b5b600061326685828601612c77565b925050602083013567ffffffffffffffff81111561328757613286612adb565b5b61329385828601613213565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806132e457607f821691505b602082108114156132f8576132f761329d565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613334602083612ba6565b915061333f826132fe565b602082019050919050565b6000602082019050818103600083015261336381613327565b9050919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006133c6602c83612ba6565b91506133d18261336a565b604082019050919050565b600060208201905081810360008301526133f5816133b9565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613458602183612ba6565b9150613463826133fc565b604082019050919050565b600060208201905081810360008301526134878161344b565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006134ea603883612ba6565b91506134f58261348e565b604082019050919050565b60006020820190508181036000830152613519816134dd565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061357c603183612ba6565b915061358782613520565b604082019050919050565b600060208201905081810360008301526135ab8161356f565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061360e602b83612ba6565b9150613619826135b2565b604082019050919050565b6000602082019050818103600083015261363d81613601565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006136a0602c83612ba6565b91506136ab82613644565b604082019050919050565b600060208201905081810360008301526136cf81613693565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613761602983612ba6565b915061376c82613705565b604082019050919050565b6000602082019050818103600083015261379081613754565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006137f3602a83612ba6565b91506137fe82613797565b604082019050919050565b60006020820190508181036000830152613822816137e6565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061385f601983612ba6565b915061386a82613829565b602082019050919050565b6000602082019050818103600083015261388e81613852565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006138f1602f83612ba6565b91506138fc82613895565b604082019050919050565b60006020820190508181036000830152613920816138e4565b9050919050565b600081905092915050565b600061393d82612b9b565b6139478185613927565b9350613957818560208601612bb7565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613999600583613927565b91506139a482613963565b600582019050919050565b60006139bb8285613932565b91506139c78284613932565b91506139d28261398c565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613a3a602683612ba6565b9150613a45826139de565b604082019050919050565b60006020820190508181036000830152613a6981613a2d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613aaa82612c56565b9150613ab583612c56565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613aea57613ae9613a70565b5b828201905092915050565b7f4552524f523a206d6178206c696d697420726561636865640000000000000000600082015250565b6000613b2b601883612ba6565b9150613b3682613af5565b602082019050919050565b60006020820190508181036000830152613b5a81613b1e565b9050919050565b7f4552524f523a206d6178203130206d696e7420706572207472616e736163746960008201527f6f6e000000000000000000000000000000000000000000000000000000000000602082015250565b6000613bbd602283612ba6565b9150613bc882613b61565b604082019050919050565b60006020820190508181036000830152613bec81613bb0565b9050919050565b7f4552524f523a2077726f6e6720746f6b656e204944206f7220636f756e740000600082015250565b6000613c29601e83612ba6565b9150613c3482613bf3565b602082019050919050565b60006020820190508181036000830152613c5881613c1c565b9050919050565b7f4552524f523a206e6f74206f6e2073616c650000000000000000000000000000600082015250565b6000613c95601283612ba6565b9150613ca082613c5f565b602082019050919050565b60006020820190508181036000830152613cc481613c88565b9050919050565b600081519050613cda81612c60565b92915050565b600060208284031215613cf657613cf5612ad6565b5b6000613d0484828501613ccb565b91505092915050565b7f4552524f523a206e6f7420656e6f756768204d656d62657273686970546f6b6560008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d69602183612ba6565b9150613d7482613d0d565b604082019050919050565b60006020820190508181036000830152613d9881613d5c565b9050919050565b600081519050613dae81612d15565b92915050565b600060208284031215613dca57613dc9612ad6565b5b6000613dd884828501613d9f565b91505092915050565b7f4552524f523a207520646f6e27742068617665207468697320746f6b656e204960008201527f4400000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e3d602183612ba6565b9150613e4882613de1565b604082019050919050565b60006020820190508181036000830152613e6c81613e30565b9050919050565b7f4552524f523a2074686973204d656d6265727368697020546f6b656e2069732060008201527f616c726561647920757365640000000000000000000000000000000000000000602082015250565b6000613ecf602c83612ba6565b9150613eda82613e73565b604082019050919050565b60006020820190508181036000830152613efe81613ec2565b9050919050565b6000613f1082612c56565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f4357613f42613a70565b5b600182019050919050565b6000604082019050613f636000830185612d81565b613f706020830184612d81565b9392505050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613fd3602c83612ba6565b9150613fde82613f77565b604082019050919050565b6000602082019050818103600083015261400281613fc6565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614065602983612ba6565b915061407082614009565b604082019050919050565b6000602082019050818103600083015261409481614058565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006140f7602483612ba6565b91506141028261409b565b604082019050919050565b60006020820190508181036000830152614126816140ea565b9050919050565b600061413882612c56565b915061414383612c56565b92508282101561415657614155613a70565b5b828203905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006141bd603283612ba6565b91506141c882614161565b604082019050919050565b600060208201905081810360008301526141ec816141b0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061422d82612c56565b915061423883612c56565b925082614248576142476141f3565b5b828204905092915050565b600061425e82612c56565b915061426983612c56565b925082614279576142786141f3565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006142ab82614284565b6142b5818561428f565b93506142c5818560208601612bb7565b6142ce81612bea565b840191505092915050565b60006080820190506142ee6000830187612ceb565b6142fb6020830186612ceb565b6143086040830185612d81565b818103606083015261431a81846142a0565b905095945050505050565b60008151905061433481612b0c565b92915050565b6000602082840312156143505761434f612ad6565b5b600061435e84828501614325565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006143cc602083612ba6565b91506143d782614396565b602082019050919050565b600060208201905081810360008301526143fb816143bf565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614438601c83612ba6565b915061444382614402565b602082019050919050565b600060208201905081810360008301526144678161442b565b905091905056fea264697066735822122017f9e67d5b998bad0520f2cca8beac8d19d6af581233001aedd15fe73f7d423164736f6c634300080a0033

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

00000000000000000000000083b7261db8c795701c6fc86d1fcd073ece940e10

-----Decoded View---------------
Arg [0] : _tokenAddress (address): 0x83b7261DB8c795701C6fc86D1fcd073ece940E10

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000083b7261db8c795701c6fc86d1fcd073ece940e10


Deployed Bytecode Sourcemap

42593:2509:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35115:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20819:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44829:68;;;:::i;:::-;;22318:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21855:397;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35755:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23208:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35423:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23584:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35945:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20513:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42890:54;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42860:16;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20243:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32867:148;;;:::i;:::-;;44752:69;;;:::i;:::-;;32225:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20988:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44905:97;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44641:102;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22611:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42828:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23806:285;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21408:380;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42797:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22977:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33170:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43400:1233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35115:224;35217:4;35256:35;35241:50;;;:11;:50;;;;:90;;;;35295:36;35319:11;35295:23;:36::i;:::-;35241:90;35234:97;;35115:224;;;:::o;20819:100::-;20873:13;20906:5;20899:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20819:100;:::o;44829:68::-;32447:12;:10;:12::i;:::-;32437:22;;:6;;;;;;;;;;;:22;;;32429:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;44884:5:::1;44877:4;;:12;;;;;;;;;;;;;;;;;;44829:68::o:0;22318:221::-;22394:7;22422:16;22430:7;22422;:16::i;:::-;22414:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22507:15;:24;22523:7;22507:24;;;;;;;;;;;;;;;;;;;;;22500:31;;22318:221;;;:::o;21855:397::-;21936:13;21952:23;21967:7;21952:14;:23::i;:::-;21936:39;;22000:5;21994:11;;:2;:11;;;;21986:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22080:5;22064:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22089:37;22106:5;22113:12;:10;:12::i;:::-;22089:16;:37::i;:::-;22064:62;22056:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;22223:21;22232:2;22236:7;22223:8;:21::i;:::-;21925:327;21855:397;;:::o;35755:113::-;35816:7;35843:10;:17;;;;35836:24;;35755:113;:::o;23208:305::-;23369:41;23388:12;:10;:12::i;:::-;23402:7;23369:18;:41::i;:::-;23361:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23477:28;23487:4;23493:2;23497:7;23477:9;:28::i;:::-;23208:305;;;:::o;35423:256::-;35520:7;35556:23;35573:5;35556:16;:23::i;:::-;35548:5;:31;35540:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35645:12;:19;35658:5;35645:19;;;;;;;;;;;;;;;:26;35665:5;35645:26;;;;;;;;;;;;35638:33;;35423:256;;;;:::o;23584:151::-;23688:39;23705:4;23711:2;23715:7;23688:39;;;;;;;;;;;;:16;:39::i;:::-;23584:151;;;:::o;35945:233::-;36020:7;36056:30;:28;:30::i;:::-;36048:5;:38;36040:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;36153:10;36164:5;36153:17;;;;;;;;:::i;:::-;;;;;;;;;;36146:24;;35945:233;;;:::o;20513:239::-;20585:7;20605:13;20621:7;:16;20629:7;20621:16;;;;;;;;;;;;;;;;;;;;;20605:32;;20673:1;20656:19;;:5;:19;;;;20648:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20739:5;20732:12;;;20513:239;;;:::o;42890:54::-;;;;;;;;;;;;;;;;;:::o;42860:16::-;;;;;;;;;;;;;:::o;20243:208::-;20315:7;20360:1;20343:19;;:5;:19;;;;20335:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20427:9;:16;20437:5;20427:16;;;;;;;;;;;;;;;;20420:23;;20243:208;;;:::o;32867:148::-;32447:12;:10;:12::i;:::-;32437:22;;:6;;;;;;;;;;;:22;;;32429:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;32974:1:::1;32937:40;;32958:6;;;;;;;;;;;32937:40;;;;;;;;;;;;33005:1;32988:6;;:19;;;;;;;;;;;;;;;;;;32867:148::o:0;44752:69::-;32447:12;:10;:12::i;:::-;32437:22;;:6;;;;;;;;;;;:22;;;32429:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;44809:4:::1;44802;;:11;;;;;;;;;;;;;;;;;;44752:69::o:0;32225:79::-;32263:7;32290:6;;;;;;;;;;;32283:13;;32225:79;:::o;20988:104::-;21044:13;21077:7;21070:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20988:104;:::o;44905:97::-;32447:12;:10;:12::i;:::-;32437:22;;:6;;;;;;;;;;;:22;;;32429:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;44987:7:::1;44974:10;:20;;;;44905:97:::0;:::o;44641:102::-;32447:12;:10;:12::i;:::-;32437:22;;:6;;;;;;;;;;;:22;;;32429:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;44728:7:::1;44716:9;:19;;;;;;;;;;;;:::i;:::-;;44641:102:::0;:::o;22611:295::-;22726:12;:10;:12::i;:::-;22714:24;;:8;:24;;;;22706:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;22826:8;22781:18;:32;22800:12;:10;:12::i;:::-;22781:32;;;;;;;;;;;;;;;:42;22814:8;22781:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;22879:8;22850:48;;22865:12;:10;:12::i;:::-;22850:48;;;22889:8;22850:48;;;;;;:::i;:::-;;;;;;;;22611:295;;:::o;42828:25::-;;;;:::o;23806:285::-;23938:41;23957:12;:10;:12::i;:::-;23971:7;23938:18;:41::i;:::-;23930:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24044:39;24058:4;24064:2;24068:7;24077:5;24044:13;:39::i;:::-;23806:285;;;;:::o;21408:380::-;21482:13;21516:17;21524:8;21516:7;:17::i;:::-;21508:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;21598:17;21618:10;:8;:10::i;:::-;21598:30;;21679:1;21665:3;21659:17;:21;:121;;;;;;;;;;;;;;;;;21724:3;21729:19;:8;:17;:19::i;:::-;21707:50;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21659:121;21639:141;;;21408:380;;;:::o;42797:24::-;;;;:::o;22977:164::-;23074:4;23098:18;:25;23117:5;23098:25;;;;;;;;;;;;;;;:35;23124:8;23098:35;;;;;;;;;;;;;;;;;;;;;;;;;23091:42;;22977:164;;;;:::o;33170:244::-;32447:12;:10;:12::i;:::-;32437:22;;:6;;;;;;;;;;;:22;;;32429:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;33279:1:::1;33259:22;;:8;:22;;;;33251:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33369:8;33340:38;;33361:6;;;;;;;;;;;33340:38;;;;;;;;;;;;33398:8;33389:6;;:17;;;;;;;;;;;;;;;;;;33170:244:::0;:::o;43400:1233::-;43509:9;;43499:6;43483:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;43475:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;43575:2;43565:6;:12;;:36;;;;;43599:2;43581:7;:14;:20;;43565:36;43557:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;43668:7;:14;43658:6;:24;43650:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;43735:4;;;;;;;;;;;43727:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;43795:10;;43777:15;:28;43774:500;;;43839:15;;;;;;;;;;;:25;;;43865:10;43839:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43829:6;:47;;43821:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;43932:9;43928:335;43947:7;:14;43945:1;:16;43928:335;;;44008:15;;;;;;;;;;;:23;;;44032:7;44040:1;44032:10;;;;;;;;:::i;:::-;;;;;;;;44008:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43994:49;;:10;:49;;;43986:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;44137:1;44102:19;:31;44122:7;44130:1;44122:10;;;;;;;;:::i;:::-;;;;;;;;44102:31;;;;;;;;;;;;:36;44099:148;;44183:15;44148:19;:31;44168:7;44176:1;44168:10;;;;;;;;:::i;:::-;;;;;;;;44148:31;;;;;;;;;;;;:50;;44140:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;44099:148;43963:3;;;;;:::i;:::-;;;;43928:335;;;;43774:500;44298:9;44294:330;44314:6;44311:1;:9;44294:330;;;44341:21;:9;:19;:21::i;:::-;44377:17;44397:19;:9;:17;:19::i;:::-;44377:39;;44445:18;44453:9;44445:7;:18::i;:::-;44526:10;;44492:19;:31;44512:7;44520:1;44512:10;;;;;;;;:::i;:::-;;;;;;;;44492:31;;;;;;;;;;;:44;;;;44580:10;44570:42;;;44591:9;44601:7;44609:1;44601:10;;;;;;;;:::i;:::-;;;;;;;;44570:42;;;;;;;:::i;:::-;;;;;;;;44326:298;44322:3;;;;;:::i;:::-;;;;44294:330;;;;43400:1233;;:::o;19887:292::-;19989:4;20028:25;20013:40;;;:11;:40;;;;:105;;;;20085:33;20070:48;;;:11;:48;;;;20013:105;:158;;;;20135:36;20159:11;20135:23;:36::i;:::-;20013:158;20006:165;;19887:292;;;:::o;16281:98::-;16334:7;16361:10;16354:17;;16281:98;:::o;25558:127::-;25623:4;25675:1;25647:30;;:7;:16;25655:7;25647:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25640:37;;25558:127;;;:::o;29435:174::-;29537:2;29510:15;:24;29526:7;29510:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29593:7;29589:2;29555:46;;29564:23;29579:7;29564:14;:23::i;:::-;29555:46;;;;;;;;;;;;29435:174;;:::o;25852:348::-;25945:4;25970:16;25978:7;25970;:16::i;:::-;25962:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26046:13;26062:23;26077:7;26062:14;:23::i;:::-;26046:39;;26115:5;26104:16;;:7;:16;;;:51;;;;26148:7;26124:31;;:20;26136:7;26124:11;:20::i;:::-;:31;;;26104:51;:87;;;;26159:32;26176:5;26183:7;26159:16;:32::i;:::-;26104:87;26096:96;;;25852:348;;;;:::o;28773:544::-;28898:4;28871:31;;:23;28886:7;28871:14;:23::i;:::-;:31;;;28863:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;28981:1;28967:16;;:2;:16;;;;28959:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29037:39;29058:4;29064:2;29068:7;29037:20;:39::i;:::-;29141:29;29158:1;29162:7;29141:8;:29::i;:::-;29202:1;29183:9;:15;29193:4;29183:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29231:1;29214:9;:13;29224:2;29214:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29262:2;29243:7;:16;29251:7;29243:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29301:7;29297:2;29282:27;;29291:4;29282:27;;;;;;;;;;;;28773:544;;;:::o;24973:272::-;25087:28;25097:4;25103:2;25107:7;25087:9;:28::i;:::-;25134:48;25157:4;25163:2;25167:7;25176:5;25134:22;:48::i;:::-;25126:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;24973:272;;;;:::o;21243:94::-;21287:13;21320:9;21313:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21243:94;:::o;16853:723::-;16909:13;17139:1;17130:5;:10;17126:53;;;17157:10;;;;;;;;;;;;;;;;;;;;;17126:53;17189:12;17204:5;17189:20;;17220:14;17245:78;17260:1;17252:4;:9;17245:78;;17278:8;;;;;:::i;:::-;;;;17309:2;17301:10;;;;;:::i;:::-;;;17245:78;;;17333:19;17365:6;17355:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17333:39;;17383:154;17399:1;17390:5;:10;17383:154;;17427:1;17417:11;;;;;:::i;:::-;;;17494:2;17486:5;:10;;;;:::i;:::-;17473:2;:24;;;;:::i;:::-;17460:39;;17443:6;17450;17443:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17523:2;17514:11;;;;;:::i;:::-;;;17383:154;;;17561:6;17547:21;;;;;16853:723;;;;:::o;42118:127::-;42225:1;42207:7;:14;;;:19;;;;;;;;;;;42118:127;:::o;41996:114::-;42061:7;42088;:14;;;42081:21;;41996:114;;;:::o;45010:83::-;45060:25;45070:10;45081:3;45060:9;:25::i;:::-;45010:83;:::o;1581:157::-;1666:4;1705:25;1690:40;;;:11;:40;;;;1683:47;;1581:157;;;:::o;36791:589::-;36935:45;36962:4;36968:2;36972:7;36935:26;:45::i;:::-;37013:1;36997:18;;:4;:18;;;36993:187;;;37032:40;37064:7;37032:31;:40::i;:::-;36993:187;;;37102:2;37094:10;;:4;:10;;;37090:90;;37121:47;37154:4;37160:7;37121:32;:47::i;:::-;37090:90;36993:187;37208:1;37194:16;;:2;:16;;;37190:183;;;37227:45;37264:7;37227:36;:45::i;:::-;37190:183;;;37300:4;37294:10;;:2;:10;;;37290:83;;37321:40;37349:2;37353:7;37321:27;:40::i;:::-;37290:83;37190:183;36791:589;;;:::o;30174:843::-;30295:4;30321:15;:2;:13;;;:15::i;:::-;30317:693;;;30373:2;30357:36;;;30394:12;:10;:12::i;:::-;30408:4;30414:7;30423:5;30357:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30353:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30620:1;30603:6;:13;:18;30599:341;;;30646:60;;;;;;;;;;:::i;:::-;;;;;;;;30599:341;30890:6;30884:13;30875:6;30871:2;30867:15;30860:38;30353:602;30490:45;;;30480:55;;;:6;:55;;;;30473:62;;;;;30317:693;30994:4;30987:11;;30174:843;;;;;;;:::o;26542:110::-;26618:26;26628:2;26632:7;26618:26;;;;;;;;;;;;:9;:26::i;:::-;26542:110;;:::o;31630:93::-;;;;:::o;38103:164::-;38207:10;:17;;;;38180:15;:24;38196:7;38180:24;;;;;;;;;;;:44;;;;38235:10;38251:7;38235:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38103:164;:::o;38894:988::-;39160:22;39210:1;39185:22;39202:4;39185:16;:22::i;:::-;:26;;;;:::i;:::-;39160:51;;39222:18;39243:17;:26;39261:7;39243:26;;;;;;;;;;;;39222:47;;39390:14;39376:10;:28;39372:328;;39421:19;39443:12;:18;39456:4;39443:18;;;;;;;;;;;;;;;:34;39462:14;39443:34;;;;;;;;;;;;39421:56;;39527:11;39494:12;:18;39507:4;39494:18;;;;;;;;;;;;;;;:30;39513:10;39494:30;;;;;;;;;;;:44;;;;39644:10;39611:17;:30;39629:11;39611:30;;;;;;;;;;;:43;;;;39406:294;39372:328;39796:17;:26;39814:7;39796:26;;;;;;;;;;;39789:33;;;39840:12;:18;39853:4;39840:18;;;;;;;;;;;;;;;:34;39859:14;39840:34;;;;;;;;;;;39833:41;;;38975:907;;38894:988;;:::o;40177:1079::-;40430:22;40475:1;40455:10;:17;;;;:21;;;;:::i;:::-;40430:46;;40487:18;40508:15;:24;40524:7;40508:24;;;;;;;;;;;;40487:45;;40859:19;40881:10;40892:14;40881:26;;;;;;;;:::i;:::-;;;;;;;;;;40859:48;;40945:11;40920:10;40931;40920:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;41056:10;41025:15;:28;41041:11;41025:28;;;;;;;;;;;:41;;;;41197:15;:24;41213:7;41197:24;;;;;;;;;;;41190:31;;;41232:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40248:1008;;;40177:1079;:::o;37681:221::-;37766:14;37783:20;37800:2;37783:16;:20::i;:::-;37766:37;;37841:7;37814:12;:16;37827:2;37814:16;;;;;;;;;;;;;;;:24;37831:6;37814:24;;;;;;;;;;;:34;;;;37888:6;37859:17;:26;37877:7;37859:26;;;;;;;;;;;:35;;;;37755:147;37681:221;;:::o;8481:422::-;8541:4;8749:12;8860:7;8848:20;8840:28;;8894:1;8887:4;:8;8880:15;;;8481:422;;;:::o;26879:250::-;26975:18;26981:2;26985:7;26975:5;:18::i;:::-;27012:54;27043:1;27047:2;27051:7;27060:5;27012:22;:54::i;:::-;27004:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;26879:250;;;:::o;27465:382::-;27559:1;27545:16;;:2;:16;;;;27537:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27618:16;27626:7;27618;:16::i;:::-;27617:17;27609:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27680:45;27709:1;27713:2;27717:7;27680:20;:45::i;:::-;27755:1;27738:9;:13;27748:2;27738:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;27786:2;27767:7;:16;27775:7;27767:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;27831:7;27827:2;27806:33;;27823:1;27806:33;;;;;;;;;;;;27465:382;;:::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:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::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:329::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:119;;;6029:79;;:::i;:::-;5991:119;6149:1;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6120:117;5915:329;;;;:::o;6250:117::-;6359:1;6356;6349:12;6373:117;6482:1;6479;6472:12;6496:180;6544:77;6541:1;6534:88;6641:4;6638:1;6631:15;6665:4;6662:1;6655:15;6682:281;6765:27;6787:4;6765:27;:::i;:::-;6757:6;6753:40;6895:6;6883:10;6880:22;6859:18;6847:10;6844:34;6841:62;6838:88;;;6906:18;;:::i;:::-;6838:88;6946:10;6942:2;6935:22;6725:238;6682:281;;:::o;6969:129::-;7003:6;7030:20;;:::i;:::-;7020:30;;7059:33;7087:4;7079:6;7059:33;:::i;:::-;6969:129;;;:::o;7104:308::-;7166:4;7256:18;7248:6;7245:30;7242:56;;;7278:18;;:::i;:::-;7242:56;7316:29;7338:6;7316:29;:::i;:::-;7308:37;;7400:4;7394;7390:15;7382:23;;7104:308;;;:::o;7418:154::-;7502:6;7497:3;7492;7479:30;7564:1;7555:6;7550:3;7546:16;7539:27;7418:154;;;:::o;7578:412::-;7656:5;7681:66;7697:49;7739:6;7697:49;:::i;:::-;7681:66;:::i;:::-;7672:75;;7770:6;7763:5;7756:21;7808:4;7801:5;7797:16;7846:3;7837:6;7832:3;7828:16;7825:25;7822:112;;;7853:79;;:::i;:::-;7822:112;7943:41;7977:6;7972:3;7967;7943:41;:::i;:::-;7662:328;7578:412;;;;;:::o;8010:340::-;8066:5;8115:3;8108:4;8100:6;8096:17;8092:27;8082:122;;8123:79;;:::i;:::-;8082:122;8240:6;8227:20;8265:79;8340:3;8332:6;8325:4;8317:6;8313:17;8265:79;:::i;:::-;8256:88;;8072:278;8010:340;;;;:::o;8356:509::-;8425:6;8474:2;8462:9;8453:7;8449:23;8445:32;8442:119;;;8480:79;;:::i;:::-;8442:119;8628:1;8617:9;8613:17;8600:31;8658:18;8650:6;8647:30;8644:117;;;8680:79;;:::i;:::-;8644:117;8785:63;8840:7;8831:6;8820:9;8816:22;8785:63;:::i;:::-;8775:73;;8571:287;8356:509;;;;:::o;8871:116::-;8941:21;8956:5;8941:21;:::i;:::-;8934:5;8931:32;8921:60;;8977:1;8974;8967:12;8921:60;8871:116;:::o;8993:133::-;9036:5;9074:6;9061:20;9052:29;;9090:30;9114:5;9090:30;:::i;:::-;8993:133;;;;:::o;9132:468::-;9197:6;9205;9254:2;9242:9;9233:7;9229:23;9225:32;9222:119;;;9260:79;;:::i;:::-;9222:119;9380:1;9405:53;9450:7;9441:6;9430:9;9426:22;9405:53;:::i;:::-;9395:63;;9351:117;9507:2;9533:50;9575:7;9566:6;9555:9;9551:22;9533:50;:::i;:::-;9523:60;;9478:115;9132:468;;;;;:::o;9606:307::-;9667:4;9757:18;9749:6;9746:30;9743:56;;;9779:18;;:::i;:::-;9743:56;9817:29;9839:6;9817:29;:::i;:::-;9809:37;;9901:4;9895;9891:15;9883:23;;9606:307;;;:::o;9919:410::-;9996:5;10021:65;10037:48;10078:6;10037:48;:::i;:::-;10021:65;:::i;:::-;10012:74;;10109:6;10102:5;10095:21;10147:4;10140:5;10136:16;10185:3;10176:6;10171:3;10167:16;10164:25;10161:112;;;10192:79;;:::i;:::-;10161:112;10282:41;10316:6;10311:3;10306;10282:41;:::i;:::-;10002:327;9919:410;;;;;:::o;10348:338::-;10403:5;10452:3;10445:4;10437:6;10433:17;10429:27;10419:122;;10460:79;;:::i;:::-;10419:122;10577:6;10564:20;10602:78;10676:3;10668:6;10661:4;10653:6;10649:17;10602:78;:::i;:::-;10593:87;;10409:277;10348:338;;;;:::o;10692:943::-;10787:6;10795;10803;10811;10860:3;10848:9;10839:7;10835:23;10831:33;10828:120;;;10867:79;;:::i;:::-;10828:120;10987:1;11012:53;11057:7;11048:6;11037:9;11033:22;11012:53;:::i;:::-;11002:63;;10958:117;11114:2;11140:53;11185:7;11176:6;11165:9;11161:22;11140:53;:::i;:::-;11130:63;;11085:118;11242:2;11268:53;11313:7;11304:6;11293:9;11289:22;11268:53;:::i;:::-;11258:63;;11213:118;11398:2;11387:9;11383:18;11370:32;11429:18;11421:6;11418:30;11415:117;;;11451:79;;:::i;:::-;11415:117;11556:62;11610:7;11601:6;11590:9;11586:22;11556:62;:::i;:::-;11546:72;;11341:287;10692:943;;;;;;;:::o;11641:474::-;11709:6;11717;11766:2;11754:9;11745:7;11741:23;11737:32;11734:119;;;11772:79;;:::i;:::-;11734:119;11892:1;11917:53;11962:7;11953:6;11942:9;11938:22;11917:53;:::i;:::-;11907:63;;11863:117;12019:2;12045:53;12090:7;12081:6;12070:9;12066:22;12045:53;:::i;:::-;12035:63;;11990:118;11641:474;;;;;:::o;12121:311::-;12198:4;12288:18;12280:6;12277:30;12274:56;;;12310:18;;:::i;:::-;12274:56;12360:4;12352:6;12348:17;12340:25;;12420:4;12414;12410:15;12402:23;;12121:311;;;:::o;12438:117::-;12547:1;12544;12537:12;12578:710;12674:5;12699:81;12715:64;12772:6;12715:64;:::i;:::-;12699:81;:::i;:::-;12690:90;;12800:5;12829:6;12822:5;12815:21;12863:4;12856:5;12852:16;12845:23;;12916:4;12908:6;12904:17;12896:6;12892:30;12945:3;12937:6;12934:15;12931:122;;;12964:79;;:::i;:::-;12931:122;13079:6;13062:220;13096:6;13091:3;13088:15;13062:220;;;13171:3;13200:37;13233:3;13221:10;13200:37;:::i;:::-;13195:3;13188:50;13267:4;13262:3;13258:14;13251:21;;13138:144;13122:4;13117:3;13113:14;13106:21;;13062:220;;;13066:21;12680:608;;12578:710;;;;;:::o;13311:370::-;13382:5;13431:3;13424:4;13416:6;13412:17;13408:27;13398:122;;13439:79;;:::i;:::-;13398:122;13556:6;13543:20;13581:94;13671:3;13663:6;13656:4;13648:6;13644:17;13581:94;:::i;:::-;13572:103;;13388:293;13311:370;;;;:::o;13687:684::-;13780:6;13788;13837:2;13825:9;13816:7;13812:23;13808:32;13805:119;;;13843:79;;:::i;:::-;13805:119;13963:1;13988:53;14033:7;14024:6;14013:9;14009:22;13988:53;:::i;:::-;13978:63;;13934:117;14118:2;14107:9;14103:18;14090:32;14149:18;14141:6;14138:30;14135:117;;;14171:79;;:::i;:::-;14135:117;14276:78;14346:7;14337:6;14326:9;14322:22;14276:78;:::i;:::-;14266:88;;14061:303;13687:684;;;;;:::o;14377:180::-;14425:77;14422:1;14415:88;14522:4;14519:1;14512:15;14546:4;14543:1;14536:15;14563:320;14607:6;14644:1;14638:4;14634:12;14624:22;;14691:1;14685:4;14681:12;14712:18;14702:81;;14768:4;14760:6;14756:17;14746:27;;14702:81;14830:2;14822:6;14819:14;14799:18;14796:38;14793:84;;;14849:18;;:::i;:::-;14793:84;14614:269;14563:320;;;:::o;14889:182::-;15029:34;15025:1;15017:6;15013:14;15006:58;14889:182;:::o;15077:366::-;15219:3;15240:67;15304:2;15299:3;15240:67;:::i;:::-;15233:74;;15316:93;15405:3;15316:93;:::i;:::-;15434:2;15429:3;15425:12;15418:19;;15077:366;;;:::o;15449:419::-;15615:4;15653:2;15642:9;15638:18;15630:26;;15702:9;15696:4;15692:20;15688:1;15677:9;15673:17;15666:47;15730:131;15856:4;15730:131;:::i;:::-;15722:139;;15449:419;;;:::o;15874:231::-;16014:34;16010:1;16002:6;15998:14;15991:58;16083:14;16078:2;16070:6;16066:15;16059:39;15874:231;:::o;16111:366::-;16253:3;16274:67;16338:2;16333:3;16274:67;:::i;:::-;16267:74;;16350:93;16439:3;16350:93;:::i;:::-;16468:2;16463:3;16459:12;16452:19;;16111:366;;;:::o;16483:419::-;16649:4;16687:2;16676:9;16672:18;16664:26;;16736:9;16730:4;16726:20;16722:1;16711:9;16707:17;16700:47;16764:131;16890:4;16764:131;:::i;:::-;16756:139;;16483:419;;;:::o;16908:220::-;17048:34;17044:1;17036:6;17032:14;17025:58;17117:3;17112:2;17104:6;17100:15;17093:28;16908:220;:::o;17134:366::-;17276:3;17297:67;17361:2;17356:3;17297:67;:::i;:::-;17290:74;;17373:93;17462:3;17373:93;:::i;:::-;17491:2;17486:3;17482:12;17475:19;;17134:366;;;:::o;17506:419::-;17672:4;17710:2;17699:9;17695:18;17687:26;;17759:9;17753:4;17749:20;17745:1;17734:9;17730:17;17723:47;17787:131;17913:4;17787:131;:::i;:::-;17779:139;;17506:419;;;:::o;17931:243::-;18071:34;18067:1;18059:6;18055:14;18048:58;18140:26;18135:2;18127:6;18123:15;18116:51;17931:243;:::o;18180:366::-;18322:3;18343:67;18407:2;18402:3;18343:67;:::i;:::-;18336:74;;18419:93;18508:3;18419:93;:::i;:::-;18537:2;18532:3;18528:12;18521:19;;18180:366;;;:::o;18552:419::-;18718:4;18756:2;18745:9;18741:18;18733:26;;18805:9;18799:4;18795:20;18791:1;18780:9;18776:17;18769:47;18833:131;18959:4;18833:131;:::i;:::-;18825:139;;18552:419;;;:::o;18977:236::-;19117:34;19113:1;19105:6;19101:14;19094:58;19186:19;19181:2;19173:6;19169:15;19162:44;18977:236;:::o;19219:366::-;19361:3;19382:67;19446:2;19441:3;19382:67;:::i;:::-;19375:74;;19458:93;19547:3;19458:93;:::i;:::-;19576:2;19571:3;19567:12;19560:19;;19219:366;;;:::o;19591:419::-;19757:4;19795:2;19784:9;19780:18;19772:26;;19844:9;19838:4;19834:20;19830:1;19819:9;19815:17;19808:47;19872:131;19998:4;19872:131;:::i;:::-;19864:139;;19591:419;;;:::o;20016:230::-;20156:34;20152:1;20144:6;20140:14;20133:58;20225:13;20220:2;20212:6;20208:15;20201:38;20016:230;:::o;20252:366::-;20394:3;20415:67;20479:2;20474:3;20415:67;:::i;:::-;20408:74;;20491:93;20580:3;20491:93;:::i;:::-;20609:2;20604:3;20600:12;20593:19;;20252:366;;;:::o;20624:419::-;20790:4;20828:2;20817:9;20813:18;20805:26;;20877:9;20871:4;20867:20;20863:1;20852:9;20848:17;20841:47;20905:131;21031:4;20905:131;:::i;:::-;20897:139;;20624:419;;;:::o;21049:231::-;21189:34;21185:1;21177:6;21173:14;21166:58;21258:14;21253:2;21245:6;21241:15;21234:39;21049:231;:::o;21286:366::-;21428:3;21449:67;21513:2;21508:3;21449:67;:::i;:::-;21442:74;;21525:93;21614:3;21525:93;:::i;:::-;21643:2;21638:3;21634:12;21627:19;;21286:366;;;:::o;21658:419::-;21824:4;21862:2;21851:9;21847:18;21839:26;;21911:9;21905:4;21901:20;21897:1;21886:9;21882:17;21875:47;21939:131;22065:4;21939:131;:::i;:::-;21931:139;;21658:419;;;:::o;22083:180::-;22131:77;22128:1;22121:88;22228:4;22225:1;22218:15;22252:4;22249:1;22242:15;22269:228;22409:34;22405:1;22397:6;22393:14;22386:58;22478:11;22473:2;22465:6;22461:15;22454:36;22269:228;:::o;22503:366::-;22645:3;22666:67;22730:2;22725:3;22666:67;:::i;:::-;22659:74;;22742:93;22831:3;22742:93;:::i;:::-;22860:2;22855:3;22851:12;22844:19;;22503:366;;;:::o;22875:419::-;23041:4;23079:2;23068:9;23064:18;23056:26;;23128:9;23122:4;23118:20;23114:1;23103:9;23099:17;23092:47;23156:131;23282:4;23156:131;:::i;:::-;23148:139;;22875:419;;;:::o;23300:229::-;23440:34;23436:1;23428:6;23424:14;23417:58;23509:12;23504:2;23496:6;23492:15;23485:37;23300:229;:::o;23535:366::-;23677:3;23698:67;23762:2;23757:3;23698:67;:::i;:::-;23691:74;;23774:93;23863:3;23774:93;:::i;:::-;23892:2;23887:3;23883:12;23876:19;;23535:366;;;:::o;23907:419::-;24073:4;24111:2;24100:9;24096:18;24088:26;;24160:9;24154:4;24150:20;24146:1;24135:9;24131:17;24124:47;24188:131;24314:4;24188:131;:::i;:::-;24180:139;;23907:419;;;:::o;24332:175::-;24472:27;24468:1;24460:6;24456:14;24449:51;24332:175;:::o;24513:366::-;24655:3;24676:67;24740:2;24735:3;24676:67;:::i;:::-;24669:74;;24752:93;24841:3;24752:93;:::i;:::-;24870:2;24865:3;24861:12;24854:19;;24513:366;;;:::o;24885:419::-;25051:4;25089:2;25078:9;25074:18;25066:26;;25138:9;25132:4;25128:20;25124:1;25113:9;25109:17;25102:47;25166:131;25292:4;25166:131;:::i;:::-;25158:139;;24885:419;;;:::o;25310:234::-;25450:34;25446:1;25438:6;25434:14;25427:58;25519:17;25514:2;25506:6;25502:15;25495:42;25310:234;:::o;25550:366::-;25692:3;25713:67;25777:2;25772:3;25713:67;:::i;:::-;25706:74;;25789:93;25878:3;25789:93;:::i;:::-;25907:2;25902:3;25898:12;25891:19;;25550:366;;;:::o;25922:419::-;26088:4;26126:2;26115:9;26111:18;26103:26;;26175:9;26169:4;26165:20;26161:1;26150:9;26146:17;26139:47;26203:131;26329:4;26203:131;:::i;:::-;26195:139;;25922:419;;;:::o;26347:148::-;26449:11;26486:3;26471:18;;26347:148;;;;:::o;26501:377::-;26607:3;26635:39;26668:5;26635:39;:::i;:::-;26690:89;26772:6;26767:3;26690:89;:::i;:::-;26683:96;;26788:52;26833:6;26828:3;26821:4;26814:5;26810:16;26788:52;:::i;:::-;26865:6;26860:3;26856:16;26849:23;;26611:267;26501:377;;;;:::o;26884:155::-;27024:7;27020:1;27012:6;27008:14;27001:31;26884:155;:::o;27045:400::-;27205:3;27226:84;27308:1;27303:3;27226:84;:::i;:::-;27219:91;;27319:93;27408:3;27319:93;:::i;:::-;27437:1;27432:3;27428:11;27421:18;;27045:400;;;:::o;27451:701::-;27732:3;27754:95;27845:3;27836:6;27754:95;:::i;:::-;27747:102;;27866:95;27957:3;27948:6;27866:95;:::i;:::-;27859:102;;27978:148;28122:3;27978:148;:::i;:::-;27971:155;;28143:3;28136:10;;27451:701;;;;;:::o;28158:225::-;28298:34;28294:1;28286:6;28282:14;28275:58;28367:8;28362:2;28354:6;28350:15;28343:33;28158:225;:::o;28389:366::-;28531:3;28552:67;28616:2;28611:3;28552:67;:::i;:::-;28545:74;;28628:93;28717:3;28628:93;:::i;:::-;28746:2;28741:3;28737:12;28730:19;;28389:366;;;:::o;28761:419::-;28927:4;28965:2;28954:9;28950:18;28942:26;;29014:9;29008:4;29004:20;29000:1;28989:9;28985:17;28978:47;29042:131;29168:4;29042:131;:::i;:::-;29034:139;;28761:419;;;:::o;29186:180::-;29234:77;29231:1;29224:88;29331:4;29328:1;29321:15;29355:4;29352:1;29345:15;29372:305;29412:3;29431:20;29449:1;29431:20;:::i;:::-;29426:25;;29465:20;29483:1;29465:20;:::i;:::-;29460:25;;29619:1;29551:66;29547:74;29544:1;29541:81;29538:107;;;29625:18;;:::i;:::-;29538:107;29669:1;29666;29662:9;29655:16;;29372:305;;;;:::o;29683:174::-;29823:26;29819:1;29811:6;29807:14;29800:50;29683:174;:::o;29863:366::-;30005:3;30026:67;30090:2;30085:3;30026:67;:::i;:::-;30019:74;;30102:93;30191:3;30102:93;:::i;:::-;30220:2;30215:3;30211:12;30204:19;;29863:366;;;:::o;30235:419::-;30401:4;30439:2;30428:9;30424:18;30416:26;;30488:9;30482:4;30478:20;30474:1;30463:9;30459:17;30452:47;30516:131;30642:4;30516:131;:::i;:::-;30508:139;;30235:419;;;:::o;30660:221::-;30800:34;30796:1;30788:6;30784:14;30777:58;30869:4;30864:2;30856:6;30852:15;30845:29;30660:221;:::o;30887:366::-;31029:3;31050:67;31114:2;31109:3;31050:67;:::i;:::-;31043:74;;31126:93;31215:3;31126:93;:::i;:::-;31244:2;31239:3;31235:12;31228:19;;30887:366;;;:::o;31259:419::-;31425:4;31463:2;31452:9;31448:18;31440:26;;31512:9;31506:4;31502:20;31498:1;31487:9;31483:17;31476:47;31540:131;31666:4;31540:131;:::i;:::-;31532:139;;31259:419;;;:::o;31684:180::-;31824:32;31820:1;31812:6;31808:14;31801:56;31684:180;:::o;31870:366::-;32012:3;32033:67;32097:2;32092:3;32033:67;:::i;:::-;32026:74;;32109:93;32198:3;32109:93;:::i;:::-;32227:2;32222:3;32218:12;32211:19;;31870:366;;;:::o;32242:419::-;32408:4;32446:2;32435:9;32431:18;32423:26;;32495:9;32489:4;32485:20;32481:1;32470:9;32466:17;32459:47;32523:131;32649:4;32523:131;:::i;:::-;32515:139;;32242:419;;;:::o;32667:168::-;32807:20;32803:1;32795:6;32791:14;32784:44;32667:168;:::o;32841:366::-;32983:3;33004:67;33068:2;33063:3;33004:67;:::i;:::-;32997:74;;33080:93;33169:3;33080:93;:::i;:::-;33198:2;33193:3;33189:12;33182:19;;32841:366;;;:::o;33213:419::-;33379:4;33417:2;33406:9;33402:18;33394:26;;33466:9;33460:4;33456:20;33452:1;33441:9;33437:17;33430:47;33494:131;33620:4;33494:131;:::i;:::-;33486:139;;33213:419;;;:::o;33638:143::-;33695:5;33726:6;33720:13;33711:22;;33742:33;33769:5;33742:33;:::i;:::-;33638:143;;;;:::o;33787:351::-;33857:6;33906:2;33894:9;33885:7;33881:23;33877:32;33874:119;;;33912:79;;:::i;:::-;33874:119;34032:1;34057:64;34113:7;34104:6;34093:9;34089:22;34057:64;:::i;:::-;34047:74;;34003:128;33787:351;;;;:::o;34144:220::-;34284:34;34280:1;34272:6;34268:14;34261:58;34353:3;34348:2;34340:6;34336:15;34329:28;34144:220;:::o;34370:366::-;34512:3;34533:67;34597:2;34592:3;34533:67;:::i;:::-;34526:74;;34609:93;34698:3;34609:93;:::i;:::-;34727:2;34722:3;34718:12;34711:19;;34370:366;;;:::o;34742:419::-;34908:4;34946:2;34935:9;34931:18;34923:26;;34995:9;34989:4;34985:20;34981:1;34970:9;34966:17;34959:47;35023:131;35149:4;35023:131;:::i;:::-;35015:139;;34742:419;;;:::o;35167:143::-;35224:5;35255:6;35249:13;35240:22;;35271:33;35298:5;35271:33;:::i;:::-;35167:143;;;;:::o;35316:351::-;35386:6;35435:2;35423:9;35414:7;35410:23;35406:32;35403:119;;;35441:79;;:::i;:::-;35403:119;35561:1;35586:64;35642:7;35633:6;35622:9;35618:22;35586:64;:::i;:::-;35576:74;;35532:128;35316:351;;;;:::o;35673:220::-;35813:34;35809:1;35801:6;35797:14;35790:58;35882:3;35877:2;35869:6;35865:15;35858:28;35673:220;:::o;35899:366::-;36041:3;36062:67;36126:2;36121:3;36062:67;:::i;:::-;36055:74;;36138:93;36227:3;36138:93;:::i;:::-;36256:2;36251:3;36247:12;36240:19;;35899:366;;;:::o;36271:419::-;36437:4;36475:2;36464:9;36460:18;36452:26;;36524:9;36518:4;36514:20;36510:1;36499:9;36495:17;36488:47;36552:131;36678:4;36552:131;:::i;:::-;36544:139;;36271:419;;;:::o;36696:231::-;36836:34;36832:1;36824:6;36820:14;36813:58;36905:14;36900:2;36892:6;36888:15;36881:39;36696:231;:::o;36933:366::-;37075:3;37096:67;37160:2;37155:3;37096:67;:::i;:::-;37089:74;;37172:93;37261:3;37172:93;:::i;:::-;37290:2;37285:3;37281:12;37274:19;;36933:366;;;:::o;37305:419::-;37471:4;37509:2;37498:9;37494:18;37486:26;;37558:9;37552:4;37548:20;37544:1;37533:9;37529:17;37522:47;37586:131;37712:4;37586:131;:::i;:::-;37578:139;;37305:419;;;:::o;37730:233::-;37769:3;37792:24;37810:5;37792:24;:::i;:::-;37783:33;;37838:66;37831:5;37828:77;37825:103;;;37908:18;;:::i;:::-;37825:103;37955:1;37948:5;37944:13;37937:20;;37730:233;;;:::o;37969:332::-;38090:4;38128:2;38117:9;38113:18;38105:26;;38141:71;38209:1;38198:9;38194:17;38185:6;38141:71;:::i;:::-;38222:72;38290:2;38279:9;38275:18;38266:6;38222:72;:::i;:::-;37969:332;;;;;:::o;38307:231::-;38447:34;38443:1;38435:6;38431:14;38424:58;38516:14;38511:2;38503:6;38499:15;38492:39;38307:231;:::o;38544:366::-;38686:3;38707:67;38771:2;38766:3;38707:67;:::i;:::-;38700:74;;38783:93;38872:3;38783:93;:::i;:::-;38901:2;38896:3;38892:12;38885:19;;38544:366;;;:::o;38916:419::-;39082:4;39120:2;39109:9;39105:18;39097:26;;39169:9;39163:4;39159:20;39155:1;39144:9;39140:17;39133:47;39197:131;39323:4;39197:131;:::i;:::-;39189:139;;38916:419;;;:::o;39341:228::-;39481:34;39477:1;39469:6;39465:14;39458:58;39550:11;39545:2;39537:6;39533:15;39526:36;39341:228;:::o;39575:366::-;39717:3;39738:67;39802:2;39797:3;39738:67;:::i;:::-;39731:74;;39814:93;39903:3;39814:93;:::i;:::-;39932:2;39927:3;39923:12;39916:19;;39575:366;;;:::o;39947:419::-;40113:4;40151:2;40140:9;40136:18;40128:26;;40200:9;40194:4;40190:20;40186:1;40175:9;40171:17;40164:47;40228:131;40354:4;40228:131;:::i;:::-;40220:139;;39947:419;;;:::o;40372:223::-;40512:34;40508:1;40500:6;40496:14;40489:58;40581:6;40576:2;40568:6;40564:15;40557:31;40372:223;:::o;40601:366::-;40743:3;40764:67;40828:2;40823:3;40764:67;:::i;:::-;40757:74;;40840:93;40929:3;40840:93;:::i;:::-;40958:2;40953:3;40949:12;40942:19;;40601:366;;;:::o;40973:419::-;41139:4;41177:2;41166:9;41162:18;41154:26;;41226:9;41220:4;41216:20;41212:1;41201:9;41197:17;41190:47;41254:131;41380:4;41254:131;:::i;:::-;41246:139;;40973:419;;;:::o;41398:191::-;41438:4;41458:20;41476:1;41458:20;:::i;:::-;41453:25;;41492:20;41510:1;41492:20;:::i;:::-;41487:25;;41531:1;41528;41525:8;41522:34;;;41536:18;;:::i;:::-;41522:34;41581:1;41578;41574:9;41566:17;;41398:191;;;;:::o;41595:237::-;41735:34;41731:1;41723:6;41719:14;41712:58;41804:20;41799:2;41791:6;41787:15;41780:45;41595:237;:::o;41838:366::-;41980:3;42001:67;42065:2;42060:3;42001:67;:::i;:::-;41994:74;;42077:93;42166:3;42077:93;:::i;:::-;42195:2;42190:3;42186:12;42179:19;;41838:366;;;:::o;42210:419::-;42376:4;42414:2;42403:9;42399:18;42391:26;;42463:9;42457:4;42453:20;42449:1;42438:9;42434:17;42427:47;42491:131;42617:4;42491:131;:::i;:::-;42483:139;;42210:419;;;:::o;42635:180::-;42683:77;42680:1;42673:88;42780:4;42777:1;42770:15;42804:4;42801:1;42794:15;42821:185;42861:1;42878:20;42896:1;42878:20;:::i;:::-;42873:25;;42912:20;42930:1;42912:20;:::i;:::-;42907:25;;42951:1;42941:35;;42956:18;;:::i;:::-;42941:35;42998:1;42995;42991:9;42986:14;;42821:185;;;;:::o;43012:176::-;43044:1;43061:20;43079:1;43061:20;:::i;:::-;43056:25;;43095:20;43113:1;43095:20;:::i;:::-;43090:25;;43134:1;43124:35;;43139:18;;:::i;:::-;43124:35;43180:1;43177;43173:9;43168:14;;43012:176;;;;:::o;43194:98::-;43245:6;43279:5;43273:12;43263:22;;43194:98;;;:::o;43298:168::-;43381:11;43415:6;43410:3;43403:19;43455:4;43450:3;43446:14;43431:29;;43298:168;;;;:::o;43472:360::-;43558:3;43586:38;43618:5;43586:38;:::i;:::-;43640:70;43703:6;43698:3;43640:70;:::i;:::-;43633:77;;43719:52;43764:6;43759:3;43752:4;43745:5;43741:16;43719:52;:::i;:::-;43796:29;43818:6;43796:29;:::i;:::-;43791:3;43787:39;43780:46;;43562:270;43472:360;;;;:::o;43838:640::-;44033:4;44071:3;44060:9;44056:19;44048:27;;44085:71;44153:1;44142:9;44138:17;44129:6;44085:71;:::i;:::-;44166:72;44234:2;44223:9;44219:18;44210:6;44166:72;:::i;:::-;44248;44316:2;44305:9;44301:18;44292:6;44248:72;:::i;:::-;44367:9;44361:4;44357:20;44352:2;44341:9;44337:18;44330:48;44395:76;44466:4;44457:6;44395:76;:::i;:::-;44387:84;;43838:640;;;;;;;:::o;44484:141::-;44540:5;44571:6;44565:13;44556:22;;44587:32;44613:5;44587:32;:::i;:::-;44484:141;;;;:::o;44631:349::-;44700:6;44749:2;44737:9;44728:7;44724:23;44720:32;44717:119;;;44755:79;;:::i;:::-;44717:119;44875:1;44900:63;44955:7;44946:6;44935:9;44931:22;44900:63;:::i;:::-;44890:73;;44846:127;44631:349;;;;:::o;44986:180::-;45034:77;45031:1;45024:88;45131:4;45128:1;45121:15;45155:4;45152:1;45145:15;45172:182;45312:34;45308:1;45300:6;45296:14;45289:58;45172:182;:::o;45360:366::-;45502:3;45523:67;45587:2;45582:3;45523:67;:::i;:::-;45516:74;;45599:93;45688:3;45599:93;:::i;:::-;45717:2;45712:3;45708:12;45701:19;;45360:366;;;:::o;45732:419::-;45898:4;45936:2;45925:9;45921:18;45913:26;;45985:9;45979:4;45975:20;45971:1;45960:9;45956:17;45949:47;46013:131;46139:4;46013:131;:::i;:::-;46005:139;;45732:419;;;:::o;46157:178::-;46297:30;46293:1;46285:6;46281:14;46274:54;46157:178;:::o;46341:366::-;46483:3;46504:67;46568:2;46563:3;46504:67;:::i;:::-;46497:74;;46580:93;46669:3;46580:93;:::i;:::-;46698:2;46693:3;46689:12;46682:19;;46341:366;;;:::o;46713:419::-;46879:4;46917:2;46906:9;46902:18;46894:26;;46966:9;46960:4;46956:20;46952:1;46941:9;46937:17;46930:47;46994:131;47120:4;46994:131;:::i;:::-;46986:139;;46713:419;;;:::o

Swarm Source

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