ETH Price: $3,373.93 (-2.43%)

Token

Skeletongues (Skeletongues)
 

Overview

Max Total Supply

5,098 Skeletongues

Holders

2,340

Market

Volume (24H)

0.0014 ETH

Min Price (24H)

$4.72 @ 0.001400 ETH

Max Price (24H)

$4.72 @ 0.001400 ETH

Other Info

Filtered by Token Holder
spot3ftw.eth
Balance
1 Skeletongues
0x309046489b36908c8ab78ff43fcb963158330be8
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

SAD CATS. MINT IS LIVE NOW: https://sadgirlsbar.io/sad-cats MEET THE NEW COLLECTION FOR SAD GIRLS HOLDERS! SKELETONGUES: https://sadgirlsbar.io/skeletongue.html They are coming to the Sad Girls Bar by night, the only bones that are worthy to be kissed. Skeletongues — ERC-721...

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Skeletongues

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

pragma solidity 0.8.9;
// SPDX-License-Identifier: MIT


// @title: Skeletongues
// @website: skeletongues.sadgirlsbar.io

//    ██████  ▄▄▄      ▓█████▄
//  ▒██    ▒ ▒████▄    ▒██▀ ██▌
//  ░ ▓██▄   ▒██  ▀█▄  ░██   █▌
//    ▒   ██▒░██▄▄▄▄██ ░▓█▄   ▌
//  ▒██████▒▒ ▓█   ▓██▒░▒████▓
//  ▒ ▒▓▒ ▒ ░ ▒▒   ▓▒█░ ▒▒▓  ▒
//  ░ ░▒  ░ ░  ▒   ▒▒ ░ ░ ▒  ▒
//  ░  ░  ░    ░   ▒    ░ ░  ░
//        ░        ░  ░   ░
//                      ░
//    ▄████  ██▓ ██▀███   ██▓      ██████
//   ██▒ ▀█▒▓██▒▓██ ▒ ██▒▓██▒    ▒██    ▒
//  ▒██░▄▄▄░▒██▒▓██ ░▄█ ▒▒██░    ░ ▓██▄
//  ░▓█  ██▓░██░▒██▀▀█▄  ▒██░      ▒   ██▒
//  ░▒▓███▀▒░██░░██▓ ▒██▒░██████▒▒██████▒▒
//   ░▒   ▒ ░▓  ░ ▒▓ ░▒▓░░ ▒░▓  ░▒ ▒▓▒ ▒ ░
//    ░   ░  ▒ ░  ░▒ ░ ▒░░ ░ ▒  ░░ ░▒  ░ ░
//  ░ ░   ░  ▒ ░  ░░   ░   ░ ░   ░  ░  ░
//        ░  ░     ░         ░  ░      ░
//
//   ▄▄▄▄    ▄▄▄       ██▀███
//  ▓█████▄ ▒████▄    ▓██ ▒ ██▒
//  ▒██▒ ▄██▒██  ▀█▄  ▓██ ░▄█ ▒
//  ▒██░█▀  ░██▄▄▄▄██ ▒██▀▀█▄
//  ░▓█  ▀█▓ ▓█   ▓██▒░██▓ ▒██▒
//  ░▒▓███▀▒ ▒▒   ▓▒█░░ ▒▓ ░▒▓░
//  ▒░▒   ░   ▒   ▒▒ ░  ░▒ ░ ▒░
//   ░    ░   ░   ▒     ░░   ░
//   ░            ░  ░   ░
//        ░
//
//
//  ██████  ██ ▄█▀▓█████  ██▓    ▓█████▄▄▄█████▓ ▒█████   ███▄    █   ▄████  █    ██ ▓█████   ██████
//  ▒██    ▒  ██▄█▒ ▓█   ▀ ▓██▒    ▓█   ▀▓  ██▒ ▓▒▒██▒  ██▒ ██ ▀█   █  ██▒ ▀█▒ ██  ▓██▒▓█   ▀ ▒██    ▒
//  ░ ▓██▄   ▓███▄░ ▒███   ▒██░    ▒███  ▒ ▓██░ ▒░▒██░  ██▒▓██  ▀█ ██▒▒██░▄▄▄░▓██  ▒██░▒███   ░ ▓██▄
//  ▒   ██▒▓██ █▄ ▒▓█  ▄ ▒██░    ▒▓█  ▄░ ▓██▓ ░ ▒██   ██░▓██▒  ▐▌██▒░▓█  ██▓▓▓█  ░██░▒▓█  ▄   ▒   ██▒
//  ▒██████▒▒▒██▒ █▄░▒████▒░██████▒░▒████▒ ▒██▒ ░ ░ ████▓▒░▒██░   ▓██░░▒▓███▀▒▒▒█████▓ ░▒████▒▒██████▒▒
//  ▒ ▒▓▒ ▒ ░▒ ▒▒ ▓▒░░ ▒░ ░░ ▒░▓  ░░░ ▒░ ░ ▒ ░░   ░ ▒░▒░▒░ ░ ▒░   ▒ ▒  ░▒   ▒ ░▒▓▒ ▒ ▒ ░░ ▒░ ░▒ ▒▓▒ ▒ ░
//  ░ ░▒  ░ ░░ ░▒ ▒░ ░ ░  ░░ ░ ▒  ░ ░ ░  ░   ░      ░ ▒ ▒░ ░ ░░   ░ ▒░  ░   ░ ░░▒░ ░ ░  ░ ░  ░░ ░▒  ░ ░
//  ░  ░  ░  ░ ░░ ░    ░     ░ ░      ░    ░      ░ ░ ░ ▒     ░   ░ ░ ░ ░   ░  ░░░ ░ ░    ░   ░  ░  ░
//  ░  ░  ░      ░  ░    ░  ░   ░  ░            ░ ░           ░       ░    ░        ░  ░      ░

// OpenZeppelin






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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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



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

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

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

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

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



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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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





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



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

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

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

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}



/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}



// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}







contract SadGirlsBarClient {
  function tokensOfOwner(address _owner) external view returns(uint256[] memory) {}
  function totalSupply() public view virtual returns (uint256) {}
  function ownerOf(uint256 tokenId) public view virtual returns (address) {}
}

contract Skeletongues is ERC721, ERC721Enumerable, Ownable, ReentrancyGuard {
  using SafeMath for uint8;
  using SafeMath for uint256;
  using Strings for string;

  // Emergency start/pause
  bool public isStarted = false;

  string private _baseTokenURI;
  address private _sgbAddress;
  uint256 private _maxBatchSize = 20;

  /*
   * Set up the basics
   *
   * @dev It will NOT be ready to start sale immediately upon deploy
   */
  constructor(string memory baseURI, address sgbAddress) ERC721("Skeletongues","Skeletongues") {
    setBaseURI(baseURI);
    setSgbAddress(sgbAddress);
  }

  /*
   * Get the tokens owned by _owner
   */
  function tokensOfOwner(address _owner) external view returns(uint256[] memory ) {
    uint256 tokenCount = balanceOf(_owner);
    if (tokenCount == 0) {
      // Return an empty array
      return new uint256[](0);
    } else {
      uint256[] memory result = new uint256[](tokenCount);
      uint256 index;
      for (index = 0; index < tokenCount; index++) {
        result[index] = tokenOfOwnerByIndex(_owner, index);
      }
      return result;
    }
  }

  function isIdOk(uint256 tokenId) internal pure returns (bool) {
    return (tokenId > 0 && tokenId < 10001);
  }

  function getSgbIdsOfOwner(address _owner) public view returns(uint256[] memory ){
    SadGirlsBarClient sgb = SadGirlsBarClient(_sgbAddress);
    return sgb.tokensOfOwner(_owner);

  }

  function amIOwner(uint256 tokenId) public view returns (bool) {
    SadGirlsBarClient sgb = SadGirlsBarClient(_sgbAddress);
    address tokenOwner = sgb.ownerOf(tokenId);
    if(tokenOwner == tx.origin){
      return true;
    }
    return false;
  }

  function isNotMintedYet(uint256 tokenId) public view returns (bool){
    return !_exists(tokenId);
  }

  // CHECK AND MINT ONE

  function isCanIMintOne(uint256 tokenId) public view returns (bool) {
    return (isIdOk(tokenId) && isNotMintedYet(tokenId) && amIOwner(tokenId));
  }

  function mintOne(uint256 tokenId) external {
    require(isIdOk(tokenId), "INVALID_ID");
    require(isStarted, "NO_START");
    require(amIOwner(tokenId), "NO_OWN");
    _safeMint(msg.sender, tokenId);
  }

  // CHECK AND MINT MANY

  function getMintableIds(address _owner) public view returns (uint256[] memory){
    SadGirlsBarClient sgb = SadGirlsBarClient(_sgbAddress);

    // get all owned girls tokens
    uint256[] memory sgbTokensArray = sgb.tokensOfOwner(_owner);
    require(sgbTokensArray.length > 0, "NO_SGB");

    // array for result
    uint256[] memory subtotalIds = new uint256[](_maxBatchSize);

    // array limit
    uint256 currentIdx;

    // iterate over owned girls
    for (uint256 i=0; i<sgbTokensArray.length; i++) {
      // check skeleton not minted yet
      if (!_exists(sgbTokensArray[i])) {
        // if not minted - add id in array
        subtotalIds[currentIdx] = sgbTokensArray[i];
        currentIdx++;
        // and check array boundaries
        if (currentIdx>= _maxBatchSize) {
          break;
        }
      }
    }

    uint256[] memory mintableIds = new uint256[](currentIdx);
    for (uint256 i=0; i<currentIdx; i++) {
      mintableIds[i] = subtotalIds[i];
    }

    return mintableIds;
  }

  function mintMany(uint256 _amount) external {
    require(isStarted, "NO_START");
    uint256[] memory mintableIds = getMintableIds(msg.sender);
    require(mintableIds.length > 0, "NO_MINT");
    require(_amount<=_maxBatchSize, "TOO_MUCH");
    require(_amount<=mintableIds.length, "TOO_MUCH");
    require(_amount>0, "ZERO_AMOUNT");
    for (uint256 i=0; i<_amount; i++) {
      _safeMint(msg.sender, mintableIds[i]);
    }

  }


  function _beforeTokenTransfer(address from, address to, uint256 tokenId)
  internal
  override(ERC721, ERC721Enumerable)
  {
    super._beforeTokenTransfer(from, to, tokenId);
  }

  function supportsInterface(bytes4 interfaceId)
  public
  view
  override(ERC721, ERC721Enumerable)
  returns (bool)
  {
    return super.supportsInterface(interfaceId);
  }

  function _setBaseURI(string memory baseURI) internal virtual {
    _baseTokenURI = baseURI;
  }

  function _setSgbAddress(address sgbAddress) internal virtual {
    _sgbAddress = sgbAddress;
  }

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

  function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) {
    string memory _tokenURI = super.tokenURI(tokenId);
    return bytes(_tokenURI).length > 0 ? string(abi.encodePacked(_tokenURI, ".json")) : "";
  }

  // Administrative zone
  function setBaseURI(string memory baseURI) public onlyOwner {
    _setBaseURI(baseURI);
  }

  function setSgbAddress(address sgbAddress) public onlyOwner {
    _setSgbAddress(sgbAddress);
  }

  function setMaxBatchSize(uint256 maxBatchSize) public onlyOwner {
    _maxBatchSize = maxBatchSize;
  }

  function startMint() public onlyOwner {
    isStarted = true;
  }

  function pauseMint() public onlyOwner {
    isStarted = false;
  }

  function withdrawAll() public payable onlyOwner {
    require(payable(msg.sender).send(address(this).balance));
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"},{"internalType":"address","name":"sgbAddress","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":"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":"uint256","name":"tokenId","type":"uint256"}],"name":"amIOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getMintableIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getSgbIdsOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isCanIMintOne","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isNotMintedYet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mintOne","outputs":[],"stateMutability":"nonpayable","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":"pauseMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxBatchSize","type":"uint256"}],"name":"setMaxBatchSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sgbAddress","type":"address"}],"name":"setSgbAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startMint","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000600c60006101000a81548160ff0219169083151502179055506014600f553480156200003157600080fd5b506040516200536638038062005366833981810160405281019062000057919062000699565b6040518060400160405280600c81526020017f536b656c65746f6e6775657300000000000000000000000000000000000000008152506040518060400160405280600c81526020017f536b656c65746f6e6775657300000000000000000000000000000000000000008152508160009080519060200190620000db929190620003e7565b508060019080519060200190620000f4929190620003e7565b505050620001176200010b6200014960201b60201c565b6200015160201b60201c565b6001600b8190555062000130826200021760201b60201c565b6200014181620002ba60201b60201c565b5050620007e7565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002276200014960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200024d6200035d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200029d9062000760565b60405180910390fd5b620002b7816200038760201b60201c565b50565b620002ca6200014960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002f06200035d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000349576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003409062000760565b60405180910390fd5b6200035a81620003a360201b60201c565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b80600d90805190602001906200039f929190620003e7565b5050565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b828054620003f590620007b1565b90600052602060002090601f01602090048101928262000419576000855562000465565b82601f106200043457805160ff191683800117855562000465565b8280016001018555821562000465579182015b828111156200046457825182559160200191906001019062000447565b5b50905062000474919062000478565b5090565b5b808211156200049357600081600090555060010162000479565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200050082620004b5565b810181811067ffffffffffffffff82111715620005225762000521620004c6565b5b80604052505050565b60006200053762000497565b9050620005458282620004f5565b919050565b600067ffffffffffffffff821115620005685762000567620004c6565b5b6200057382620004b5565b9050602081019050919050565b60005b83811015620005a057808201518184015260208101905062000583565b83811115620005b0576000848401525b50505050565b6000620005cd620005c7846200054a565b6200052b565b905082815260208101848484011115620005ec57620005eb620004b0565b5b620005f984828562000580565b509392505050565b600082601f830112620006195762000618620004ab565b5b81516200062b848260208601620005b6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006618262000634565b9050919050565b620006738162000654565b81146200067f57600080fd5b50565b600081519050620006938162000668565b92915050565b60008060408385031215620006b357620006b2620004a1565b5b600083015167ffffffffffffffff811115620006d457620006d3620004a6565b5b620006e28582860162000601565b9250506020620006f58582860162000682565b9150509250929050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000748602083620006ff565b9150620007558262000710565b602082019050919050565b600060208201905081810360008301526200077b8162000739565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007ca57607f821691505b60208210811415620007e157620007e062000782565b5b50919050565b614b6f80620007f76000396000f3fe6080604052600436106101f95760003560e01c80636352211e1161010d57806395d89b41116100a0578063c87b56dd1161006f578063c87b56dd1461075a578063cb3cb5c414610797578063cd85cdb5146107c0578063e985e9c5146107d7578063f2fde38b14610814576101f9565b806395d89b41146106b4578063a22cb465146106df578063b7864c4d14610708578063b88d4fde14610731576101f9565b8063853828b6116100dc578063853828b6146106055780638ab9f5a71461060f5780638da5cb5b1461064c578063929eea5e14610677576101f9565b80636352211e1461053757806370a0823114610574578063715018a6146105b15780638462151c146105c8576101f9565b80632be09561116101905780634f6ccce71161015f5780634f6ccce71461042c578063544736e61461046957806355f804b3146104945780635fe1113d146104bd578063628abf0f146104fa576101f9565b80632be09561146103725780632f745c59146103895780633870c761146103c657806342842e0e14610403576101f9565b8063095ea7b3116101cc578063095ea7b3146102cc57806318160ddd146102f557806323b872dd146103205780632b26a6bf14610349576101f9565b806301ffc9a7146101fe578063059513a61461023b57806306fdde0314610264578063081812fc1461028f575b600080fd5b34801561020a57600080fd5b506102256004803603810190610220919061320d565b61083d565b6040516102329190613255565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d91906132a6565b61084f565b005b34801561027057600080fd5b50610279610a02565b604051610286919061336c565b60405180910390f35b34801561029b57600080fd5b506102b660048036038101906102b191906132a6565b610a94565b6040516102c391906133cf565b60405180910390f35b3480156102d857600080fd5b506102f360048036038101906102ee9190613416565b610b19565b005b34801561030157600080fd5b5061030a610c31565b6040516103179190613465565b60405180910390f35b34801561032c57600080fd5b5061034760048036038101906103429190613480565b610c3e565b005b34801561035557600080fd5b50610370600480360381019061036b91906132a6565b610c9e565b005b34801561037e57600080fd5b50610387610d24565b005b34801561039557600080fd5b506103b060048036038101906103ab9190613416565b610dbd565b6040516103bd9190613465565b60405180910390f35b3480156103d257600080fd5b506103ed60048036038101906103e891906132a6565b610e62565b6040516103fa9190613255565b60405180910390f35b34801561040f57600080fd5b5061042a60048036038101906104259190613480565b610f62565b005b34801561043857600080fd5b50610453600480360381019061044e91906132a6565b610f82565b6040516104609190613465565b60405180910390f35b34801561047557600080fd5b5061047e610ff3565b60405161048b9190613255565b60405180910390f35b3480156104a057600080fd5b506104bb60048036038101906104b69190613608565b611006565b005b3480156104c957600080fd5b506104e460048036038101906104df91906132a6565b61108e565b6040516104f19190613255565b60405180910390f35b34801561050657600080fd5b50610521600480360381019061051c9190613651565b6110a1565b60405161052e919061373c565b60405180910390f35b34801561054357600080fd5b5061055e600480360381019061055991906132a6565b611345565b60405161056b91906133cf565b60405180910390f35b34801561058057600080fd5b5061059b60048036038101906105969190613651565b6113f7565b6040516105a89190613465565b60405180910390f35b3480156105bd57600080fd5b506105c66114af565b005b3480156105d457600080fd5b506105ef60048036038101906105ea9190613651565b611537565b6040516105fc919061373c565b60405180910390f35b61060d611641565b005b34801561061b57600080fd5b5061063660048036038101906106319190613651565b6116fd565b604051610643919061373c565b60405180910390f35b34801561065857600080fd5b506106616117bc565b60405161066e91906133cf565b60405180910390f35b34801561068357600080fd5b5061069e600480360381019061069991906132a6565b6117e6565b6040516106ab9190613255565b60405180910390f35b3480156106c057600080fd5b506106c961181a565b6040516106d6919061336c565b60405180910390f35b3480156106eb57600080fd5b506107066004803603810190610701919061378a565b6118ac565b005b34801561071457600080fd5b5061072f600480360381019061072a9190613651565b611a2d565b005b34801561073d57600080fd5b506107586004803603810190610753919061386b565b611ab5565b005b34801561076657600080fd5b50610781600480360381019061077c91906132a6565b611b17565b60405161078e919061336c565b60405180910390f35b3480156107a357600080fd5b506107be60048036038101906107b991906132a6565b611b6d565b005b3480156107cc57600080fd5b506107d5611c59565b005b3480156107e357600080fd5b506107fe60048036038101906107f991906138ee565b611cf2565b60405161080b9190613255565b60405180910390f35b34801561082057600080fd5b5061083b60048036038101906108369190613651565b611d86565b005b600061084882611e7e565b9050919050565b600c60009054906101000a900460ff1661089e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108959061397a565b60405180910390fd5b60006108a9336110a1565b905060008151116108ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e6906139e6565b60405180910390fd5b600f54821115610934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092b90613a52565b60405180910390fd5b8051821115610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096f90613a52565b60405180910390fd5b600082116109bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b290613abe565b60405180910390fd5b60005b828110156109fd576109ea338383815181106109dd576109dc613ade565b5b6020026020010151611ef8565b80806109f590613b3c565b9150506109be565b505050565b606060008054610a1190613bb4565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3d90613bb4565b8015610a8a5780601f10610a5f57610100808354040283529160200191610a8a565b820191906000526020600020905b815481529060010190602001808311610a6d57829003601f168201915b5050505050905090565b6000610a9f82611f16565b610ade576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad590613c58565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b2482611345565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8c90613cea565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bb4611f82565b73ffffffffffffffffffffffffffffffffffffffff161480610be35750610be281610bdd611f82565b611cf2565b5b610c22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1990613d7c565b60405180910390fd5b610c2c8383611f8a565b505050565b6000600880549050905090565b610c4f610c49611f82565b82612043565b610c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8590613e0e565b60405180910390fd5b610c99838383612121565b505050565b610ca6611f82565b73ffffffffffffffffffffffffffffffffffffffff16610cc46117bc565b73ffffffffffffffffffffffffffffffffffffffff1614610d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1190613e7a565b60405180910390fd5b80600f8190555050565b610d2c611f82565b73ffffffffffffffffffffffffffffffffffffffff16610d4a6117bc565b73ffffffffffffffffffffffffffffffffffffffff1614610da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9790613e7a565b60405180910390fd5b6001600c60006101000a81548160ff021916908315150217905550565b6000610dc8836113f7565b8210610e09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0090613f0c565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b8152600401610ec59190613465565b60206040518083038186803b158015610edd57600080fd5b505afa158015610ef1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f159190613f41565b90503273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f5657600192505050610f5d565b6000925050505b919050565b610f7d83838360405180602001604052806000815250611ab5565b505050565b6000610f8c610c31565b8210610fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc490613fe0565b60405180910390fd5b60088281548110610fe157610fe0613ade565b5b90600052602060002001549050919050565b600c60009054906101000a900460ff1681565b61100e611f82565b73ffffffffffffffffffffffffffffffffffffffff1661102c6117bc565b73ffffffffffffffffffffffffffffffffffffffff1614611082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107990613e7a565b60405180910390fd5b61108b8161237d565b50565b600061109982611f16565b159050919050565b60606000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff16638462151c856040518263ffffffff1660e01b815260040161110591906133cf565b60006040518083038186803b15801561111d57600080fd5b505afa158015611131573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061115a91906140dd565b905060008151116111a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119790614172565b60405180910390fd5b6000600f5467ffffffffffffffff8111156111be576111bd6134dd565b5b6040519080825280602002602001820160405280156111ec5781602001602082028036833780820191505090505b509050600080600090505b83518110156112915761122384828151811061121657611215613ade565b5b6020026020010151611f16565b61127e5783818151811061123a57611239613ade565b5b602002602001015183838151811061125557611254613ade565b5b602002602001018181525050818061126c90613b3c565b925050600f54821061127d57611291565b5b808061128990613b3c565b9150506111f7565b5060008167ffffffffffffffff8111156112ae576112ad6134dd565b5b6040519080825280602002602001820160405280156112dc5781602001602082028036833780820191505090505b50905060005b82811015611337578381815181106112fd576112fc613ade565b5b602002602001015182828151811061131857611317613ade565b5b602002602001018181525050808061132f90613b3c565b9150506112e2565b508095505050505050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e590614204565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145f90614296565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114b7611f82565b73ffffffffffffffffffffffffffffffffffffffff166114d56117bc565b73ffffffffffffffffffffffffffffffffffffffff161461152b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152290613e7a565b60405180910390fd5b6115356000612397565b565b60606000611544836113f7565b905060008114156115a157600067ffffffffffffffff81111561156a576115696134dd565b5b6040519080825280602002602001820160405280156115985781602001602082028036833780820191505090505b5091505061163c565b60008167ffffffffffffffff8111156115bd576115bc6134dd565b5b6040519080825280602002602001820160405280156115eb5781602001602082028036833780820191505090505b50905060005b82811015611635576116038582610dbd565b82828151811061161657611615613ade565b5b602002602001018181525050808061162d90613b3c565b9150506115f1565b8193505050505b919050565b611649611f82565b73ffffffffffffffffffffffffffffffffffffffff166116676117bc565b73ffffffffffffffffffffffffffffffffffffffff16146116bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b490613e7a565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050506116fb57600080fd5b565b60606000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff16638462151c846040518263ffffffff1660e01b815260040161175f91906133cf565b60006040518083038186803b15801561177757600080fd5b505afa15801561178b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906117b491906140dd565b915050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006117f18261245d565b801561180257506118018261108e565b5b8015611813575061181282610e62565b5b9050919050565b60606001805461182990613bb4565b80601f016020809104026020016040519081016040528092919081815260200182805461185590613bb4565b80156118a25780601f10611877576101008083540402835291602001916118a2565b820191906000526020600020905b81548152906001019060200180831161188557829003601f168201915b5050505050905090565b6118b4611f82565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191990614302565b60405180910390fd5b806005600061192f611f82565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119dc611f82565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a219190613255565b60405180910390a35050565b611a35611f82565b73ffffffffffffffffffffffffffffffffffffffff16611a536117bc565b73ffffffffffffffffffffffffffffffffffffffff1614611aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa090613e7a565b60405180910390fd5b611ab281612476565b50565b611ac6611ac0611f82565b83612043565b611b05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afc90613e0e565b60405180910390fd5b611b11848484846124ba565b50505050565b60606000611b2483612516565b90506000815111611b445760405180602001604052806000815250611b65565b80604051602001611b5591906143aa565b6040516020818303038152906040525b915050919050565b611b768161245d565b611bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bac90614418565b60405180910390fd5b600c60009054906101000a900460ff16611c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfb9061397a565b60405180910390fd5b611c0d81610e62565b611c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4390614484565b60405180910390fd5b611c563382611ef8565b50565b611c61611f82565b73ffffffffffffffffffffffffffffffffffffffff16611c7f6117bc565b73ffffffffffffffffffffffffffffffffffffffff1614611cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccc90613e7a565b60405180910390fd5b6000600c60006101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d8e611f82565b73ffffffffffffffffffffffffffffffffffffffff16611dac6117bc565b73ffffffffffffffffffffffffffffffffffffffff1614611e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df990613e7a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6990614516565b60405180910390fd5b611e7b81612397565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ef15750611ef0826125bd565b5b9050919050565b611f1282826040518060200160405280600081525061269f565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ffd83611345565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061204e82611f16565b61208d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612084906145a8565b60405180910390fd5b600061209883611345565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061210757508373ffffffffffffffffffffffffffffffffffffffff166120ef84610a94565b73ffffffffffffffffffffffffffffffffffffffff16145b8061211857506121178185611cf2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661214182611345565b73ffffffffffffffffffffffffffffffffffffffff1614612197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218e9061463a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fe906146cc565b60405180910390fd5b6122128383836126fa565b61221d600082611f8a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461226d91906146ec565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122c49190614720565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b80600d90805190602001906123939291906130fe565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808211801561246f575061271182105b9050919050565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6124c5848484612121565b6124d18484848461270a565b612510576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612507906147e8565b60405180910390fd5b50505050565b606061252182611f16565b612560576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125579061487a565b60405180910390fd5b600061256a6128a1565b9050600081511161258a57604051806020016040528060008152506125b5565b8061259484612933565b6040516020016125a592919061489a565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061268857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612698575061269782612a94565b5b9050919050565b6126a98383612afe565b6126b6600084848461270a565b6126f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ec906147e8565b60405180910390fd5b505050565b612705838383612ccc565b505050565b600061272b8473ffffffffffffffffffffffffffffffffffffffff16612de0565b15612894578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612754611f82565b8786866040518563ffffffff1660e01b81526004016127769493929190614913565b602060405180830381600087803b15801561279057600080fd5b505af19250505080156127c157506040513d601f19601f820116820180604052508101906127be9190614974565b60015b612844573d80600081146127f1576040519150601f19603f3d011682016040523d82523d6000602084013e6127f6565b606091505b5060008151141561283c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612833906147e8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612899565b600190505b949350505050565b6060600d80546128b090613bb4565b80601f01602080910402602001604051908101604052809291908181526020018280546128dc90613bb4565b80156129295780601f106128fe57610100808354040283529160200191612929565b820191906000526020600020905b81548152906001019060200180831161290c57829003601f168201915b5050505050905090565b6060600082141561297b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a8f565b600082905060005b600082146129ad57808061299690613b3c565b915050600a826129a691906149d0565b9150612983565b60008167ffffffffffffffff8111156129c9576129c86134dd565b5b6040519080825280601f01601f1916602001820160405280156129fb5781602001600182028036833780820191505090505b5090505b60008514612a8857600182612a1491906146ec565b9150600a85612a239190614a01565b6030612a2f9190614720565b60f81b818381518110612a4557612a44613ade565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a8191906149d0565b94506129ff565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6590614a7e565b60405180910390fd5b612b7781611f16565b15612bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bae90614aea565b60405180910390fd5b612bc3600083836126fa565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c139190614720565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612cd7838383612df3565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d1a57612d1581612df8565b612d59565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612d5857612d578382612e41565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d9c57612d9781612fae565b612ddb565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612dda57612dd9828261307f565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612e4e846113f7565b612e5891906146ec565b9050600060076000848152602001908152602001600020549050818114612f3d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612fc291906146ec565b9050600060096000848152602001908152602001600020549050600060088381548110612ff257612ff1613ade565b5b90600052602060002001549050806008838154811061301457613013613ade565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061306357613062614b0a565b5b6001900381819060005260206000200160009055905550505050565b600061308a836113f7565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461310a90613bb4565b90600052602060002090601f01602090048101928261312c5760008555613173565b82601f1061314557805160ff1916838001178555613173565b82800160010185558215613173579182015b82811115613172578251825591602001919060010190613157565b5b5090506131809190613184565b5090565b5b8082111561319d576000816000905550600101613185565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131ea816131b5565b81146131f557600080fd5b50565b600081359050613207816131e1565b92915050565b600060208284031215613223576132226131ab565b5b6000613231848285016131f8565b91505092915050565b60008115159050919050565b61324f8161323a565b82525050565b600060208201905061326a6000830184613246565b92915050565b6000819050919050565b61328381613270565b811461328e57600080fd5b50565b6000813590506132a08161327a565b92915050565b6000602082840312156132bc576132bb6131ab565b5b60006132ca84828501613291565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561330d5780820151818401526020810190506132f2565b8381111561331c576000848401525b50505050565b6000601f19601f8301169050919050565b600061333e826132d3565b61334881856132de565b93506133588185602086016132ef565b61336181613322565b840191505092915050565b600060208201905081810360008301526133868184613333565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133b98261338e565b9050919050565b6133c9816133ae565b82525050565b60006020820190506133e460008301846133c0565b92915050565b6133f3816133ae565b81146133fe57600080fd5b50565b600081359050613410816133ea565b92915050565b6000806040838503121561342d5761342c6131ab565b5b600061343b85828601613401565b925050602061344c85828601613291565b9150509250929050565b61345f81613270565b82525050565b600060208201905061347a6000830184613456565b92915050565b600080600060608486031215613499576134986131ab565b5b60006134a786828701613401565b93505060206134b886828701613401565b92505060406134c986828701613291565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61351582613322565b810181811067ffffffffffffffff82111715613534576135336134dd565b5b80604052505050565b60006135476131a1565b9050613553828261350c565b919050565b600067ffffffffffffffff821115613573576135726134dd565b5b61357c82613322565b9050602081019050919050565b82818337600083830152505050565b60006135ab6135a684613558565b61353d565b9050828152602081018484840111156135c7576135c66134d8565b5b6135d2848285613589565b509392505050565b600082601f8301126135ef576135ee6134d3565b5b81356135ff848260208601613598565b91505092915050565b60006020828403121561361e5761361d6131ab565b5b600082013567ffffffffffffffff81111561363c5761363b6131b0565b5b613648848285016135da565b91505092915050565b600060208284031215613667576136666131ab565b5b600061367584828501613401565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6136b381613270565b82525050565b60006136c583836136aa565b60208301905092915050565b6000602082019050919050565b60006136e98261367e565b6136f38185613689565b93506136fe8361369a565b8060005b8381101561372f57815161371688826136b9565b9750613721836136d1565b925050600181019050613702565b5085935050505092915050565b6000602082019050818103600083015261375681846136de565b905092915050565b6137678161323a565b811461377257600080fd5b50565b6000813590506137848161375e565b92915050565b600080604083850312156137a1576137a06131ab565b5b60006137af85828601613401565b92505060206137c085828601613775565b9150509250929050565b600067ffffffffffffffff8211156137e5576137e46134dd565b5b6137ee82613322565b9050602081019050919050565b600061380e613809846137ca565b61353d565b90508281526020810184848401111561382a576138296134d8565b5b613835848285613589565b509392505050565b600082601f830112613852576138516134d3565b5b81356138628482602086016137fb565b91505092915050565b60008060008060808587031215613885576138846131ab565b5b600061389387828801613401565b94505060206138a487828801613401565b93505060406138b587828801613291565b925050606085013567ffffffffffffffff8111156138d6576138d56131b0565b5b6138e28782880161383d565b91505092959194509250565b60008060408385031215613905576139046131ab565b5b600061391385828601613401565b925050602061392485828601613401565b9150509250929050565b7f4e4f5f5354415254000000000000000000000000000000000000000000000000600082015250565b60006139646008836132de565b915061396f8261392e565b602082019050919050565b6000602082019050818103600083015261399381613957565b9050919050565b7f4e4f5f4d494e5400000000000000000000000000000000000000000000000000600082015250565b60006139d06007836132de565b91506139db8261399a565b602082019050919050565b600060208201905081810360008301526139ff816139c3565b9050919050565b7f544f4f5f4d554348000000000000000000000000000000000000000000000000600082015250565b6000613a3c6008836132de565b9150613a4782613a06565b602082019050919050565b60006020820190508181036000830152613a6b81613a2f565b9050919050565b7f5a45524f5f414d4f554e54000000000000000000000000000000000000000000600082015250565b6000613aa8600b836132de565b9150613ab382613a72565b602082019050919050565b60006020820190508181036000830152613ad781613a9b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b4782613270565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b7a57613b79613b0d565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613bcc57607f821691505b60208210811415613be057613bdf613b85565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613c42602c836132de565b9150613c4d82613be6565b604082019050919050565b60006020820190508181036000830152613c7181613c35565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613cd46021836132de565b9150613cdf82613c78565b604082019050919050565b60006020820190508181036000830152613d0381613cc7565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613d666038836132de565b9150613d7182613d0a565b604082019050919050565b60006020820190508181036000830152613d9581613d59565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613df86031836132de565b9150613e0382613d9c565b604082019050919050565b60006020820190508181036000830152613e2781613deb565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e646020836132de565b9150613e6f82613e2e565b602082019050919050565b60006020820190508181036000830152613e9381613e57565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613ef6602b836132de565b9150613f0182613e9a565b604082019050919050565b60006020820190508181036000830152613f2581613ee9565b9050919050565b600081519050613f3b816133ea565b92915050565b600060208284031215613f5757613f566131ab565b5b6000613f6584828501613f2c565b91505092915050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613fca602c836132de565b9150613fd582613f6e565b604082019050919050565b60006020820190508181036000830152613ff981613fbd565b9050919050565b600067ffffffffffffffff82111561401b5761401a6134dd565b5b602082029050602081019050919050565b600080fd5b6000815190506140408161327a565b92915050565b600061405961405484614000565b61353d565b9050808382526020820190506020840283018581111561407c5761407b61402c565b5b835b818110156140a557806140918882614031565b84526020840193505060208101905061407e565b5050509392505050565b600082601f8301126140c4576140c36134d3565b5b81516140d4848260208601614046565b91505092915050565b6000602082840312156140f3576140f26131ab565b5b600082015167ffffffffffffffff811115614111576141106131b0565b5b61411d848285016140af565b91505092915050565b7f4e4f5f5347420000000000000000000000000000000000000000000000000000600082015250565b600061415c6006836132de565b915061416782614126565b602082019050919050565b6000602082019050818103600083015261418b8161414f565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006141ee6029836132de565b91506141f982614192565b604082019050919050565b6000602082019050818103600083015261421d816141e1565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614280602a836132de565b915061428b82614224565b604082019050919050565b600060208201905081810360008301526142af81614273565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006142ec6019836132de565b91506142f7826142b6565b602082019050919050565b6000602082019050818103600083015261431b816142df565b9050919050565b600081905092915050565b6000614338826132d3565b6143428185614322565b93506143528185602086016132ef565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614394600583614322565b915061439f8261435e565b600582019050919050565b60006143b6828461432d565b91506143c182614387565b915081905092915050565b7f494e56414c49445f494400000000000000000000000000000000000000000000600082015250565b6000614402600a836132de565b915061440d826143cc565b602082019050919050565b60006020820190508181036000830152614431816143f5565b9050919050565b7f4e4f5f4f574e0000000000000000000000000000000000000000000000000000600082015250565b600061446e6006836132de565b915061447982614438565b602082019050919050565b6000602082019050818103600083015261449d81614461565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006145006026836132de565b915061450b826144a4565b604082019050919050565b6000602082019050818103600083015261452f816144f3565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614592602c836132de565b915061459d82614536565b604082019050919050565b600060208201905081810360008301526145c181614585565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006146246029836132de565b915061462f826145c8565b604082019050919050565b6000602082019050818103600083015261465381614617565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006146b66024836132de565b91506146c18261465a565b604082019050919050565b600060208201905081810360008301526146e5816146a9565b9050919050565b60006146f782613270565b915061470283613270565b92508282101561471557614714613b0d565b5b828203905092915050565b600061472b82613270565b915061473683613270565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561476b5761476a613b0d565b5b828201905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006147d26032836132de565b91506147dd82614776565b604082019050919050565b60006020820190508181036000830152614801816147c5565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614864602f836132de565b915061486f82614808565b604082019050919050565b6000602082019050818103600083015261489381614857565b9050919050565b60006148a6828561432d565b91506148b2828461432d565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b60006148e5826148be565b6148ef81856148c9565b93506148ff8185602086016132ef565b61490881613322565b840191505092915050565b600060808201905061492860008301876133c0565b61493560208301866133c0565b6149426040830185613456565b818103606083015261495481846148da565b905095945050505050565b60008151905061496e816131e1565b92915050565b60006020828403121561498a576149896131ab565b5b60006149988482850161495f565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006149db82613270565b91506149e683613270565b9250826149f6576149f56149a1565b5b828204905092915050565b6000614a0c82613270565b9150614a1783613270565b925082614a2757614a266149a1565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614a686020836132de565b9150614a7382614a32565b602082019050919050565b60006020820190508181036000830152614a9781614a5b565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614ad4601c836132de565b9150614adf82614a9e565b602082019050919050565b60006020820190508181036000830152614b0381614ac7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220938d8814f729e13bc4d4814908cb0627855f5a022e1c04f5b20031357c725e0564736f6c634300080900330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000335eeef8e93a7a757d9e7912044d9cd264e2b2d8000000000000000000000000000000000000000000000000000000000000002968747470733a2f2f736b656c65746f6e677565732e7361646769726c736261722e696f2f6a736f6e2f0000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101f95760003560e01c80636352211e1161010d57806395d89b41116100a0578063c87b56dd1161006f578063c87b56dd1461075a578063cb3cb5c414610797578063cd85cdb5146107c0578063e985e9c5146107d7578063f2fde38b14610814576101f9565b806395d89b41146106b4578063a22cb465146106df578063b7864c4d14610708578063b88d4fde14610731576101f9565b8063853828b6116100dc578063853828b6146106055780638ab9f5a71461060f5780638da5cb5b1461064c578063929eea5e14610677576101f9565b80636352211e1461053757806370a0823114610574578063715018a6146105b15780638462151c146105c8576101f9565b80632be09561116101905780634f6ccce71161015f5780634f6ccce71461042c578063544736e61461046957806355f804b3146104945780635fe1113d146104bd578063628abf0f146104fa576101f9565b80632be09561146103725780632f745c59146103895780633870c761146103c657806342842e0e14610403576101f9565b8063095ea7b3116101cc578063095ea7b3146102cc57806318160ddd146102f557806323b872dd146103205780632b26a6bf14610349576101f9565b806301ffc9a7146101fe578063059513a61461023b57806306fdde0314610264578063081812fc1461028f575b600080fd5b34801561020a57600080fd5b506102256004803603810190610220919061320d565b61083d565b6040516102329190613255565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d91906132a6565b61084f565b005b34801561027057600080fd5b50610279610a02565b604051610286919061336c565b60405180910390f35b34801561029b57600080fd5b506102b660048036038101906102b191906132a6565b610a94565b6040516102c391906133cf565b60405180910390f35b3480156102d857600080fd5b506102f360048036038101906102ee9190613416565b610b19565b005b34801561030157600080fd5b5061030a610c31565b6040516103179190613465565b60405180910390f35b34801561032c57600080fd5b5061034760048036038101906103429190613480565b610c3e565b005b34801561035557600080fd5b50610370600480360381019061036b91906132a6565b610c9e565b005b34801561037e57600080fd5b50610387610d24565b005b34801561039557600080fd5b506103b060048036038101906103ab9190613416565b610dbd565b6040516103bd9190613465565b60405180910390f35b3480156103d257600080fd5b506103ed60048036038101906103e891906132a6565b610e62565b6040516103fa9190613255565b60405180910390f35b34801561040f57600080fd5b5061042a60048036038101906104259190613480565b610f62565b005b34801561043857600080fd5b50610453600480360381019061044e91906132a6565b610f82565b6040516104609190613465565b60405180910390f35b34801561047557600080fd5b5061047e610ff3565b60405161048b9190613255565b60405180910390f35b3480156104a057600080fd5b506104bb60048036038101906104b69190613608565b611006565b005b3480156104c957600080fd5b506104e460048036038101906104df91906132a6565b61108e565b6040516104f19190613255565b60405180910390f35b34801561050657600080fd5b50610521600480360381019061051c9190613651565b6110a1565b60405161052e919061373c565b60405180910390f35b34801561054357600080fd5b5061055e600480360381019061055991906132a6565b611345565b60405161056b91906133cf565b60405180910390f35b34801561058057600080fd5b5061059b60048036038101906105969190613651565b6113f7565b6040516105a89190613465565b60405180910390f35b3480156105bd57600080fd5b506105c66114af565b005b3480156105d457600080fd5b506105ef60048036038101906105ea9190613651565b611537565b6040516105fc919061373c565b60405180910390f35b61060d611641565b005b34801561061b57600080fd5b5061063660048036038101906106319190613651565b6116fd565b604051610643919061373c565b60405180910390f35b34801561065857600080fd5b506106616117bc565b60405161066e91906133cf565b60405180910390f35b34801561068357600080fd5b5061069e600480360381019061069991906132a6565b6117e6565b6040516106ab9190613255565b60405180910390f35b3480156106c057600080fd5b506106c961181a565b6040516106d6919061336c565b60405180910390f35b3480156106eb57600080fd5b506107066004803603810190610701919061378a565b6118ac565b005b34801561071457600080fd5b5061072f600480360381019061072a9190613651565b611a2d565b005b34801561073d57600080fd5b506107586004803603810190610753919061386b565b611ab5565b005b34801561076657600080fd5b50610781600480360381019061077c91906132a6565b611b17565b60405161078e919061336c565b60405180910390f35b3480156107a357600080fd5b506107be60048036038101906107b991906132a6565b611b6d565b005b3480156107cc57600080fd5b506107d5611c59565b005b3480156107e357600080fd5b506107fe60048036038101906107f991906138ee565b611cf2565b60405161080b9190613255565b60405180910390f35b34801561082057600080fd5b5061083b60048036038101906108369190613651565b611d86565b005b600061084882611e7e565b9050919050565b600c60009054906101000a900460ff1661089e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108959061397a565b60405180910390fd5b60006108a9336110a1565b905060008151116108ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e6906139e6565b60405180910390fd5b600f54821115610934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092b90613a52565b60405180910390fd5b8051821115610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096f90613a52565b60405180910390fd5b600082116109bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b290613abe565b60405180910390fd5b60005b828110156109fd576109ea338383815181106109dd576109dc613ade565b5b6020026020010151611ef8565b80806109f590613b3c565b9150506109be565b505050565b606060008054610a1190613bb4565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3d90613bb4565b8015610a8a5780601f10610a5f57610100808354040283529160200191610a8a565b820191906000526020600020905b815481529060010190602001808311610a6d57829003601f168201915b5050505050905090565b6000610a9f82611f16565b610ade576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad590613c58565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b2482611345565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8c90613cea565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bb4611f82565b73ffffffffffffffffffffffffffffffffffffffff161480610be35750610be281610bdd611f82565b611cf2565b5b610c22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1990613d7c565b60405180910390fd5b610c2c8383611f8a565b505050565b6000600880549050905090565b610c4f610c49611f82565b82612043565b610c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8590613e0e565b60405180910390fd5b610c99838383612121565b505050565b610ca6611f82565b73ffffffffffffffffffffffffffffffffffffffff16610cc46117bc565b73ffffffffffffffffffffffffffffffffffffffff1614610d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1190613e7a565b60405180910390fd5b80600f8190555050565b610d2c611f82565b73ffffffffffffffffffffffffffffffffffffffff16610d4a6117bc565b73ffffffffffffffffffffffffffffffffffffffff1614610da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9790613e7a565b60405180910390fd5b6001600c60006101000a81548160ff021916908315150217905550565b6000610dc8836113f7565b8210610e09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0090613f0c565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b8152600401610ec59190613465565b60206040518083038186803b158015610edd57600080fd5b505afa158015610ef1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f159190613f41565b90503273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f5657600192505050610f5d565b6000925050505b919050565b610f7d83838360405180602001604052806000815250611ab5565b505050565b6000610f8c610c31565b8210610fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc490613fe0565b60405180910390fd5b60088281548110610fe157610fe0613ade565b5b90600052602060002001549050919050565b600c60009054906101000a900460ff1681565b61100e611f82565b73ffffffffffffffffffffffffffffffffffffffff1661102c6117bc565b73ffffffffffffffffffffffffffffffffffffffff1614611082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107990613e7a565b60405180910390fd5b61108b8161237d565b50565b600061109982611f16565b159050919050565b60606000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff16638462151c856040518263ffffffff1660e01b815260040161110591906133cf565b60006040518083038186803b15801561111d57600080fd5b505afa158015611131573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061115a91906140dd565b905060008151116111a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119790614172565b60405180910390fd5b6000600f5467ffffffffffffffff8111156111be576111bd6134dd565b5b6040519080825280602002602001820160405280156111ec5781602001602082028036833780820191505090505b509050600080600090505b83518110156112915761122384828151811061121657611215613ade565b5b6020026020010151611f16565b61127e5783818151811061123a57611239613ade565b5b602002602001015183838151811061125557611254613ade565b5b602002602001018181525050818061126c90613b3c565b925050600f54821061127d57611291565b5b808061128990613b3c565b9150506111f7565b5060008167ffffffffffffffff8111156112ae576112ad6134dd565b5b6040519080825280602002602001820160405280156112dc5781602001602082028036833780820191505090505b50905060005b82811015611337578381815181106112fd576112fc613ade565b5b602002602001015182828151811061131857611317613ade565b5b602002602001018181525050808061132f90613b3c565b9150506112e2565b508095505050505050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e590614204565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145f90614296565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114b7611f82565b73ffffffffffffffffffffffffffffffffffffffff166114d56117bc565b73ffffffffffffffffffffffffffffffffffffffff161461152b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152290613e7a565b60405180910390fd5b6115356000612397565b565b60606000611544836113f7565b905060008114156115a157600067ffffffffffffffff81111561156a576115696134dd565b5b6040519080825280602002602001820160405280156115985781602001602082028036833780820191505090505b5091505061163c565b60008167ffffffffffffffff8111156115bd576115bc6134dd565b5b6040519080825280602002602001820160405280156115eb5781602001602082028036833780820191505090505b50905060005b82811015611635576116038582610dbd565b82828151811061161657611615613ade565b5b602002602001018181525050808061162d90613b3c565b9150506115f1565b8193505050505b919050565b611649611f82565b73ffffffffffffffffffffffffffffffffffffffff166116676117bc565b73ffffffffffffffffffffffffffffffffffffffff16146116bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b490613e7a565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050506116fb57600080fd5b565b60606000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff16638462151c846040518263ffffffff1660e01b815260040161175f91906133cf565b60006040518083038186803b15801561177757600080fd5b505afa15801561178b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906117b491906140dd565b915050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006117f18261245d565b801561180257506118018261108e565b5b8015611813575061181282610e62565b5b9050919050565b60606001805461182990613bb4565b80601f016020809104026020016040519081016040528092919081815260200182805461185590613bb4565b80156118a25780601f10611877576101008083540402835291602001916118a2565b820191906000526020600020905b81548152906001019060200180831161188557829003601f168201915b5050505050905090565b6118b4611f82565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191990614302565b60405180910390fd5b806005600061192f611f82565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119dc611f82565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a219190613255565b60405180910390a35050565b611a35611f82565b73ffffffffffffffffffffffffffffffffffffffff16611a536117bc565b73ffffffffffffffffffffffffffffffffffffffff1614611aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa090613e7a565b60405180910390fd5b611ab281612476565b50565b611ac6611ac0611f82565b83612043565b611b05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afc90613e0e565b60405180910390fd5b611b11848484846124ba565b50505050565b60606000611b2483612516565b90506000815111611b445760405180602001604052806000815250611b65565b80604051602001611b5591906143aa565b6040516020818303038152906040525b915050919050565b611b768161245d565b611bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bac90614418565b60405180910390fd5b600c60009054906101000a900460ff16611c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfb9061397a565b60405180910390fd5b611c0d81610e62565b611c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4390614484565b60405180910390fd5b611c563382611ef8565b50565b611c61611f82565b73ffffffffffffffffffffffffffffffffffffffff16611c7f6117bc565b73ffffffffffffffffffffffffffffffffffffffff1614611cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccc90613e7a565b60405180910390fd5b6000600c60006101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d8e611f82565b73ffffffffffffffffffffffffffffffffffffffff16611dac6117bc565b73ffffffffffffffffffffffffffffffffffffffff1614611e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df990613e7a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6990614516565b60405180910390fd5b611e7b81612397565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ef15750611ef0826125bd565b5b9050919050565b611f1282826040518060200160405280600081525061269f565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ffd83611345565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061204e82611f16565b61208d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612084906145a8565b60405180910390fd5b600061209883611345565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061210757508373ffffffffffffffffffffffffffffffffffffffff166120ef84610a94565b73ffffffffffffffffffffffffffffffffffffffff16145b8061211857506121178185611cf2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661214182611345565b73ffffffffffffffffffffffffffffffffffffffff1614612197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218e9061463a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fe906146cc565b60405180910390fd5b6122128383836126fa565b61221d600082611f8a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461226d91906146ec565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122c49190614720565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b80600d90805190602001906123939291906130fe565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808211801561246f575061271182105b9050919050565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6124c5848484612121565b6124d18484848461270a565b612510576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612507906147e8565b60405180910390fd5b50505050565b606061252182611f16565b612560576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125579061487a565b60405180910390fd5b600061256a6128a1565b9050600081511161258a57604051806020016040528060008152506125b5565b8061259484612933565b6040516020016125a592919061489a565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061268857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612698575061269782612a94565b5b9050919050565b6126a98383612afe565b6126b6600084848461270a565b6126f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ec906147e8565b60405180910390fd5b505050565b612705838383612ccc565b505050565b600061272b8473ffffffffffffffffffffffffffffffffffffffff16612de0565b15612894578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612754611f82565b8786866040518563ffffffff1660e01b81526004016127769493929190614913565b602060405180830381600087803b15801561279057600080fd5b505af19250505080156127c157506040513d601f19601f820116820180604052508101906127be9190614974565b60015b612844573d80600081146127f1576040519150601f19603f3d011682016040523d82523d6000602084013e6127f6565b606091505b5060008151141561283c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612833906147e8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612899565b600190505b949350505050565b6060600d80546128b090613bb4565b80601f01602080910402602001604051908101604052809291908181526020018280546128dc90613bb4565b80156129295780601f106128fe57610100808354040283529160200191612929565b820191906000526020600020905b81548152906001019060200180831161290c57829003601f168201915b5050505050905090565b6060600082141561297b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a8f565b600082905060005b600082146129ad57808061299690613b3c565b915050600a826129a691906149d0565b9150612983565b60008167ffffffffffffffff8111156129c9576129c86134dd565b5b6040519080825280601f01601f1916602001820160405280156129fb5781602001600182028036833780820191505090505b5090505b60008514612a8857600182612a1491906146ec565b9150600a85612a239190614a01565b6030612a2f9190614720565b60f81b818381518110612a4557612a44613ade565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a8191906149d0565b94506129ff565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6590614a7e565b60405180910390fd5b612b7781611f16565b15612bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bae90614aea565b60405180910390fd5b612bc3600083836126fa565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c139190614720565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612cd7838383612df3565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d1a57612d1581612df8565b612d59565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612d5857612d578382612e41565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d9c57612d9781612fae565b612ddb565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612dda57612dd9828261307f565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612e4e846113f7565b612e5891906146ec565b9050600060076000848152602001908152602001600020549050818114612f3d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612fc291906146ec565b9050600060096000848152602001908152602001600020549050600060088381548110612ff257612ff1613ade565b5b90600052602060002001549050806008838154811061301457613013613ade565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061306357613062614b0a565b5b6001900381819060005260206000200160009055905550505050565b600061308a836113f7565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461310a90613bb4565b90600052602060002090601f01602090048101928261312c5760008555613173565b82601f1061314557805160ff1916838001178555613173565b82800160010185558215613173579182015b82811115613172578251825591602001919060010190613157565b5b5090506131809190613184565b5090565b5b8082111561319d576000816000905550600101613185565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131ea816131b5565b81146131f557600080fd5b50565b600081359050613207816131e1565b92915050565b600060208284031215613223576132226131ab565b5b6000613231848285016131f8565b91505092915050565b60008115159050919050565b61324f8161323a565b82525050565b600060208201905061326a6000830184613246565b92915050565b6000819050919050565b61328381613270565b811461328e57600080fd5b50565b6000813590506132a08161327a565b92915050565b6000602082840312156132bc576132bb6131ab565b5b60006132ca84828501613291565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561330d5780820151818401526020810190506132f2565b8381111561331c576000848401525b50505050565b6000601f19601f8301169050919050565b600061333e826132d3565b61334881856132de565b93506133588185602086016132ef565b61336181613322565b840191505092915050565b600060208201905081810360008301526133868184613333565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133b98261338e565b9050919050565b6133c9816133ae565b82525050565b60006020820190506133e460008301846133c0565b92915050565b6133f3816133ae565b81146133fe57600080fd5b50565b600081359050613410816133ea565b92915050565b6000806040838503121561342d5761342c6131ab565b5b600061343b85828601613401565b925050602061344c85828601613291565b9150509250929050565b61345f81613270565b82525050565b600060208201905061347a6000830184613456565b92915050565b600080600060608486031215613499576134986131ab565b5b60006134a786828701613401565b93505060206134b886828701613401565b92505060406134c986828701613291565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61351582613322565b810181811067ffffffffffffffff82111715613534576135336134dd565b5b80604052505050565b60006135476131a1565b9050613553828261350c565b919050565b600067ffffffffffffffff821115613573576135726134dd565b5b61357c82613322565b9050602081019050919050565b82818337600083830152505050565b60006135ab6135a684613558565b61353d565b9050828152602081018484840111156135c7576135c66134d8565b5b6135d2848285613589565b509392505050565b600082601f8301126135ef576135ee6134d3565b5b81356135ff848260208601613598565b91505092915050565b60006020828403121561361e5761361d6131ab565b5b600082013567ffffffffffffffff81111561363c5761363b6131b0565b5b613648848285016135da565b91505092915050565b600060208284031215613667576136666131ab565b5b600061367584828501613401565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6136b381613270565b82525050565b60006136c583836136aa565b60208301905092915050565b6000602082019050919050565b60006136e98261367e565b6136f38185613689565b93506136fe8361369a565b8060005b8381101561372f57815161371688826136b9565b9750613721836136d1565b925050600181019050613702565b5085935050505092915050565b6000602082019050818103600083015261375681846136de565b905092915050565b6137678161323a565b811461377257600080fd5b50565b6000813590506137848161375e565b92915050565b600080604083850312156137a1576137a06131ab565b5b60006137af85828601613401565b92505060206137c085828601613775565b9150509250929050565b600067ffffffffffffffff8211156137e5576137e46134dd565b5b6137ee82613322565b9050602081019050919050565b600061380e613809846137ca565b61353d565b90508281526020810184848401111561382a576138296134d8565b5b613835848285613589565b509392505050565b600082601f830112613852576138516134d3565b5b81356138628482602086016137fb565b91505092915050565b60008060008060808587031215613885576138846131ab565b5b600061389387828801613401565b94505060206138a487828801613401565b93505060406138b587828801613291565b925050606085013567ffffffffffffffff8111156138d6576138d56131b0565b5b6138e28782880161383d565b91505092959194509250565b60008060408385031215613905576139046131ab565b5b600061391385828601613401565b925050602061392485828601613401565b9150509250929050565b7f4e4f5f5354415254000000000000000000000000000000000000000000000000600082015250565b60006139646008836132de565b915061396f8261392e565b602082019050919050565b6000602082019050818103600083015261399381613957565b9050919050565b7f4e4f5f4d494e5400000000000000000000000000000000000000000000000000600082015250565b60006139d06007836132de565b91506139db8261399a565b602082019050919050565b600060208201905081810360008301526139ff816139c3565b9050919050565b7f544f4f5f4d554348000000000000000000000000000000000000000000000000600082015250565b6000613a3c6008836132de565b9150613a4782613a06565b602082019050919050565b60006020820190508181036000830152613a6b81613a2f565b9050919050565b7f5a45524f5f414d4f554e54000000000000000000000000000000000000000000600082015250565b6000613aa8600b836132de565b9150613ab382613a72565b602082019050919050565b60006020820190508181036000830152613ad781613a9b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b4782613270565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b7a57613b79613b0d565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613bcc57607f821691505b60208210811415613be057613bdf613b85565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613c42602c836132de565b9150613c4d82613be6565b604082019050919050565b60006020820190508181036000830152613c7181613c35565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613cd46021836132de565b9150613cdf82613c78565b604082019050919050565b60006020820190508181036000830152613d0381613cc7565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613d666038836132de565b9150613d7182613d0a565b604082019050919050565b60006020820190508181036000830152613d9581613d59565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613df86031836132de565b9150613e0382613d9c565b604082019050919050565b60006020820190508181036000830152613e2781613deb565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e646020836132de565b9150613e6f82613e2e565b602082019050919050565b60006020820190508181036000830152613e9381613e57565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613ef6602b836132de565b9150613f0182613e9a565b604082019050919050565b60006020820190508181036000830152613f2581613ee9565b9050919050565b600081519050613f3b816133ea565b92915050565b600060208284031215613f5757613f566131ab565b5b6000613f6584828501613f2c565b91505092915050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613fca602c836132de565b9150613fd582613f6e565b604082019050919050565b60006020820190508181036000830152613ff981613fbd565b9050919050565b600067ffffffffffffffff82111561401b5761401a6134dd565b5b602082029050602081019050919050565b600080fd5b6000815190506140408161327a565b92915050565b600061405961405484614000565b61353d565b9050808382526020820190506020840283018581111561407c5761407b61402c565b5b835b818110156140a557806140918882614031565b84526020840193505060208101905061407e565b5050509392505050565b600082601f8301126140c4576140c36134d3565b5b81516140d4848260208601614046565b91505092915050565b6000602082840312156140f3576140f26131ab565b5b600082015167ffffffffffffffff811115614111576141106131b0565b5b61411d848285016140af565b91505092915050565b7f4e4f5f5347420000000000000000000000000000000000000000000000000000600082015250565b600061415c6006836132de565b915061416782614126565b602082019050919050565b6000602082019050818103600083015261418b8161414f565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006141ee6029836132de565b91506141f982614192565b604082019050919050565b6000602082019050818103600083015261421d816141e1565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614280602a836132de565b915061428b82614224565b604082019050919050565b600060208201905081810360008301526142af81614273565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006142ec6019836132de565b91506142f7826142b6565b602082019050919050565b6000602082019050818103600083015261431b816142df565b9050919050565b600081905092915050565b6000614338826132d3565b6143428185614322565b93506143528185602086016132ef565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614394600583614322565b915061439f8261435e565b600582019050919050565b60006143b6828461432d565b91506143c182614387565b915081905092915050565b7f494e56414c49445f494400000000000000000000000000000000000000000000600082015250565b6000614402600a836132de565b915061440d826143cc565b602082019050919050565b60006020820190508181036000830152614431816143f5565b9050919050565b7f4e4f5f4f574e0000000000000000000000000000000000000000000000000000600082015250565b600061446e6006836132de565b915061447982614438565b602082019050919050565b6000602082019050818103600083015261449d81614461565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006145006026836132de565b915061450b826144a4565b604082019050919050565b6000602082019050818103600083015261452f816144f3565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614592602c836132de565b915061459d82614536565b604082019050919050565b600060208201905081810360008301526145c181614585565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006146246029836132de565b915061462f826145c8565b604082019050919050565b6000602082019050818103600083015261465381614617565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006146b66024836132de565b91506146c18261465a565b604082019050919050565b600060208201905081810360008301526146e5816146a9565b9050919050565b60006146f782613270565b915061470283613270565b92508282101561471557614714613b0d565b5b828203905092915050565b600061472b82613270565b915061473683613270565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561476b5761476a613b0d565b5b828201905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006147d26032836132de565b91506147dd82614776565b604082019050919050565b60006020820190508181036000830152614801816147c5565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614864602f836132de565b915061486f82614808565b604082019050919050565b6000602082019050818103600083015261489381614857565b9050919050565b60006148a6828561432d565b91506148b2828461432d565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b60006148e5826148be565b6148ef81856148c9565b93506148ff8185602086016132ef565b61490881613322565b840191505092915050565b600060808201905061492860008301876133c0565b61493560208301866133c0565b6149426040830185613456565b818103606083015261495481846148da565b905095945050505050565b60008151905061496e816131e1565b92915050565b60006020828403121561498a576149896131ab565b5b60006149988482850161495f565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006149db82613270565b91506149e683613270565b9250826149f6576149f56149a1565b5b828204905092915050565b6000614a0c82613270565b9150614a1783613270565b925082614a2757614a266149a1565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614a686020836132de565b9150614a7382614a32565b602082019050919050565b60006020820190508181036000830152614a9781614a5b565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614ad4601c836132de565b9150614adf82614a9e565b602082019050919050565b60006020820190508181036000830152614b0381614ac7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220938d8814f729e13bc4d4814908cb0627855f5a022e1c04f5b20031357c725e0564736f6c63430008090033

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

0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000335eeef8e93a7a757d9e7912044d9cd264e2b2d8000000000000000000000000000000000000000000000000000000000000002968747470733a2f2f736b656c65746f6e677565732e7361646769726c736261722e696f2f6a736f6e2f0000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string): https://skeletongues.sadgirlsbar.io/json/
Arg [1] : sgbAddress (address): 0x335eEEF8e93A7A757D9e7912044d9cd264e2b2D8

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 000000000000000000000000335eeef8e93a7a757d9e7912044d9cd264e2b2d8
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000029
Arg [3] : 68747470733a2f2f736b656c65746f6e677565732e7361646769726c73626172
Arg [4] : 2e696f2f6a736f6e2f0000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

55752:5306:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59702:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59063:441;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24787:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26346:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25869:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38303:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27236:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60680:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60791:67;;;;;;;;;;;;;:::i;:::-;;37971:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57212:257;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27646:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38493:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55952:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60476:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57475:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58015:1042;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24481:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24211:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45376:94;;;;;;;;;;;;;:::i;:::-;;56420:472;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60938:117;;;:::i;:::-;;57018:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44725:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57612:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24956:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26639:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60575:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27902:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60201:243;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57770:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60864:68;;;;;;;;;;;;;:::i;:::-;;27005:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45625:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59702:180;59817:4;59840:36;59864:11;59840:23;:36::i;:::-;59833:43;;59702:180;;;:::o;59063:441::-;59122:9;;;;;;;;;;;59114:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;59151:28;59182:26;59197:10;59182:14;:26::i;:::-;59151:57;;59244:1;59223:11;:18;:22;59215:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;59281:13;;59272:7;:22;;59264:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;59331:11;:18;59322:7;:27;;59314:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;59385:1;59377:7;:9;59369:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;59414:9;59409:88;59429:7;59427:1;:9;59409:88;;;59452:37;59462:10;59474:11;59486:1;59474:14;;;;;;;;:::i;:::-;;;;;;;;59452:9;:37::i;:::-;59438:3;;;;;:::i;:::-;;;;59409:88;;;;59107:397;59063:441;:::o;24787:100::-;24841:13;24874:5;24867:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24787:100;:::o;26346:221::-;26422:7;26450:16;26458:7;26450;:16::i;:::-;26442:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26535:15;:24;26551:7;26535:24;;;;;;;;;;;;;;;;;;;;;26528:31;;26346:221;;;:::o;25869:411::-;25950:13;25966:23;25981:7;25966:14;:23::i;:::-;25950:39;;26014:5;26008:11;;:2;:11;;;;26000:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26108:5;26092:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26117:37;26134:5;26141:12;:10;:12::i;:::-;26117:16;:37::i;:::-;26092:62;26070:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26251:21;26260:2;26264:7;26251:8;:21::i;:::-;25939:341;25869:411;;:::o;38303:113::-;38364:7;38391:10;:17;;;;38384:24;;38303:113;:::o;27236:339::-;27431:41;27450:12;:10;:12::i;:::-;27464:7;27431:18;:41::i;:::-;27423:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27539:28;27549:4;27555:2;27559:7;27539:9;:28::i;:::-;27236:339;;;:::o;60680:105::-;44956:12;:10;:12::i;:::-;44945:23;;:7;:5;:7::i;:::-;:23;;;44937:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60767:12:::1;60751:13;:28;;;;60680:105:::0;:::o;60791:67::-;44956:12;:10;:12::i;:::-;44945:23;;:7;:5;:7::i;:::-;:23;;;44937:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60848:4:::1;60836:9;;:16;;;;;;;;;;;;;;;;;;60791:67::o:0;37971:256::-;38068:7;38104:23;38121:5;38104:16;:23::i;:::-;38096:5;:31;38088:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38193:12;:19;38206:5;38193:19;;;;;;;;;;;;;;;:26;38213:5;38193:26;;;;;;;;;;;;38186:33;;37971:256;;;;:::o;57212:257::-;57268:4;57281:21;57323:11;;;;;;;;;;;57281:54;;57342:18;57363:3;:11;;;57375:7;57363:20;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57342:41;;57407:9;57393:23;;:10;:23;;;57390:55;;;57433:4;57426:11;;;;;;57390:55;57458:5;57451:12;;;;57212:257;;;;:::o;27646:185::-;27784:39;27801:4;27807:2;27811:7;27784:39;;;;;;;;;;;;:16;:39::i;:::-;27646:185;;;:::o;38493:233::-;38568:7;38604:30;:28;:30::i;:::-;38596:5;:38;38588:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;38701:10;38712:5;38701:17;;;;;;;;:::i;:::-;;;;;;;;;;38694:24;;38493:233;;;:::o;55952:29::-;;;;;;;;;;;;;:::o;60476:93::-;44956:12;:10;:12::i;:::-;44945:23;;:7;:5;:7::i;:::-;:23;;;44937:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60543:20:::1;60555:7;60543:11;:20::i;:::-;60476:93:::0;:::o;57475:104::-;57537:4;57557:16;57565:7;57557;:16::i;:::-;57556:17;57549:24;;57475:104;;;:::o;58015:1042::-;58076:16;58100:21;58142:11;;;;;;;;;;;58100:54;;58198:31;58232:3;:17;;;58250:6;58232:25;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58198:59;;58296:1;58272:14;:21;:25;58264:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;58342:28;58387:13;;58373:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58342:59;;58430:18;58495:9;58505:1;58495:11;;58490:379;58510:14;:21;58508:1;:23;58490:379;;;58592:26;58600:14;58615:1;58600:17;;;;;;;;:::i;:::-;;;;;;;;58592:7;:26::i;:::-;58587:275;;58701:14;58716:1;58701:17;;;;;;;;:::i;:::-;;;;;;;;58675:11;58687:10;58675:23;;;;;;;;:::i;:::-;;;;;;;:43;;;;;58729:12;;;;;:::i;:::-;;;;58808:13;;58795:10;:26;58791:62;;58836:5;;58791:62;58587:275;58533:3;;;;;:::i;:::-;;;;58490:379;;;;58877:28;58922:10;58908:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58877:56;;58945:9;58940:85;58960:10;58958:1;:12;58940:85;;;59003:11;59015:1;59003:14;;;;;;;;:::i;:::-;;;;;;;;58986:11;58998:1;58986:14;;;;;;;;:::i;:::-;;;;;;;:31;;;;;58972:3;;;;;:::i;:::-;;;;58940:85;;;;59040:11;59033:18;;;;;;;58015:1042;;;:::o;24481:239::-;24553:7;24573:13;24589:7;:16;24597:7;24589:16;;;;;;;;;;;;;;;;;;;;;24573:32;;24641:1;24624:19;;:5;:19;;;;24616:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24707:5;24700:12;;;24481:239;;;:::o;24211:208::-;24283:7;24328:1;24311:19;;:5;:19;;;;24303:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;24395:9;:16;24405:5;24395:16;;;;;;;;;;;;;;;;24388:23;;24211:208;;;:::o;45376:94::-;44956:12;:10;:12::i;:::-;44945:23;;:7;:5;:7::i;:::-;:23;;;44937:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45441:21:::1;45459:1;45441:9;:21::i;:::-;45376:94::o:0;56420:472::-;56481:16;56507:18;56528:17;56538:6;56528:9;:17::i;:::-;56507:38;;56570:1;56556:10;:15;56552:335;;;56635:1;56621:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56614:23;;;;;56552:335;56660:23;56700:10;56686:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56660:51;;56720:13;56742:116;56766:10;56758:5;:18;56742:116;;;56814:34;56834:6;56842:5;56814:19;:34::i;:::-;56798:6;56805:5;56798:13;;;;;;;;:::i;:::-;;;;;;;:50;;;;;56778:7;;;;;:::i;:::-;;;;56742:116;;;56873:6;56866:13;;;;;56420:472;;;;:::o;60938:117::-;44956:12;:10;:12::i;:::-;44945:23;;:7;:5;:7::i;:::-;:23;;;44937:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61009:10:::1;61001:24;;:47;61026:21;61001:47;;;;;;;;;;;;;;;;;;;;;;;60993:56;;;::::0;::::1;;60938:117::o:0;57018:188::-;57080:16;57105:21;57147:11;;;;;;;;;;;57105:54;;57173:3;:17;;;57191:6;57173:25;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57166:32;;;57018:188;;;:::o;44725:87::-;44771:7;44798:6;;;;;;;;;;;44791:13;;44725:87;:::o;57612:152::-;57673:4;57694:15;57701:7;57694:6;:15::i;:::-;:42;;;;;57713:23;57728:7;57713:14;:23::i;:::-;57694:42;:63;;;;;57740:17;57749:7;57740:8;:17::i;:::-;57694:63;57686:72;;57612:152;;;:::o;24956:104::-;25012:13;25045:7;25038:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24956:104;:::o;26639:295::-;26754:12;:10;:12::i;:::-;26742:24;;:8;:24;;;;26734:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;26854:8;26809:18;:32;26828:12;:10;:12::i;:::-;26809:32;;;;;;;;;;;;;;;:42;26842:8;26809:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;26907:8;26878:48;;26893:12;:10;:12::i;:::-;26878:48;;;26917:8;26878:48;;;;;;:::i;:::-;;;;;;;;26639:295;;:::o;60575:99::-;44956:12;:10;:12::i;:::-;44945:23;;:7;:5;:7::i;:::-;:23;;;44937:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60642:26:::1;60657:10;60642:14;:26::i;:::-;60575:99:::0;:::o;27902:328::-;28077:41;28096:12;:10;:12::i;:::-;28110:7;28077:18;:41::i;:::-;28069:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28183:39;28197:4;28203:2;28207:7;28216:5;28183:13;:39::i;:::-;27902:328;;;;:::o;60201:243::-;60274:13;60296:23;60322;60337:7;60322:14;:23::i;:::-;60296:49;;60385:1;60365:9;60359:23;:27;:79;;;;;;;;;;;;;;;;;60413:9;60396:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;60359:79;60352:86;;;60201:243;;;:::o;57770:211::-;57828:15;57835:7;57828:6;:15::i;:::-;57820:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;57873:9;;;;;;;;;;;57865:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;57910:17;57919:7;57910:8;:17::i;:::-;57902:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;57945:30;57955:10;57967:7;57945:9;:30::i;:::-;57770:211;:::o;60864:68::-;44956:12;:10;:12::i;:::-;44945:23;;:7;:5;:7::i;:::-;:23;;;44937:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60921:5:::1;60909:9;;:17;;;;;;;;;;;;;;;;;;60864:68::o:0;27005:164::-;27102:4;27126:18;:25;27145:5;27126:25;;;;;;;;;;;;;;;:35;27152:8;27126:35;;;;;;;;;;;;;;;;;;;;;;;;;27119:42;;27005:164;;;;:::o;45625:192::-;44956:12;:10;:12::i;:::-;44945:23;;:7;:5;:7::i;:::-;:23;;;44937:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45734:1:::1;45714:22;;:8;:22;;;;45706:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45790:19;45800:8;45790:9;:19::i;:::-;45625:192:::0;:::o;37663:224::-;37765:4;37804:35;37789:50;;;:11;:50;;;;:90;;;;37843:36;37867:11;37843:23;:36::i;:::-;37789:90;37782:97;;37663:224;;;:::o;30724:110::-;30800:26;30810:2;30814:7;30800:26;;;;;;;;;;;;:9;:26::i;:::-;30724:110;;:::o;29740:127::-;29805:4;29857:1;29829:30;;:7;:16;29837:7;29829:16;;;;;;;;;;;;;;;;;;;;;:30;;;;29822:37;;29740:127;;;:::o;19546:98::-;19599:7;19626:10;19619:17;;19546:98;:::o;33722:174::-;33824:2;33797:15;:24;33813:7;33797:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33880:7;33876:2;33842:46;;33851:23;33866:7;33851:14;:23::i;:::-;33842:46;;;;;;;;;;;;33722:174;;:::o;30034:348::-;30127:4;30152:16;30160:7;30152;:16::i;:::-;30144:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30228:13;30244:23;30259:7;30244:14;:23::i;:::-;30228:39;;30297:5;30286:16;;:7;:16;;;:51;;;;30330:7;30306:31;;:20;30318:7;30306:11;:20::i;:::-;:31;;;30286:51;:87;;;;30341:32;30358:5;30365:7;30341:16;:32::i;:::-;30286:87;30278:96;;;30034:348;;;;:::o;33026:578::-;33185:4;33158:31;;:23;33173:7;33158:14;:23::i;:::-;:31;;;33150:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33268:1;33254:16;;:2;:16;;;;33246:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33324:39;33345:4;33351:2;33355:7;33324:20;:39::i;:::-;33428:29;33445:1;33449:7;33428:8;:29::i;:::-;33489:1;33470:9;:15;33480:4;33470:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;33518:1;33501:9;:13;33511:2;33501:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33549:2;33530:7;:16;33538:7;33530:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33588:7;33584:2;33569:27;;33578:4;33569:27;;;;;;;;;;;;33026:578;;;:::o;59888:97::-;59972:7;59956:13;:23;;;;;;;;;;;;:::i;:::-;;59888:97;:::o;45825:173::-;45881:16;45900:6;;;;;;;;;;;45881:25;;45926:8;45917:6;;:17;;;;;;;;;;;;;;;;;;45981:8;45950:40;;45971:8;45950:40;;;;;;;;;;;;45870:128;45825:173;:::o;56898:114::-;56954:4;56985:1;56975:7;:11;:30;;;;;57000:5;56990:7;:15;56975:30;56967:39;;56898:114;;;:::o;59991:98::-;60073:10;60059:11;;:24;;;;;;;;;;;;;;;;;;59991:98;:::o;29112:315::-;29269:28;29279:4;29285:2;29289:7;29269:9;:28::i;:::-;29316:48;29339:4;29345:2;29349:7;29358:5;29316:22;:48::i;:::-;29308:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29112:315;;;;:::o;25131:334::-;25204:13;25238:16;25246:7;25238;:16::i;:::-;25230:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;25319:21;25343:10;:8;:10::i;:::-;25319:34;;25395:1;25377:7;25371:21;:25;:86;;;;;;;;;;;;;;;;;25423:7;25432:18;:7;:16;:18::i;:::-;25406:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25371:86;25364:93;;;25131:334;;;:::o;23842:305::-;23944:4;23996:25;23981:40;;;:11;:40;;;;:105;;;;24053:33;24038:48;;;:11;:48;;;;23981:105;:158;;;;24103:36;24127:11;24103:23;:36::i;:::-;23981:158;23961:178;;23842:305;;;:::o;31061:321::-;31191:18;31197:2;31201:7;31191:5;:18::i;:::-;31242:54;31273:1;31277:2;31281:7;31290:5;31242:22;:54::i;:::-;31220:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31061:321;;;:::o;59512:184::-;59645:45;59672:4;59678:2;59682:7;59645:26;:45::i;:::-;59512:184;;;:::o;34461:799::-;34616:4;34637:15;:2;:13;;;:15::i;:::-;34633:620;;;34689:2;34673:36;;;34710:12;:10;:12::i;:::-;34724:4;34730:7;34739:5;34673:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34669:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34932:1;34915:6;:13;:18;34911:272;;;34958:60;;;;;;;;;;:::i;:::-;;;;;;;;34911:272;35133:6;35127:13;35118:6;35114:2;35110:15;35103:38;34669:529;34806:41;;;34796:51;;;:6;:51;;;;34789:58;;;;;34633:620;35237:4;35230:11;;34461:799;;;;;;;:::o;60095:100::-;60147:13;60176;60169:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60095:100;:::o;19990:723::-;20046:13;20276:1;20267:5;:10;20263:53;;;20294:10;;;;;;;;;;;;;;;;;;;;;20263:53;20326:12;20341:5;20326:20;;20357:14;20382:78;20397:1;20389:4;:9;20382:78;;20415:8;;;;;:::i;:::-;;;;20446:2;20438:10;;;;;:::i;:::-;;;20382:78;;;20470:19;20502:6;20492:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20470:39;;20520:154;20536:1;20527:5;:10;20520:154;;20564:1;20554:11;;;;;:::i;:::-;;;20631:2;20623:5;:10;;;;:::i;:::-;20610:2;:24;;;;:::i;:::-;20597:39;;20580:6;20587;20580:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;20660:2;20651:11;;;;;:::i;:::-;;;20520:154;;;20698:6;20684:21;;;;;19990:723;;;;:::o;22451:157::-;22536:4;22575:25;22560:40;;;:11;:40;;;;22553:47;;22451:157;;;:::o;31718:382::-;31812:1;31798:16;;:2;:16;;;;31790:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;31871:16;31879:7;31871;:16::i;:::-;31870:17;31862:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31933:45;31962:1;31966:2;31970:7;31933:20;:45::i;:::-;32008:1;31991:9;:13;32001:2;31991:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32039:2;32020:7;:16;32028:7;32020:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32084:7;32080:2;32059:33;;32076:1;32059:33;;;;;;;;;;;;31718:382;;:::o;39339:589::-;39483:45;39510:4;39516:2;39520:7;39483:26;:45::i;:::-;39561:1;39545:18;;:4;:18;;;39541:187;;;39580:40;39612:7;39580:31;:40::i;:::-;39541:187;;;39650:2;39642:10;;:4;:10;;;39638:90;;39669:47;39702:4;39708:7;39669:32;:47::i;:::-;39638:90;39541:187;39756:1;39742:16;;:2;:16;;;39738:183;;;39775:45;39812:7;39775:36;:45::i;:::-;39738:183;;;39848:4;39842:10;;:2;:10;;;39838:83;;39869:40;39897:2;39901:7;39869:27;:40::i;:::-;39838:83;39738:183;39339:589;;;:::o;11671:387::-;11731:4;11939:12;12006:7;11994:20;11986:28;;12049:1;12042:4;:8;12035:15;;;11671:387;;;:::o;35832:126::-;;;;:::o;40651:164::-;40755:10;:17;;;;40728:15;:24;40744:7;40728:24;;;;;;;;;;;:44;;;;40783:10;40799:7;40783:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40651:164;:::o;41442:988::-;41708:22;41758:1;41733:22;41750:4;41733:16;:22::i;:::-;:26;;;;:::i;:::-;41708:51;;41770:18;41791:17;:26;41809:7;41791:26;;;;;;;;;;;;41770:47;;41938:14;41924:10;:28;41920:328;;41969:19;41991:12;:18;42004:4;41991:18;;;;;;;;;;;;;;;:34;42010:14;41991:34;;;;;;;;;;;;41969:56;;42075:11;42042:12;:18;42055:4;42042:18;;;;;;;;;;;;;;;:30;42061:10;42042:30;;;;;;;;;;;:44;;;;42192:10;42159:17;:30;42177:11;42159:30;;;;;;;;;;;:43;;;;41954:294;41920:328;42344:17;:26;42362:7;42344:26;;;;;;;;;;;42337:33;;;42388:12;:18;42401:4;42388:18;;;;;;;;;;;;;;;:34;42407:14;42388:34;;;;;;;;;;;42381:41;;;41523:907;;41442:988;;:::o;42725:1079::-;42978:22;43023:1;43003:10;:17;;;;:21;;;;:::i;:::-;42978:46;;43035:18;43056:15;:24;43072:7;43056:24;;;;;;;;;;;;43035:45;;43407:19;43429:10;43440:14;43429:26;;;;;;;;:::i;:::-;;;;;;;;;;43407:48;;43493:11;43468:10;43479;43468:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;43604:10;43573:15;:28;43589:11;43573:28;;;;;;;;;;;:41;;;;43745:15;:24;43761:7;43745:24;;;;;;;;;;;43738:31;;;43780:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42796:1008;;;42725:1079;:::o;40229:221::-;40314:14;40331:20;40348:2;40331:16;:20::i;:::-;40314:37;;40389:7;40362:12;:16;40375:2;40362:16;;;;;;;;;;;;;;;:24;40379:6;40362:24;;;;;;;;;;;:34;;;;40436:6;40407:17;:26;40425:7;40407:26;;;;;;;;;;;:35;;;;40303:147;40229:221;;:::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:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:122::-;1674:24;1692:5;1674:24;:::i;:::-;1667:5;1664:35;1654:63;;1713:1;1710;1703:12;1654:63;1601:122;:::o;1729:139::-;1775:5;1813:6;1800:20;1791:29;;1829:33;1856:5;1829:33;:::i;:::-;1729:139;;;;:::o;1874:329::-;1933:6;1982:2;1970:9;1961:7;1957:23;1953:32;1950:119;;;1988:79;;:::i;:::-;1950:119;2108:1;2133:53;2178:7;2169:6;2158:9;2154:22;2133:53;:::i;:::-;2123:63;;2079:117;1874:329;;;;:::o;2209:99::-;2261:6;2295:5;2289:12;2279:22;;2209:99;;;:::o;2314:169::-;2398:11;2432:6;2427:3;2420:19;2472:4;2467:3;2463:14;2448:29;;2314:169;;;;:::o;2489:307::-;2557:1;2567:113;2581:6;2578:1;2575:13;2567:113;;;2666:1;2661:3;2657:11;2651:18;2647:1;2642:3;2638:11;2631:39;2603:2;2600:1;2596:10;2591:15;;2567:113;;;2698:6;2695:1;2692:13;2689:101;;;2778:1;2769:6;2764:3;2760:16;2753:27;2689:101;2538:258;2489:307;;;:::o;2802:102::-;2843:6;2894:2;2890:7;2885:2;2878:5;2874:14;2870:28;2860:38;;2802:102;;;:::o;2910:364::-;2998:3;3026:39;3059:5;3026:39;:::i;:::-;3081:71;3145:6;3140:3;3081:71;:::i;:::-;3074:78;;3161:52;3206:6;3201:3;3194:4;3187:5;3183:16;3161:52;:::i;:::-;3238:29;3260:6;3238:29;:::i;:::-;3233:3;3229:39;3222:46;;3002:272;2910:364;;;;:::o;3280:313::-;3393:4;3431:2;3420:9;3416:18;3408:26;;3480:9;3474:4;3470:20;3466:1;3455:9;3451:17;3444:47;3508:78;3581:4;3572:6;3508:78;:::i;:::-;3500:86;;3280:313;;;;:::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:117::-;6024:1;6021;6014:12;6038:117;6147:1;6144;6137:12;6161:180;6209:77;6206:1;6199:88;6306:4;6303:1;6296:15;6330:4;6327:1;6320:15;6347:281;6430:27;6452:4;6430:27;:::i;:::-;6422:6;6418:40;6560:6;6548:10;6545:22;6524:18;6512:10;6509:34;6506:62;6503:88;;;6571:18;;:::i;:::-;6503:88;6611:10;6607:2;6600:22;6390:238;6347:281;;:::o;6634:129::-;6668:6;6695:20;;:::i;:::-;6685:30;;6724:33;6752:4;6744:6;6724:33;:::i;:::-;6634:129;;;:::o;6769:308::-;6831:4;6921:18;6913:6;6910:30;6907:56;;;6943:18;;:::i;:::-;6907:56;6981:29;7003:6;6981:29;:::i;:::-;6973:37;;7065:4;7059;7055:15;7047:23;;6769:308;;;:::o;7083:154::-;7167:6;7162:3;7157;7144:30;7229:1;7220:6;7215:3;7211:16;7204:27;7083:154;;;:::o;7243:412::-;7321:5;7346:66;7362:49;7404:6;7362:49;:::i;:::-;7346:66;:::i;:::-;7337:75;;7435:6;7428:5;7421:21;7473:4;7466:5;7462:16;7511:3;7502:6;7497:3;7493:16;7490:25;7487:112;;;7518:79;;:::i;:::-;7487:112;7608:41;7642:6;7637:3;7632;7608:41;:::i;:::-;7327:328;7243:412;;;;;:::o;7675:340::-;7731:5;7780:3;7773:4;7765:6;7761:17;7757:27;7747:122;;7788:79;;:::i;:::-;7747:122;7905:6;7892:20;7930:79;8005:3;7997:6;7990:4;7982:6;7978:17;7930:79;:::i;:::-;7921:88;;7737:278;7675:340;;;;:::o;8021:509::-;8090:6;8139:2;8127:9;8118:7;8114:23;8110:32;8107:119;;;8145:79;;:::i;:::-;8107:119;8293:1;8282:9;8278:17;8265:31;8323:18;8315:6;8312:30;8309:117;;;8345:79;;:::i;:::-;8309:117;8450:63;8505:7;8496:6;8485:9;8481:22;8450:63;:::i;:::-;8440:73;;8236:287;8021:509;;;;:::o;8536:329::-;8595:6;8644:2;8632:9;8623:7;8619:23;8615:32;8612:119;;;8650:79;;:::i;:::-;8612:119;8770:1;8795:53;8840:7;8831:6;8820:9;8816:22;8795:53;:::i;:::-;8785:63;;8741:117;8536:329;;;;:::o;8871:114::-;8938:6;8972:5;8966:12;8956:22;;8871:114;;;:::o;8991:184::-;9090:11;9124:6;9119:3;9112:19;9164:4;9159:3;9155:14;9140:29;;8991:184;;;;:::o;9181:132::-;9248:4;9271:3;9263:11;;9301:4;9296:3;9292:14;9284:22;;9181:132;;;:::o;9319:108::-;9396:24;9414:5;9396:24;:::i;:::-;9391:3;9384:37;9319:108;;:::o;9433:179::-;9502:10;9523:46;9565:3;9557:6;9523:46;:::i;:::-;9601:4;9596:3;9592:14;9578:28;;9433:179;;;;:::o;9618:113::-;9688:4;9720;9715:3;9711:14;9703:22;;9618:113;;;:::o;9767:732::-;9886:3;9915:54;9963:5;9915:54;:::i;:::-;9985:86;10064:6;10059:3;9985:86;:::i;:::-;9978:93;;10095:56;10145:5;10095:56;:::i;:::-;10174:7;10205:1;10190:284;10215:6;10212:1;10209:13;10190:284;;;10291:6;10285:13;10318:63;10377:3;10362:13;10318:63;:::i;:::-;10311:70;;10404:60;10457:6;10404:60;:::i;:::-;10394:70;;10250:224;10237:1;10234;10230:9;10225:14;;10190:284;;;10194:14;10490:3;10483:10;;9891:608;;;9767:732;;;;:::o;10505:373::-;10648:4;10686:2;10675:9;10671:18;10663:26;;10735:9;10729:4;10725:20;10721:1;10710:9;10706:17;10699:47;10763:108;10866:4;10857:6;10763:108;:::i;:::-;10755:116;;10505:373;;;;:::o;10884:116::-;10954:21;10969:5;10954:21;:::i;:::-;10947:5;10944:32;10934:60;;10990:1;10987;10980:12;10934:60;10884:116;:::o;11006:133::-;11049:5;11087:6;11074:20;11065:29;;11103:30;11127:5;11103:30;:::i;:::-;11006:133;;;;:::o;11145:468::-;11210:6;11218;11267:2;11255:9;11246:7;11242:23;11238:32;11235:119;;;11273:79;;:::i;:::-;11235:119;11393:1;11418:53;11463:7;11454:6;11443:9;11439:22;11418:53;:::i;:::-;11408:63;;11364:117;11520:2;11546:50;11588:7;11579:6;11568:9;11564:22;11546:50;:::i;:::-;11536:60;;11491:115;11145:468;;;;;:::o;11619:307::-;11680:4;11770:18;11762:6;11759:30;11756:56;;;11792:18;;:::i;:::-;11756:56;11830:29;11852:6;11830:29;:::i;:::-;11822:37;;11914:4;11908;11904:15;11896:23;;11619:307;;;:::o;11932:410::-;12009:5;12034:65;12050:48;12091:6;12050:48;:::i;:::-;12034:65;:::i;:::-;12025:74;;12122:6;12115:5;12108:21;12160:4;12153:5;12149:16;12198:3;12189:6;12184:3;12180:16;12177:25;12174:112;;;12205:79;;:::i;:::-;12174:112;12295:41;12329:6;12324:3;12319;12295:41;:::i;:::-;12015:327;11932:410;;;;;:::o;12361:338::-;12416:5;12465:3;12458:4;12450:6;12446:17;12442:27;12432:122;;12473:79;;:::i;:::-;12432:122;12590:6;12577:20;12615:78;12689:3;12681:6;12674:4;12666:6;12662:17;12615:78;:::i;:::-;12606:87;;12422:277;12361:338;;;;:::o;12705:943::-;12800:6;12808;12816;12824;12873:3;12861:9;12852:7;12848:23;12844:33;12841:120;;;12880:79;;:::i;:::-;12841:120;13000:1;13025:53;13070:7;13061:6;13050:9;13046:22;13025:53;:::i;:::-;13015:63;;12971:117;13127:2;13153:53;13198:7;13189:6;13178:9;13174:22;13153:53;:::i;:::-;13143:63;;13098:118;13255:2;13281:53;13326:7;13317:6;13306:9;13302:22;13281:53;:::i;:::-;13271:63;;13226:118;13411:2;13400:9;13396:18;13383:32;13442:18;13434:6;13431:30;13428:117;;;13464:79;;:::i;:::-;13428:117;13569:62;13623:7;13614:6;13603:9;13599:22;13569:62;:::i;:::-;13559:72;;13354:287;12705:943;;;;;;;:::o;13654:474::-;13722:6;13730;13779:2;13767:9;13758:7;13754:23;13750:32;13747:119;;;13785:79;;:::i;:::-;13747:119;13905:1;13930:53;13975:7;13966:6;13955:9;13951:22;13930:53;:::i;:::-;13920:63;;13876:117;14032:2;14058:53;14103:7;14094:6;14083:9;14079:22;14058:53;:::i;:::-;14048:63;;14003:118;13654:474;;;;;:::o;14134:158::-;14274:10;14270:1;14262:6;14258:14;14251:34;14134:158;:::o;14298:365::-;14440:3;14461:66;14525:1;14520:3;14461:66;:::i;:::-;14454:73;;14536:93;14625:3;14536:93;:::i;:::-;14654:2;14649:3;14645:12;14638:19;;14298:365;;;:::o;14669:419::-;14835:4;14873:2;14862:9;14858:18;14850:26;;14922:9;14916:4;14912:20;14908:1;14897:9;14893:17;14886:47;14950:131;15076:4;14950:131;:::i;:::-;14942:139;;14669:419;;;:::o;15094:157::-;15234:9;15230:1;15222:6;15218:14;15211:33;15094:157;:::o;15257:365::-;15399:3;15420:66;15484:1;15479:3;15420:66;:::i;:::-;15413:73;;15495:93;15584:3;15495:93;:::i;:::-;15613:2;15608:3;15604:12;15597:19;;15257:365;;;:::o;15628:419::-;15794:4;15832:2;15821:9;15817:18;15809:26;;15881:9;15875:4;15871:20;15867:1;15856:9;15852:17;15845:47;15909:131;16035:4;15909:131;:::i;:::-;15901:139;;15628:419;;;:::o;16053:158::-;16193:10;16189:1;16181:6;16177:14;16170:34;16053:158;:::o;16217:365::-;16359:3;16380:66;16444:1;16439:3;16380:66;:::i;:::-;16373:73;;16455:93;16544:3;16455:93;:::i;:::-;16573:2;16568:3;16564:12;16557:19;;16217:365;;;:::o;16588:419::-;16754:4;16792:2;16781:9;16777:18;16769:26;;16841:9;16835:4;16831:20;16827:1;16816:9;16812:17;16805:47;16869:131;16995:4;16869:131;:::i;:::-;16861:139;;16588:419;;;:::o;17013:161::-;17153:13;17149:1;17141:6;17137:14;17130:37;17013:161;:::o;17180:366::-;17322:3;17343:67;17407:2;17402:3;17343:67;:::i;:::-;17336:74;;17419:93;17508:3;17419:93;:::i;:::-;17537:2;17532:3;17528:12;17521:19;;17180:366;;;:::o;17552:419::-;17718:4;17756:2;17745:9;17741:18;17733:26;;17805:9;17799:4;17795:20;17791:1;17780:9;17776:17;17769:47;17833:131;17959:4;17833:131;:::i;:::-;17825:139;;17552:419;;;:::o;17977:180::-;18025:77;18022:1;18015:88;18122:4;18119:1;18112:15;18146:4;18143:1;18136:15;18163:180;18211:77;18208:1;18201:88;18308:4;18305:1;18298:15;18332:4;18329:1;18322:15;18349:233;18388:3;18411:24;18429:5;18411:24;:::i;:::-;18402:33;;18457:66;18450:5;18447:77;18444:103;;;18527:18;;:::i;:::-;18444:103;18574:1;18567:5;18563:13;18556:20;;18349:233;;;:::o;18588:180::-;18636:77;18633:1;18626:88;18733:4;18730:1;18723:15;18757:4;18754:1;18747:15;18774:320;18818:6;18855:1;18849:4;18845:12;18835:22;;18902:1;18896:4;18892:12;18923:18;18913:81;;18979:4;18971:6;18967:17;18957:27;;18913:81;19041:2;19033:6;19030:14;19010:18;19007:38;19004:84;;;19060:18;;:::i;:::-;19004:84;18825:269;18774:320;;;:::o;19100:231::-;19240:34;19236:1;19228:6;19224:14;19217:58;19309:14;19304:2;19296:6;19292:15;19285:39;19100:231;:::o;19337:366::-;19479:3;19500:67;19564:2;19559:3;19500:67;:::i;:::-;19493:74;;19576:93;19665:3;19576:93;:::i;:::-;19694:2;19689:3;19685:12;19678:19;;19337:366;;;:::o;19709:419::-;19875:4;19913:2;19902:9;19898:18;19890:26;;19962:9;19956:4;19952:20;19948:1;19937:9;19933:17;19926:47;19990:131;20116:4;19990:131;:::i;:::-;19982:139;;19709:419;;;:::o;20134:220::-;20274:34;20270:1;20262:6;20258:14;20251:58;20343:3;20338:2;20330:6;20326:15;20319:28;20134:220;:::o;20360:366::-;20502:3;20523:67;20587:2;20582:3;20523:67;:::i;:::-;20516:74;;20599:93;20688:3;20599:93;:::i;:::-;20717:2;20712:3;20708:12;20701:19;;20360:366;;;:::o;20732:419::-;20898:4;20936:2;20925:9;20921:18;20913:26;;20985:9;20979:4;20975:20;20971:1;20960:9;20956:17;20949:47;21013:131;21139:4;21013:131;:::i;:::-;21005:139;;20732:419;;;:::o;21157:243::-;21297:34;21293:1;21285:6;21281:14;21274:58;21366:26;21361:2;21353:6;21349:15;21342:51;21157:243;:::o;21406:366::-;21548:3;21569:67;21633:2;21628:3;21569:67;:::i;:::-;21562:74;;21645:93;21734:3;21645:93;:::i;:::-;21763:2;21758:3;21754:12;21747:19;;21406:366;;;:::o;21778:419::-;21944:4;21982:2;21971:9;21967:18;21959:26;;22031:9;22025:4;22021:20;22017:1;22006:9;22002:17;21995:47;22059:131;22185:4;22059:131;:::i;:::-;22051:139;;21778:419;;;:::o;22203:236::-;22343:34;22339:1;22331:6;22327:14;22320:58;22412:19;22407:2;22399:6;22395:15;22388:44;22203:236;:::o;22445:366::-;22587:3;22608:67;22672:2;22667:3;22608:67;:::i;:::-;22601:74;;22684:93;22773:3;22684:93;:::i;:::-;22802:2;22797:3;22793:12;22786:19;;22445:366;;;:::o;22817:419::-;22983:4;23021:2;23010:9;23006:18;22998:26;;23070:9;23064:4;23060:20;23056:1;23045:9;23041:17;23034:47;23098:131;23224:4;23098:131;:::i;:::-;23090:139;;22817:419;;;:::o;23242:182::-;23382:34;23378:1;23370:6;23366:14;23359:58;23242:182;:::o;23430:366::-;23572:3;23593:67;23657:2;23652:3;23593:67;:::i;:::-;23586:74;;23669:93;23758:3;23669:93;:::i;:::-;23787:2;23782:3;23778:12;23771:19;;23430:366;;;:::o;23802:419::-;23968:4;24006:2;23995:9;23991:18;23983:26;;24055:9;24049:4;24045:20;24041:1;24030:9;24026:17;24019:47;24083:131;24209:4;24083:131;:::i;:::-;24075:139;;23802:419;;;:::o;24227:230::-;24367:34;24363:1;24355:6;24351:14;24344:58;24436:13;24431:2;24423:6;24419:15;24412:38;24227:230;:::o;24463:366::-;24605:3;24626:67;24690:2;24685:3;24626:67;:::i;:::-;24619:74;;24702:93;24791:3;24702:93;:::i;:::-;24820:2;24815:3;24811:12;24804:19;;24463:366;;;:::o;24835:419::-;25001:4;25039:2;25028:9;25024:18;25016:26;;25088:9;25082:4;25078:20;25074:1;25063:9;25059:17;25052:47;25116:131;25242:4;25116:131;:::i;:::-;25108:139;;24835:419;;;:::o;25260:143::-;25317:5;25348:6;25342:13;25333:22;;25364:33;25391:5;25364:33;:::i;:::-;25260:143;;;;:::o;25409:351::-;25479:6;25528:2;25516:9;25507:7;25503:23;25499:32;25496:119;;;25534:79;;:::i;:::-;25496:119;25654:1;25679:64;25735:7;25726:6;25715:9;25711:22;25679:64;:::i;:::-;25669:74;;25625:128;25409:351;;;;:::o;25766:231::-;25906:34;25902:1;25894:6;25890:14;25883:58;25975:14;25970:2;25962:6;25958:15;25951:39;25766:231;:::o;26003:366::-;26145:3;26166:67;26230:2;26225:3;26166:67;:::i;:::-;26159:74;;26242:93;26331:3;26242:93;:::i;:::-;26360:2;26355:3;26351:12;26344:19;;26003:366;;;:::o;26375:419::-;26541:4;26579:2;26568:9;26564:18;26556:26;;26628:9;26622:4;26618:20;26614:1;26603:9;26599:17;26592:47;26656:131;26782:4;26656:131;:::i;:::-;26648:139;;26375:419;;;:::o;26800:311::-;26877:4;26967:18;26959:6;26956:30;26953:56;;;26989:18;;:::i;:::-;26953:56;27039:4;27031:6;27027:17;27019:25;;27099:4;27093;27089:15;27081:23;;26800:311;;;:::o;27117:117::-;27226:1;27223;27216:12;27240:143;27297:5;27328:6;27322:13;27313:22;;27344:33;27371:5;27344:33;:::i;:::-;27240:143;;;;:::o;27406:732::-;27513:5;27538:81;27554:64;27611:6;27554:64;:::i;:::-;27538:81;:::i;:::-;27529:90;;27639:5;27668:6;27661:5;27654:21;27702:4;27695:5;27691:16;27684:23;;27755:4;27747:6;27743:17;27735:6;27731:30;27784:3;27776:6;27773:15;27770:122;;;27803:79;;:::i;:::-;27770:122;27918:6;27901:231;27935:6;27930:3;27927:15;27901:231;;;28010:3;28039:48;28083:3;28071:10;28039:48;:::i;:::-;28034:3;28027:61;28117:4;28112:3;28108:14;28101:21;;27977:155;27961:4;27956:3;27952:14;27945:21;;27901:231;;;27905:21;27519:619;;27406:732;;;;;:::o;28161:385::-;28243:5;28292:3;28285:4;28277:6;28273:17;28269:27;28259:122;;28300:79;;:::i;:::-;28259:122;28410:6;28404:13;28435:105;28536:3;28528:6;28521:4;28513:6;28509:17;28435:105;:::i;:::-;28426:114;;28249:297;28161:385;;;;:::o;28552:554::-;28647:6;28696:2;28684:9;28675:7;28671:23;28667:32;28664:119;;;28702:79;;:::i;:::-;28664:119;28843:1;28832:9;28828:17;28822:24;28873:18;28865:6;28862:30;28859:117;;;28895:79;;:::i;:::-;28859:117;29000:89;29081:7;29072:6;29061:9;29057:22;29000:89;:::i;:::-;28990:99;;28793:306;28552:554;;;;:::o;29112:156::-;29252:8;29248:1;29240:6;29236:14;29229:32;29112:156;:::o;29274:365::-;29416:3;29437:66;29501:1;29496:3;29437:66;:::i;:::-;29430:73;;29512:93;29601:3;29512:93;:::i;:::-;29630:2;29625:3;29621:12;29614:19;;29274:365;;;:::o;29645:419::-;29811:4;29849:2;29838:9;29834:18;29826:26;;29898:9;29892:4;29888:20;29884:1;29873:9;29869:17;29862:47;29926:131;30052:4;29926:131;:::i;:::-;29918:139;;29645:419;;;:::o;30070:228::-;30210:34;30206:1;30198:6;30194:14;30187:58;30279:11;30274:2;30266:6;30262:15;30255:36;30070:228;:::o;30304:366::-;30446:3;30467:67;30531:2;30526:3;30467:67;:::i;:::-;30460:74;;30543:93;30632:3;30543:93;:::i;:::-;30661:2;30656:3;30652:12;30645:19;;30304:366;;;:::o;30676:419::-;30842:4;30880:2;30869:9;30865:18;30857:26;;30929:9;30923:4;30919:20;30915:1;30904:9;30900:17;30893:47;30957:131;31083:4;30957:131;:::i;:::-;30949:139;;30676:419;;;:::o;31101:229::-;31241:34;31237:1;31229:6;31225:14;31218:58;31310:12;31305:2;31297:6;31293:15;31286:37;31101:229;:::o;31336:366::-;31478:3;31499:67;31563:2;31558:3;31499:67;:::i;:::-;31492:74;;31575:93;31664:3;31575:93;:::i;:::-;31693:2;31688:3;31684:12;31677:19;;31336:366;;;:::o;31708:419::-;31874:4;31912:2;31901:9;31897:18;31889:26;;31961:9;31955:4;31951:20;31947:1;31936:9;31932:17;31925:47;31989:131;32115:4;31989:131;:::i;:::-;31981:139;;31708:419;;;:::o;32133:175::-;32273:27;32269:1;32261:6;32257:14;32250:51;32133:175;:::o;32314:366::-;32456:3;32477:67;32541:2;32536:3;32477:67;:::i;:::-;32470:74;;32553:93;32642:3;32553:93;:::i;:::-;32671:2;32666:3;32662:12;32655:19;;32314:366;;;:::o;32686:419::-;32852:4;32890:2;32879:9;32875:18;32867:26;;32939:9;32933:4;32929:20;32925:1;32914:9;32910:17;32903:47;32967:131;33093:4;32967:131;:::i;:::-;32959:139;;32686:419;;;:::o;33111:148::-;33213:11;33250:3;33235:18;;33111:148;;;;:::o;33265:377::-;33371:3;33399:39;33432:5;33399:39;:::i;:::-;33454:89;33536:6;33531:3;33454:89;:::i;:::-;33447:96;;33552:52;33597:6;33592:3;33585:4;33578:5;33574:16;33552:52;:::i;:::-;33629:6;33624:3;33620:16;33613:23;;33375:267;33265:377;;;;:::o;33648:155::-;33788:7;33784:1;33776:6;33772:14;33765:31;33648:155;:::o;33809:400::-;33969:3;33990:84;34072:1;34067:3;33990:84;:::i;:::-;33983:91;;34083:93;34172:3;34083:93;:::i;:::-;34201:1;34196:3;34192:11;34185:18;;33809:400;;;:::o;34215:541::-;34448:3;34470:95;34561:3;34552:6;34470:95;:::i;:::-;34463:102;;34582:148;34726:3;34582:148;:::i;:::-;34575:155;;34747:3;34740:10;;34215:541;;;;:::o;34762:160::-;34902:12;34898:1;34890:6;34886:14;34879:36;34762:160;:::o;34928:366::-;35070:3;35091:67;35155:2;35150:3;35091:67;:::i;:::-;35084:74;;35167:93;35256:3;35167:93;:::i;:::-;35285:2;35280:3;35276:12;35269:19;;34928:366;;;:::o;35300:419::-;35466:4;35504:2;35493:9;35489:18;35481:26;;35553:9;35547:4;35543:20;35539:1;35528:9;35524:17;35517:47;35581:131;35707:4;35581:131;:::i;:::-;35573:139;;35300:419;;;:::o;35725:156::-;35865:8;35861:1;35853:6;35849:14;35842:32;35725:156;:::o;35887:365::-;36029:3;36050:66;36114:1;36109:3;36050:66;:::i;:::-;36043:73;;36125:93;36214:3;36125:93;:::i;:::-;36243:2;36238:3;36234:12;36227:19;;35887:365;;;:::o;36258:419::-;36424:4;36462:2;36451:9;36447:18;36439:26;;36511:9;36505:4;36501:20;36497:1;36486:9;36482:17;36475:47;36539:131;36665:4;36539:131;:::i;:::-;36531:139;;36258:419;;;:::o;36683:225::-;36823:34;36819:1;36811:6;36807:14;36800:58;36892:8;36887:2;36879:6;36875:15;36868:33;36683:225;:::o;36914:366::-;37056:3;37077:67;37141:2;37136:3;37077:67;:::i;:::-;37070:74;;37153:93;37242:3;37153:93;:::i;:::-;37271:2;37266:3;37262:12;37255:19;;36914:366;;;:::o;37286:419::-;37452:4;37490:2;37479:9;37475:18;37467:26;;37539:9;37533:4;37529:20;37525:1;37514:9;37510:17;37503:47;37567:131;37693:4;37567:131;:::i;:::-;37559:139;;37286:419;;;:::o;37711:231::-;37851:34;37847:1;37839:6;37835:14;37828:58;37920:14;37915:2;37907:6;37903:15;37896:39;37711:231;:::o;37948:366::-;38090:3;38111:67;38175:2;38170:3;38111:67;:::i;:::-;38104:74;;38187:93;38276:3;38187:93;:::i;:::-;38305:2;38300:3;38296:12;38289:19;;37948:366;;;:::o;38320:419::-;38486:4;38524:2;38513:9;38509:18;38501:26;;38573:9;38567:4;38563:20;38559:1;38548:9;38544:17;38537:47;38601:131;38727:4;38601:131;:::i;:::-;38593:139;;38320:419;;;:::o;38745:228::-;38885:34;38881:1;38873:6;38869:14;38862:58;38954:11;38949:2;38941:6;38937:15;38930:36;38745:228;:::o;38979:366::-;39121:3;39142:67;39206:2;39201:3;39142:67;:::i;:::-;39135:74;;39218:93;39307:3;39218:93;:::i;:::-;39336:2;39331:3;39327:12;39320:19;;38979:366;;;:::o;39351:419::-;39517:4;39555:2;39544:9;39540:18;39532:26;;39604:9;39598:4;39594:20;39590:1;39579:9;39575:17;39568:47;39632:131;39758:4;39632:131;:::i;:::-;39624:139;;39351:419;;;:::o;39776:223::-;39916:34;39912:1;39904:6;39900:14;39893:58;39985:6;39980:2;39972:6;39968:15;39961:31;39776:223;:::o;40005:366::-;40147:3;40168:67;40232:2;40227:3;40168:67;:::i;:::-;40161:74;;40244:93;40333:3;40244:93;:::i;:::-;40362:2;40357:3;40353:12;40346:19;;40005:366;;;:::o;40377:419::-;40543:4;40581:2;40570:9;40566:18;40558:26;;40630:9;40624:4;40620:20;40616:1;40605:9;40601:17;40594:47;40658:131;40784:4;40658:131;:::i;:::-;40650:139;;40377:419;;;:::o;40802:191::-;40842:4;40862:20;40880:1;40862:20;:::i;:::-;40857:25;;40896:20;40914:1;40896:20;:::i;:::-;40891:25;;40935:1;40932;40929:8;40926:34;;;40940:18;;:::i;:::-;40926:34;40985:1;40982;40978:9;40970:17;;40802:191;;;;:::o;40999:305::-;41039:3;41058:20;41076:1;41058:20;:::i;:::-;41053:25;;41092:20;41110:1;41092:20;:::i;:::-;41087:25;;41246:1;41178:66;41174:74;41171:1;41168:81;41165:107;;;41252:18;;:::i;:::-;41165:107;41296:1;41293;41289:9;41282:16;;40999:305;;;;:::o;41310:237::-;41450:34;41446:1;41438:6;41434:14;41427:58;41519:20;41514:2;41506:6;41502:15;41495:45;41310:237;:::o;41553:366::-;41695:3;41716:67;41780:2;41775:3;41716:67;:::i;:::-;41709:74;;41792:93;41881:3;41792:93;:::i;:::-;41910:2;41905:3;41901:12;41894:19;;41553:366;;;:::o;41925:419::-;42091:4;42129:2;42118:9;42114:18;42106:26;;42178:9;42172:4;42168:20;42164:1;42153:9;42149:17;42142:47;42206:131;42332:4;42206:131;:::i;:::-;42198:139;;41925:419;;;:::o;42350:234::-;42490:34;42486:1;42478:6;42474:14;42467:58;42559:17;42554:2;42546:6;42542:15;42535:42;42350:234;:::o;42590:366::-;42732:3;42753:67;42817:2;42812:3;42753:67;:::i;:::-;42746:74;;42829:93;42918:3;42829:93;:::i;:::-;42947:2;42942:3;42938:12;42931:19;;42590:366;;;:::o;42962:419::-;43128:4;43166:2;43155:9;43151:18;43143:26;;43215:9;43209:4;43205:20;43201:1;43190:9;43186:17;43179:47;43243:131;43369:4;43243:131;:::i;:::-;43235:139;;42962:419;;;:::o;43387:435::-;43567:3;43589:95;43680:3;43671:6;43589:95;:::i;:::-;43582:102;;43701:95;43792:3;43783:6;43701:95;:::i;:::-;43694:102;;43813:3;43806:10;;43387:435;;;;;:::o;43828:98::-;43879:6;43913:5;43907:12;43897:22;;43828:98;;;:::o;43932:168::-;44015:11;44049:6;44044:3;44037:19;44089:4;44084:3;44080:14;44065:29;;43932:168;;;;:::o;44106:360::-;44192:3;44220:38;44252:5;44220:38;:::i;:::-;44274:70;44337:6;44332:3;44274:70;:::i;:::-;44267:77;;44353:52;44398:6;44393:3;44386:4;44379:5;44375:16;44353:52;:::i;:::-;44430:29;44452:6;44430:29;:::i;:::-;44425:3;44421:39;44414:46;;44196:270;44106:360;;;;:::o;44472:640::-;44667:4;44705:3;44694:9;44690:19;44682:27;;44719:71;44787:1;44776:9;44772:17;44763:6;44719:71;:::i;:::-;44800:72;44868:2;44857:9;44853:18;44844:6;44800:72;:::i;:::-;44882;44950:2;44939:9;44935:18;44926:6;44882:72;:::i;:::-;45001:9;44995:4;44991:20;44986:2;44975:9;44971:18;44964:48;45029:76;45100:4;45091:6;45029:76;:::i;:::-;45021:84;;44472:640;;;;;;;:::o;45118:141::-;45174:5;45205:6;45199:13;45190:22;;45221:32;45247:5;45221:32;:::i;:::-;45118:141;;;;:::o;45265:349::-;45334:6;45383:2;45371:9;45362:7;45358:23;45354:32;45351:119;;;45389:79;;:::i;:::-;45351:119;45509:1;45534:63;45589:7;45580:6;45569:9;45565:22;45534:63;:::i;:::-;45524:73;;45480:127;45265:349;;;;:::o;45620:180::-;45668:77;45665:1;45658:88;45765:4;45762:1;45755:15;45789:4;45786:1;45779:15;45806:185;45846:1;45863:20;45881:1;45863:20;:::i;:::-;45858:25;;45897:20;45915:1;45897:20;:::i;:::-;45892:25;;45936:1;45926:35;;45941:18;;:::i;:::-;45926:35;45983:1;45980;45976:9;45971:14;;45806:185;;;;:::o;45997:176::-;46029:1;46046:20;46064:1;46046:20;:::i;:::-;46041:25;;46080:20;46098:1;46080:20;:::i;:::-;46075:25;;46119:1;46109:35;;46124:18;;:::i;:::-;46109:35;46165:1;46162;46158:9;46153:14;;45997:176;;;;:::o;46179:182::-;46319:34;46315:1;46307:6;46303:14;46296:58;46179:182;:::o;46367:366::-;46509:3;46530:67;46594:2;46589:3;46530:67;:::i;:::-;46523:74;;46606:93;46695:3;46606:93;:::i;:::-;46724:2;46719:3;46715:12;46708:19;;46367:366;;;:::o;46739:419::-;46905:4;46943:2;46932:9;46928:18;46920:26;;46992:9;46986:4;46982:20;46978:1;46967:9;46963:17;46956:47;47020:131;47146:4;47020:131;:::i;:::-;47012:139;;46739:419;;;:::o;47164:178::-;47304:30;47300:1;47292:6;47288:14;47281:54;47164:178;:::o;47348:366::-;47490:3;47511:67;47575:2;47570:3;47511:67;:::i;:::-;47504:74;;47587:93;47676:3;47587:93;:::i;:::-;47705:2;47700:3;47696:12;47689:19;;47348:366;;;:::o;47720:419::-;47886:4;47924:2;47913:9;47909:18;47901:26;;47973:9;47967:4;47963:20;47959:1;47948:9;47944:17;47937:47;48001:131;48127:4;48001:131;:::i;:::-;47993:139;;47720:419;;;:::o;48145:180::-;48193:77;48190:1;48183:88;48290:4;48287:1;48280:15;48314:4;48311:1;48304:15

Swarm Source

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