Token GymKongZ

Overview CRC721

Total Supply:
817 GKZ

Holders:
217 addresses
Balance
2 GKZ
0xc5bbfa2d205568c9e6faaa1b47451185a2307422
Loading
[ Download CSV Export  ] 
Loading
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
GymKongZ

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-11
*/

// SPDX-License-Identifier: MIT

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

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

pragma solidity ^0.8.9;

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

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

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

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

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

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

// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

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

    /**
     * @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 Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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

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

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

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

// File: @openzeppelin/contracts/security/Pausable.sol

// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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

// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

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

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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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

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

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

// File: @openzeppelin/contracts/interfaces/IERC2981.sol

// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

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

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

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

// File: @openzeppelin/contracts/token/common/ERC2981.sol

// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)

/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice)
        public
        view
        virtual
        override
        returns (address, uint256)
    {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) /
            _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator)
        internal
        virtual
    {
        require(
            feeNumerator <= _feeDenominator(),
            "ERC2981: royalty fee will exceed salePrice"
        );
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(
            feeNumerator <= _feeDenominator(),
            "ERC2981: royalty fee will exceed salePrice"
        );
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

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

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

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

    /**
     * @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 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId)
        external
        view
        returns (address operator);

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @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 simpleki 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: address zero is not a valid owner"
        );
        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: invalid token ID");
        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)
    {
        _requireMinted(tokenId);

        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 overridden 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 token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: caller is not token 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: caller is not token 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)
    {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner ||
            isApprovedForAll(owner, spender) ||
            getApproved(tokenId) == spender);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/Bigone.sol

abstract contract Market {
    function isMember(address user) public view virtual returns (bool);

    function addToEscrow(address _address) external payable virtual;
}

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

library SafePct {
    using SafeMathLite for uint256;

    /**
     * Requirements:
     *
     * - intermediate operations must revert on overflow
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 z
    ) internal pure returns (uint256) {
        require(z > 0, "Division by zero");

        if (x == 0) return 0;
        uint256 xy = x * y;
        if (xy / x == y) {
            // no overflow happened - same as in SafeMath mul
            return xy / z;
        }

        //slither-disable-next-line divide-before-multiply
        uint256 a = x / z;
        uint256 b = x % z; // x = a * z + b

        //slither-disable-next-line divide-before-multiply
        uint256 c = y / z;
        uint256 d = y % z; // y = c * z + d

        return
            (a.mul(c).mul(z)).add(a.mul(d)).add(b.mul(c)).add(b.mul(d).div(z));
    }
}

abstract contract WithLimitedSupply {
    // Keeps track of how many we have minted
    uint256 private _tokenCount;

    /// @dev The maximum count of tokens this token tracker will issue.
    uint256 private immutable _maxAvailableSupply;

    /// Instanciate the contract
    /// @param maxSupply_ how many tokens this collection should hold
    constructor(uint256 maxSupply_, uint256 reserved_) {
        _maxAvailableSupply = maxSupply_ - reserved_;
    }

    function maxAvailableSupply() public view returns (uint256) {
        return _maxAvailableSupply;
    }

    /// @dev Get the current token count
    /// @return the created token count
    /// TODO: if this is not required externally, does making it `public view` use unneccary gas?
    function tokenCount() public view returns (uint256) {
        return _tokenCount;
    }

    /// @dev Check whether tokens are still available
    /// @return the available token count
    function availableTokenCount() public view returns (uint256) {
        return maxAvailableSupply() - tokenCount();
    }

    /// @dev Increment the token count and fetch the latest count
    /// @return the next token id
    function nextToken() internal virtual ensureAvailability returns (uint256) {
        return _tokenCount++;
    }

    /// @dev Check whether another token is still available
    modifier ensureAvailability() {
        require(availableTokenCount() > 0, "No more tokens available");
        _;
    }

    /// @param amount Check whether number of tokens are still available
    /// @dev Check whether tokens are still available
    modifier ensureAvailabilityFor(uint256 amount) {
        require(
            availableTokenCount() >= amount,
            "Requested number of tokens not available"
        );
        _;
    }
}

abstract contract RandomlyAssigned is WithLimitedSupply {
    // Used for random index assignment
    mapping(uint256 => uint256) private tokenMatrix;

    // The initial token ID
    uint256 private immutable startFrom;

    /// Instanciate the contract
    /// @param maxSupply_ how many tokens this collection should hold
    /// @param numReserved_ the number of tokens reserved whose IDs dont come from the randomizer
    constructor(uint256 maxSupply_, uint256 numReserved_)
        WithLimitedSupply(maxSupply_, numReserved_)
    {
        startFrom = numReserved_ + 1;
    }

    /// Get the next token ID
    /// @dev Randomly gets a new token ID and keeps track of the ones that are still available.
    /// @return the next token ID
    function nextToken() internal override returns (uint256) {
        uint256 maxIndex = maxAvailableSupply() - tokenCount();
        uint256 random = uint256(
            keccak256(
                abi.encodePacked(
                    msg.sender,
                    block.coinbase,
                    block.difficulty,
                    block.gaslimit,
                    block.timestamp
                )
            )
        ) % maxIndex;

        uint256 value = 0;
        if (tokenMatrix[random] == 0) {
            // If this matrix position is empty, set the value to the generated random number.
            value = random;
        } else {
            // Otherwise, use the previously stored number from the matrix.
            value = tokenMatrix[random];
        }

        // If the last available tokenID is still unused...
        if (tokenMatrix[maxIndex - 1] == 0) {
            // ...store that ID in the current matrix position.
            tokenMatrix[random] = maxIndex - 1;
        } else {
            // ...otherwise copy over the stored number to the current matrix position.
            tokenMatrix[random] = tokenMatrix[maxIndex - 1];
        }

        // Increment counts (ie. qty minted)
        super.nextToken();

        return value + startFrom;
    }
}

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

contract GymKongZ is
    Pausable,
    ERC721Enumerable,
    Ownable,
    RandomlyAssigned,
    ReentrancyGuard,
    ERC2981
{
    using Counters for Counters.Counter;
    using Strings for uint256;
    using SafePct for uint256;
    using SafeMathLite for uint256;

    string public baseURI;
    string public notRevealedUri;

    bool public revealed;

    uint256 public regularCost;
    uint256 public memberCost;
    uint256 public whitelistCost;

    //Restrictions
    uint256 public maxSupply = 10000;
    uint256 public maxWhiteListAmount = 10000;
    uint256 public immutable maxMintAmount = 10;
    uint256 public immutable mintingAmountOverall = 10000;

    bool public isOperatorProxyActive;
    address public operatorProxyAddress;
    address marketAddress;
    address reciever;
    address[] private payees;
    uint16[] private shares;

    uint256 publicStartTime;

    struct Infos {
        uint256 regularCost;
        uint256 memberCost;
        uint256 whitelistCost;
        uint256 maxSupply;
        uint256 totalSupply;
        uint256 maxMintPerAddress;
        uint256 maxMintPerTx;
    }

    mapping(address => bool) public whitelistedAddresses;
    mapping(address => uint256) whitelistMinted;

    constructor(string memory _notRevealedUri) ERC721("GymKongZ", "GKZ") RandomlyAssigned(10000, 0) {
        setRevealURI(_notRevealedUri);
        reciever = 0x454cfAa623A629CC0b4017aEb85d54C42e91479d;
        marketAddress = 0x7a3CdB2364f92369a602CAE81167d0679087e6a3;
        _transferOwnership(msg.sender);
        setMemberCost(1080 ether);
        setWhitelistCost(1080 ether);
        setRegularCost(1200 ether);
        setDefaultRoyalty(0x31760a705B51501d30962BD3AD17beE658927d5A, 500);
    }

    function getInfo() public view returns (Infos memory) {
        Infos memory allInfos;
        allInfos.regularCost = regularCost;
        allInfos.memberCost = memberCost;
        allInfos.whitelistCost = whitelistCost;
        allInfos.maxSupply = maxSupply;
        allInfos.totalSupply = totalSupply();
        allInfos.maxMintPerTx = maxMintAmount;

        return allInfos;
    }

    function isEbisusBayMember(address _address) internal view returns (bool) {
        return Market(marketAddress).isMember(_address);
    }

    function addWhiteList(address[] calldata _addresses) public onlyOwner {
        uint256 len = _addresses.length;
        for (uint256 i = 0; i < len; i++) {
            whitelistedAddresses[_addresses[i]] = true;
        }
    }

    function addWhiteListAddress(address _address) public onlyOwner {
        whitelistedAddresses[_address] = true;
    }

    function removeWhiteList(address _address) public onlyOwner {
        if (whitelistedAddresses[_address]) {
            delete whitelistedAddresses[_address];
        }
    }

    function setRegularCost(uint256 _cost) public onlyOwner {
        regularCost = _cost;
    }

    function setMemberCost(uint256 _cost) public onlyOwner {
        memberCost = _cost;
    }

    function setWhitelistCost(uint256 _cost) public onlyOwner {
        whitelistCost = _cost;
    }

    function isWhitelist(address _address) public view returns (bool) {
        return whitelistedAddresses[_address];
    }


    function mint(uint256 _mintAmount)
        public
        payable
        virtual
        whenNotPaused
        nonReentrant
    {
        require(
            publicStartTime != 0,
            "Sales closed"
        );

        uint256 supply = totalSupply();
        require(_mintAmount > 0, "need to mint at least 1 NFT");
        require(_mintAmount <= maxMintAmount, "Amount exeeds limit per tx");
        require((supply + _mintAmount) <= maxSupply, "max NFT limit exceeded");

        require(
            balanceOf(msg.sender) + _mintAmount <= mintingAmountOverall,
            "Max Supply per wallet reached"
        );
        if (isWhitelist(msg.sender)) {
            whitelistMinted[msg.sender] += _mintAmount;
            require(
                whitelistMinted[msg.sender] <= maxWhiteListAmount,
                "exceed amount in presale"
            );
        }
        uint256 cost = mintCost(msg.sender);
        uint256 totalCost = cost.mul(_mintAmount);
        require(totalCost <= msg.value, "insufficient funds");

        for (uint256 i = 1; i <= _mintAmount; i++) {
            _mintRandomId(msg.sender);
        }

        Market market = Market(marketAddress);
        uint256 amount;
        amount = totalCost.mulDiv(1500, 10000);
        market.addToEscrow{value: amount}(reciever);
        // totalCost = totalCost.sub(amount);
        uint256 len = payees.length;
        for (uint256 i = 0; i < len; i++) {
            amount = totalCost.mulDiv(shares[i], 10000);
            (bool success, ) = payees[i].call{value: amount}("");
            require(
                success,
                "Address: unable to send value, recipient may have reverted"
            );
        }
    }

    function airdropMint(address _to, uint256 _amount) external onlyOwner {
        uint256 supply = totalSupply();
        require((supply + _amount) <= maxSupply, "max NFT limit exceeded");
        for (uint256 i = 1; i <= _amount; i++) {
            _mintRandomId(_to);
        }
    }

    function _mintRandomId(address to) private {
        uint256 id = nextToken();
        require(id > 0 && id <= maxSupply, "Mint not possible");
        _safeMint(to, id);
    }

    //Get NFT Cost
    function mintCost(address _address) public view virtual returns (uint256) {
        require(_address != address(0), "not zero address");
        if (isWhitelist(_address)) {
            return whitelistCost;
        }
        if (isEbisusBayMember(_address)) {
            return memberCost;
        }

        return regularCost;
    }

    // Can Mint Function
    function canMint(address _minter) public view virtual returns (uint256) {
        return maxMintAmount;
    }

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

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

        string memory _tokenURI = string(
            abi.encodePacked(baseURI, "/", Strings.toString(_tokenId), ".json")
        );

        return _tokenURI;
    }

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

    function setRevealURI(string memory _notRevealedUri) public onlyOwner {
        notRevealedUri = _notRevealedUri;
    }

    function reveal() public onlyOwner {
        revealed = !revealed;
    }

    function setMarketplaceReciever(address _reciever) public onlyOwner {
        reciever = _reciever;
    }

    function setOperatorProxyAddress(address _operatorProxyAddress)
        public
        onlyOwner
    {
        operatorProxyAddress = _operatorProxyAddress;
    }

    function setIsOperatorProxyActive() public onlyOwner {
        isOperatorProxyActive = !isOperatorProxyActive;
    }

    function setMaxWhiteListAmount(uint256 _maxWhiteListAmount)
        public
        onlyOwner
    {
        maxWhiteListAmount = _maxWhiteListAmount;
    }

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

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

    function burn(uint256 tokenId) public {
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721Burnable: caller is not owner nor approved"
        );
        _burn(tokenId);
    }

    function lock() external onlyOwner {
        maxSupply = totalSupply();
    }

    function setPaymentShares(
        address[] calldata _newPayees,
        uint16[] calldata _newShares
    ) public onlyOwner {
        require(_newPayees.length != 0, "empty payees");
        require(_newPayees.length == _newShares.length, "wrong payee numbers");

        if (!isCorrectShares(_newShares)) {
            revert("invalid shares");
        }
        payees = _newPayees;
        shares = _newShares;
    }

    function getPayees() public view returns (address[] memory) {
        return payees;
    }

    function getShares() public view returns (uint16[] memory) {
        return shares;
    }

    function isCorrectShares(uint16[] memory _shares)
        private
        pure
        returns (bool)
    {
        uint256 len = _shares.length;
        uint256 totalFees;
        for (uint256 i = 0; i < len; i++) {
            totalFees += _shares[i];
        }

        return totalFees == 8500;
    }

    function setPublicStartTime(uint256 _startTime) public onlyOwner {
        publicStartTime = _startTime;
    }


    function setDefaultRoyalty(address receiver, uint96 feeNumerator)
        public
        onlyOwner
    {
        _setDefaultRoyalty(receiver, feeNumerator);
    }

    function withdraw() public payable onlyOwner nonReentrant {
        uint256 balance = address(this).balance;
        require(balance > 0, "No ether left to withdraw");
        (bool success, ) = (msg.sender).call{value: balance}("");
        require(success, "Transfer failed.");
    }

    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 balance = balanceOf(_owner);
        uint256[] memory tokens = new uint256[](balance);
        uint256 tokenId;
        uint256 found;

        while (found < balance) {
            if (_exists(tokenId) && ownerOf(tokenId) == _owner) {
                tokens[found++] = tokenId;
            }
            tokenId++;
        }
        return tokens;
    }

    function isApprovedForAll(address _owner, address _operator)
        public
        view
        override
        returns (bool isOperator)
    {
        if (
            isOperatorProxyActive && _operator == address(operatorProxyAddress)
        ) {
            return true;
        }
        return ERC721.isApprovedForAll(_owner, _operator);
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_notRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addWhiteListAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"airdropMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"canMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInfo","outputs":[{"components":[{"internalType":"uint256","name":"regularCost","type":"uint256"},{"internalType":"uint256","name":"memberCost","type":"uint256"},{"internalType":"uint256","name":"whitelistCost","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"maxMintPerAddress","type":"uint256"},{"internalType":"uint256","name":"maxMintPerTx","type":"uint256"}],"internalType":"struct GymKongZ.Infos","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPayees","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getShares","outputs":[{"internalType":"uint16[]","name":"","type":"uint16[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"isOperator","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOperatorProxyActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxAvailableSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWhiteListAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"memberCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingAmountOverall","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorProxyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"regularCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setIsOperatorProxyActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_reciever","type":"address"}],"name":"setMarketplaceReciever","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWhiteListAmount","type":"uint256"}],"name":"setMaxWhiteListAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setMemberCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operatorProxyAddress","type":"address"}],"name":"setOperatorProxyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_newPayees","type":"address[]"},{"internalType":"uint16[]","name":"_newShares","type":"uint16[]"}],"name":"setPaymentShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"}],"name":"setPublicStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setRegularCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedUri","type":"string"}],"name":"setRevealURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setWhitelistCost","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":[],"name":"tokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistedAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

61010060405261271060178190556018819055600a60c05260e0523480156200002757600080fd5b50604051620045ae380380620045ae8339810160408190526200004a91620004a2565b604080518082018252600881526723bcb6a5b7b733ad60c11b60208083019182528351808501909452600384526223a5ad60e91b908401526000805460ff191681558251612710949193859385939192620000a891600191620003e6565b508051620000be906002906020840190620003e6565b505050620000db620000d5620001c760201b60201c565b620001cb565b620000e7818362000594565b60805250620000fa9050816001620005ae565b60a05250506001600e556200010f816200021d565b601b80546001600160a01b031990811673454cfaa623a629cc0b4017aeb85d54c42e91479d17909155601a8054909116737a3cdb2364f92369a602cae81167d0679087e6a31790556200016233620001cb565b62000176683a8c02c5ea2de0000062000240565b6200018a683a8c02c5ea2de000006200024f565b6200019e68410d586a20a4c000006200025e565b620001c07331760a705b51501d30962bd3ad17bee658927d5a6101f46200026d565b5062000606565b3390565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200022762000283565b80516200023c906012906020840190620003e6565b5050565b6200024a62000283565b601555565b6200025962000283565b601655565b6200026862000283565b601455565b6200027762000283565b6200023c8282620002e5565b600b546001600160a01b03163314620002e35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b565b6127106001600160601b0382161115620003555760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401620002da565b6001600160a01b038216620003ad5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401620002da565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600f55565b828054620003f490620005c9565b90600052602060002090601f01602090048101928262000418576000855562000463565b82601f106200043357805160ff191683800117855562000463565b8280016001018555821562000463579182015b828111156200046357825182559160200191906001019062000446565b506200047192915062000475565b5090565b5b8082111562000471576000815560010162000476565b634e487b7160e01b600052604160045260246000fd5b60006020808385031215620004b657600080fd5b82516001600160401b0380821115620004ce57600080fd5b818501915085601f830112620004e357600080fd5b815181811115620004f857620004f86200048c565b604051601f8201601f19908116603f011681019083821181831017156200052357620005236200048c565b8160405282815288868487010111156200053c57600080fd5b600093505b8284101562000560578484018601518185018701529285019262000541565b82841115620005725760008684830101525b98975050505050505050565b634e487b7160e01b600052601160045260246000fd5b600082821015620005a957620005a96200057e565b500390565b60008219821115620005c457620005c46200057e565b500190565b600181811c90821680620005de57607f821691505b602082108114156200060057634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e051613f446200066a60003960008181610c2b0152611aa20152600081816105a301528181610a65015281816116ed01526119de01526000612ef201526000818161050e015281816120a50152612db50152613f446000f3fe6080604052600436106103e45760003560e01c806370a0823111610208578063c683630d11610118578063e1ec6294116100ab578063eba830d81161007a578063eba830d814610bf9578063ee45092414610c19578063ef0760ad14610c4d578063f2fde38b14610c62578063f83d08ba14610c8257600080fd5b8063e1ec629414610b8d578063e7b99ec714610bad578063e985e9c514610bc3578063ea798c6d14610be357600080fd5b8063d73fe0aa116100e7578063d73fe0aa14610b16578063db8cc8fa14610b38578063dc09e92314610b58578063e14ca35314610b7857600080fd5b8063c683630d14610a87578063c87b56dd14610ac0578063d49479eb14610ae0578063d5abeb0114610b0057600080fd5b8063a0712d681161019b578063a811a37b1161016a578063a811a37b146109db578063b42fa83d146109fb578063b88d4fde14610a11578063bc58a47c14610a31578063c2ba474414610a4757600080fd5b8063a0712d6814610973578063a22cb46514610986578063a475b5dd146109a6578063a5a00b20146109bb57600080fd5b80638da5cb5b116101d75780638da5cb5b146109065780638e04ab041461092457806395d89b41146109495780639f181b5e1461095e57600080fd5b806370a082311461089c578063715018a6146108bc5780638164c309146108d15780638456cb59146108f157600080fd5b80632f745c591161030357806351830227116102965780635c975abb116102655780635c975abb146108155780635e1045ec1461082d5780636352211e1461084d5780636467d3d41461086d5780636c0360eb1461088757600080fd5b80635183022714610750578063539982b61461076a57806355f804b31461078a5780635a9b0b89146107aa57600080fd5b806342842e0e116102d257806342842e0e146106c357806342966c68146106e3578063438b6300146107035780634f6ccce71461073057600080fd5b80632f745c5914610666578063355edba7146106865780633ccfd60b146106a65780633f4ba83a146106ae57600080fd5b806318160ddd1161037b57806323b872dd1161034a57806323b872dd146105c557806327f38113146105e55780632a55205a146106075780632acc659e1461064657600080fd5b806318160ddd1461053c5780632042e5c21461055157806322ad067014610571578063239c70ae1461059157600080fd5b8063081812fc116103b7578063081812fc14610492578063081c8c44146104ca578063095ea7b3146104df57806315f91c18146104ff57600080fd5b806301ffc9a7146103e957806304634d8d1461041e57806306c933d81461044057806306fdde0314610470575b600080fd5b3480156103f557600080fd5b506104096104043660046136d7565b610c97565b60405190151581526020015b60405180910390f35b34801561042a57600080fd5b5061043e610439366004613710565b610ca8565b005b34801561044c57600080fd5b5061040961045b366004613753565b601f6020526000908152604090205460ff1681565b34801561047c57600080fd5b50610485610cbe565b60405161041591906137c6565b34801561049e57600080fd5b506104b26104ad3660046137d9565b610d50565b6040516001600160a01b039091168152602001610415565b3480156104d657600080fd5b50610485610d77565b3480156104eb57600080fd5b5061043e6104fa3660046137f2565b610e05565b34801561050b57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b604051908152602001610415565b34801561054857600080fd5b5060095461052e565b34801561055d57600080fd5b5061043e61056c366004613753565b610f20565b34801561057d57600080fd5b5061043e61058c3660046137f2565b610f6d565b34801561059d57600080fd5b5061052e7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105d157600080fd5b5061043e6105e036600461381c565b611002565b3480156105f157600080fd5b506105fa611034565b6040516104159190613858565b34801561061357600080fd5b506106276106223660046138a5565b611095565b604080516001600160a01b039093168352602083019190915201610415565b34801561065257600080fd5b5061052e610661366004613753565b611143565b34801561067257600080fd5b5061052e6106813660046137f2565b6111d5565b34801561069257600080fd5b5061043e6106a1366004613753565b61126b565b61043e61129b565b3480156106ba57600080fd5b5061043e6113dd565b3480156106cf57600080fd5b5061043e6106de36600461381c565b6113ef565b3480156106ef57600080fd5b5061043e6106fe3660046137d9565b61140a565b34801561070f57600080fd5b5061072361071e366004613753565b611481565b60405161041591906138c7565b34801561073c57600080fd5b5061052e61074b3660046137d9565b61156e565b34801561075c57600080fd5b506013546104099060ff1681565b34801561077657600080fd5b5061043e610785366004613753565b611601565b34801561079657600080fd5b5061043e6107a536600461398b565b61162b565b3480156107b657600080fd5b506107bf611646565b6040516104159190600060e082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015292915050565b34801561082157600080fd5b5060005460ff16610409565b34801561083957600080fd5b5061043e610848366004613a19565b611716565b34801561085957600080fd5b506104b26108683660046137d9565b611791565b34801561087957600080fd5b506019546104099060ff1681565b34801561089357600080fd5b506104856117f1565b3480156108a857600080fd5b5061052e6108b7366004613753565b6117fe565b3480156108c857600080fd5b5061043e611884565b3480156108dd57600080fd5b5061043e6108ec366004613753565b611896565b3480156108fd57600080fd5b5061043e6118c2565b34801561091257600080fd5b50600b546001600160a01b03166104b2565b34801561093057600080fd5b506019546104b29061010090046001600160a01b031681565b34801561095557600080fd5b506104856118d2565b34801561096a57600080fd5b50600c5461052e565b61043e6109813660046137d9565b6118e1565b34801561099257600080fd5b5061043e6109a1366004613a69565b611e1d565b3480156109b257600080fd5b5061043e611e28565b3480156109c757600080fd5b5061043e6109d63660046137d9565b611e44565b3480156109e757600080fd5b5061043e6109f636600461398b565b611e51565b348015610a0757600080fd5b5061052e60155481565b348015610a1d57600080fd5b5061043e610a2c366004613a95565b611e6c565b348015610a3d57600080fd5b5061052e60185481565b348015610a5357600080fd5b5061052e610a62366004613753565b507f000000000000000000000000000000000000000000000000000000000000000090565b348015610a9357600080fd5b50610409610aa2366004613753565b6001600160a01b03166000908152601f602052604090205460ff1690565b348015610acc57600080fd5b50610485610adb3660046137d9565b611e9e565b348015610aec57600080fd5b5061043e610afb3660046137d9565b611fee565b348015610b0c57600080fd5b5061052e60175481565b348015610b2257600080fd5b50610b2b611ffb565b6040516104159190613b11565b348015610b4457600080fd5b5061043e610b533660046137d9565b61207a565b348015610b6457600080fd5b5061043e610b733660046137d9565b612087565b348015610b8457600080fd5b5061052e612094565b348015610b9957600080fd5b5061043e610ba83660046137d9565b6120ce565b348015610bb957600080fd5b5061052e60165481565b348015610bcf57600080fd5b50610409610bde366004613b4d565b6120db565b348015610bef57600080fd5b5061052e60145481565b348015610c0557600080fd5b5061043e610c14366004613b80565b612140565b348015610c2557600080fd5b5061052e7f000000000000000000000000000000000000000000000000000000000000000081565b348015610c5957600080fd5b5061043e612262565b348015610c6e57600080fd5b5061043e610c7d366004613753565b61227e565b348015610c8e57600080fd5b5061043e6122f4565b6000610ca282612304565b92915050565b610cb0612329565b610cba8282612383565b5050565b606060018054610ccd90613bec565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf990613bec565b8015610d465780601f10610d1b57610100808354040283529160200191610d46565b820191906000526020600020905b815481529060010190602001808311610d2957829003601f168201915b5050505050905090565b6000610d5b82612480565b506000908152600560205260409020546001600160a01b031690565b60128054610d8490613bec565b80601f0160208091040260200160405190810160405280929190818152602001828054610db090613bec565b8015610dfd5780601f10610dd257610100808354040283529160200191610dfd565b820191906000526020600020905b815481529060010190602001808311610de057829003601f168201915b505050505081565b6000610e1082611791565b9050806001600160a01b0316836001600160a01b03161415610e835760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610e9f5750610e9f81336120db565b610f115760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610e7a565b610f1b83836124df565b505050565b610f28612329565b6001600160a01b0381166000908152601f602052604090205460ff1615610f6a576001600160a01b0381166000908152601f60205260409020805460ff191690555b50565b610f75612329565b6000610f8060095490565b601754909150610f908383613c3d565b1115610fd75760405162461bcd60e51b81526020600482015260166024820152751b585e08139195081b1a5b5a5d08195e18d95959195960521b6044820152606401610e7a565b60015b828111610ffc57610fea8461254d565b80610ff481613c55565b915050610fda565b50505050565b61100d335b826125b5565b6110295760405162461bcd60e51b8152600401610e7a90613c70565b610f1b838383612614565b6060601c805480602002602001604051908101604052809291908181526020018280548015610d4657602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161106e575050505050905090565b60008281526010602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b031692820192909252829161110a575060408051808201909152600f546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090611129906001600160601b031687613cbe565b6111339190613cf3565b91519350909150505b9250929050565b60006001600160a01b03821661118e5760405162461bcd60e51b815260206004820152601060248201526f6e6f74207a65726f206164647265737360801b6044820152606401610e7a565b6001600160a01b0382166000908152601f602052604090205460ff16156111b757505060165490565b6111c0826127bb565b156111cd57505060155490565b505060145490565b60006111e0836117fe565b82106112425760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610e7a565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b611273612329565b601980546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6112a3612329565b6002600e5414156112f65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610e7a565b6002600e5547806113495760405162461bcd60e51b815260206004820152601960248201527f4e6f206574686572206c65667420746f207769746864726177000000000000006044820152606401610e7a565b604051600090339083908381818185875af1925050503d806000811461138b576040519150601f19603f3d011682016040523d82523d6000602084013e611390565b606091505b50509050806113d45760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610e7a565b50506001600e55565b6113e5612329565b6113ed612839565b565b610f1b83838360405180602001604052806000815250611e6c565b61141333611007565b6114785760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610e7a565b610f6a8161288b565b6060600061148e836117fe565b905060008167ffffffffffffffff8111156114ab576114ab6138ff565b6040519080825280602002602001820160405280156114d4578160200160208202803683370190505b5090506000805b83811015611564576000828152600360205260409020546001600160a01b0316151580156115225750856001600160a01b031661151783611791565b6001600160a01b0316145b156115525781838261153381613c55565b93508151811061154557611545613d07565b6020026020010181815250505b8161155c81613c55565b9250506114db565b5090949350505050565b600061157960095490565b82106115dc5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610e7a565b600982815481106115ef576115ef613d07565b90600052602060002001549050919050565b611609612329565b601b80546001600160a01b0319166001600160a01b0392909216919091179055565b611633612329565b8051610cba906011906020840190613531565b6116866040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6116c66040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b601454815260155460208201526016546040820152601754606082015260095460808201527f000000000000000000000000000000000000000000000000000000000000000060c0820152919050565b61171e612329565b8060005b81811015610ffc576001601f600086868581811061174257611742613d07565b90506020020160208101906117579190613753565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061178981613c55565b915050611722565b6000818152600360205260408120546001600160a01b031680610ca25760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610e7a565b60118054610d8490613bec565b60006001600160a01b0382166118685760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610e7a565b506001600160a01b031660009081526004602052604090205490565b61188c612329565b6113ed6000612932565b61189e612329565b6001600160a01b03166000908152601f60205260409020805460ff19166001179055565b6118ca612329565b6113ed612984565b606060028054610ccd90613bec565b6118e96129c1565b6002600e54141561193c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610e7a565b6002600e55601e5461197f5760405162461bcd60e51b815260206004820152600c60248201526b14d85b195cc818db1bdcd95960a21b6044820152606401610e7a565b600061198a60095490565b9050600082116119dc5760405162461bcd60e51b815260206004820152601b60248201527f6e65656420746f206d696e74206174206c656173742031204e465400000000006044820152606401610e7a565b7f0000000000000000000000000000000000000000000000000000000000000000821115611a4c5760405162461bcd60e51b815260206004820152601a60248201527f416d6f756e7420657865656473206c696d6974207065722074780000000000006044820152606401610e7a565b601754611a598383613c3d565b1115611aa05760405162461bcd60e51b81526020600482015260166024820152751b585e08139195081b1a5b5a5d08195e18d95959195960521b6044820152606401610e7a565b7f000000000000000000000000000000000000000000000000000000000000000082611acb336117fe565b611ad59190613c3d565b1115611b235760405162461bcd60e51b815260206004820152601d60248201527f4d617820537570706c79207065722077616c6c657420726561636865640000006044820152606401610e7a565b336000908152601f602052604090205460ff1615611bbe5733600090815260208052604081208054849290611b59908490613c3d565b90915550506018543360009081526020805260409020541115611bbe5760405162461bcd60e51b815260206004820152601860248201527f65786365656420616d6f756e7420696e2070726573616c6500000000000000006044820152606401610e7a565b6000611bc933611143565b90506000611bd78285612a07565b905034811115611c1e5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610e7a565b60015b848111611c4357611c313361254d565b80611c3b81613c55565b915050611c21565b50601a546001600160a01b03166000611c61836105dc612710612a13565b601b54604051634065da6360e01b81526001600160a01b039182166004820152919250831690634065da639083906024016000604051808303818588803b158015611cab57600080fd5b505af1158015611cbf573d6000803e3d6000fd5b5050601c54925060009150505b81811015611e0e57611d14601d8281548110611cea57611cea613d07565b600091825260209091206010820401548791600f166002026101000a900461ffff16612710612a13565b92506000601c8281548110611d2b57611d2b613d07565b60009182526020822001546040516001600160a01b039091169186919081818185875af1925050503d8060008114611d7f576040519150601f19603f3d011682016040523d82523d6000602084013e611d84565b606091505b5050905080611dfb5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610e7a565b5080611e0681613c55565b915050611ccc565b50506001600e55505050505050565b610cba338383612b25565b611e30612329565b6013805460ff19811660ff90911615179055565b611e4c612329565b601855565b611e59612329565b8051610cba906012906020840190613531565b611e7633836125b5565b611e925760405162461bcd60e51b8152600401610e7a90613c70565b610ffc84848484612bf4565b6000818152600360205260409020546060906001600160a01b0316611f1d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610e7a565b60135460ff16611fb95760128054611f3490613bec565b80601f0160208091040260200160405190810160405280929190818152602001828054611f6090613bec565b8015611fad5780601f10611f8257610100808354040283529160200191611fad565b820191906000526020600020905b815481529060010190602001808311611f9057829003601f168201915b50505050509050919050565b60006011611fc684612c27565b604051602001611fd7929190613d39565b60408051601f198184030181529190529392505050565b611ff6612329565b601655565b6060601d805480602002602001604051908101604052809291908181526020018280548015610d4657602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116120385790505050505050905090565b612082612329565b601e55565b61208f612329565b601555565b600061209f600c5490565b6120c9907f0000000000000000000000000000000000000000000000000000000000000000613e04565b905090565b6120d6612329565b601455565b60195460009060ff16801561210257506019546001600160a01b0383811661010090920416145b1561210f57506001610ca2565b6001600160a01b0380841660009081526006602090815260408083209386168352929052205460ff165b9392505050565b612148612329565b826121845760405162461bcd60e51b815260206004820152600c60248201526b656d7074792070617965657360a01b6044820152606401610e7a565b8281146121c95760405162461bcd60e51b815260206004820152601360248201527277726f6e67207061796565206e756d6265727360681b6044820152606401610e7a565b612205828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612d2592505050565b6122425760405162461bcd60e51b815260206004820152600e60248201526d696e76616c69642073686172657360901b6044820152606401610e7a565b61224e601c85856135b5565b5061225b601d8383613608565b5050505050565b61226a612329565b6019805460ff19811660ff90911615179055565b612286612329565b6001600160a01b0381166122eb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e7a565b610f6a81612932565b6122fc612329565b600954601755565b60006001600160e01b0319821663152a902d60e11b1480610ca25750610ca282612d7e565b600b546001600160a01b031633146113ed5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e7a565b6127106001600160601b03821611156123f15760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610e7a565b6001600160a01b0382166124475760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610e7a565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600f55565b6000818152600360205260409020546001600160a01b0316610f6a5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610e7a565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061251482611791565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612557612da3565b905060008111801561256b57506017548111155b6125ab5760405162461bcd60e51b81526020600482015260116024820152704d696e74206e6f7420706f737369626c6560781b6044820152606401610e7a565b610cba8282612f1f565b6000806125c183611791565b9050806001600160a01b0316846001600160a01b031614806125e857506125e881856120db565b8061260c5750836001600160a01b031661260184610d50565b6001600160a01b0316145b949350505050565b826001600160a01b031661262782611791565b6001600160a01b03161461268b5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610e7a565b6001600160a01b0382166126ed5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610e7a565b6126f8838383612f39565b6127036000826124df565b6001600160a01b038316600090815260046020526040812080546001929061272c908490613e04565b90915550506001600160a01b038216600090815260046020526040812080546001929061275a908490613c3d565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b601a5460405163288c314960e21b81526001600160a01b038381166004830152600092169063a230c5249060240160206040518083038186803b15801561280157600080fd5b505afa158015612815573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca29190613e1b565b612841612ff1565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600061289682611791565b90506128a481600084612f39565b6128af6000836124df565b6001600160a01b03811660009081526004602052604081208054600192906128d8908490613e04565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61298c6129c1565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861286e3390565b60005460ff16156113ed5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610e7a565b60006121398284613cbe565b6000808211612a575760405162461bcd60e51b815260206004820152601060248201526f4469766973696f6e206279207a65726f60801b6044820152606401610e7a565b83612a6457506000612139565b6000612a708486613cbe565b905083612a7d8683613cf3565b1415612a9557612a8d8382613cf3565b915050612139565b6000612aa18487613cf3565b90506000612aaf8588613e38565b90506000612abd8688613cf3565b90506000612acb8789613e38565b9050612b18612ae488612ade8685612a07565b9061303a565b612b12612af18686612a07565b612b12612afe8987612a07565b612b128d612b0c8c8b612a07565b90612a07565b90613046565b9998505050505050505050565b816001600160a01b0316836001600160a01b03161415612b875760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610e7a565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612bff848484612614565b612c0b84848484613052565b610ffc5760405162461bcd60e51b8152600401610e7a90613e4c565b606081612c4b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612c755780612c5f81613c55565b9150612c6e9050600a83613cf3565b9150612c4f565b60008167ffffffffffffffff811115612c9057612c906138ff565b6040519080825280601f01601f191660200182016040528015612cba576020820181803683370190505b5090505b841561260c57612ccf600183613e04565b9150612cdc600a86613e38565b612ce7906030613c3d565b60f81b818381518110612cfc57612cfc613d07565b60200101906001600160f81b031916908160001a905350612d1e600a86613cf3565b9450612cbe565b805160009081805b82811015612d7257848181518110612d4757612d47613d07565b602002602001015161ffff1682612d5e9190613c3d565b915080612d6a81613c55565b915050612d2d565b50612134149392505050565b60006001600160e01b0319821663780e9d6360e01b1480610ca25750610ca28261315f565b600080612daf600c5490565b612dd9907f0000000000000000000000000000000000000000000000000000000000000000613e04565b6040516bffffffffffffffffffffffff1933606090811b8216602084015241901b166034820152446048820152456068820152426088820152909150600090829060a8016040516020818303038152906040528051906020012060001c612e409190613e38565b6000818152600d602052604081205491925090612e5e575080612e6f565b506000818152600d60205260409020545b600d6000612e7e600186613e04565b81526020019081526020016000205460001415612eb457612ea0600184613e04565b6000838152600d6020526040902055612ee4565b600d6000612ec3600186613e04565b81526020808201929092526040908101600090812054858252600d90935220555b612eec6131af565b50612f177f000000000000000000000000000000000000000000000000000000000000000082613c3d565b935050505090565b610cba828260405180602001604052806000815250613220565b6001600160a01b038316612f9457612f8f81600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b612fb7565b816001600160a01b0316836001600160a01b031614612fb757612fb78382613253565b6001600160a01b038216612fce57610f1b816132f0565b826001600160a01b0316826001600160a01b031614610f1b57610f1b828261339f565b60005460ff166113ed5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610e7a565b60006121398284613cf3565b60006121398284613c3d565b60006001600160a01b0384163b1561315457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613096903390899088908890600401613e9e565b602060405180830381600087803b1580156130b057600080fd5b505af19250505080156130e0575060408051601f3d908101601f191682019092526130dd91810190613edb565b60015b61313a573d80801561310e576040519150601f19603f3d011682016040523d82523d6000602084013e613113565b606091505b5080516131325760405162461bcd60e51b8152600401610e7a90613e4c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061260c565b506001949350505050565b60006001600160e01b031982166380ac58cd60e01b148061319057506001600160e01b03198216635b5e139f60e01b145b80610ca257506301ffc9a760e01b6001600160e01b0319831614610ca2565b6000806131ba612094565b116132075760405162461bcd60e51b815260206004820152601860248201527f4e6f206d6f726520746f6b656e7320617661696c61626c6500000000000000006044820152606401610e7a565b600c805490600061321783613c55565b91905055905090565b61322a83836133e3565b6132376000848484613052565b610f1b5760405162461bcd60e51b8152600401610e7a90613e4c565b60006001613260846117fe565b61326a9190613e04565b6000838152600860205260409020549091508082146132bd576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b60095460009061330290600190613e04565b6000838152600a60205260408120546009805493945090928490811061332a5761332a613d07565b90600052602060002001549050806009838154811061334b5761334b613d07565b6000918252602080832090910192909255828152600a9091526040808220849055858252812055600980548061338357613383613ef8565b6001900381819060005260206000200160009055905550505050565b60006133aa836117fe565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b6001600160a01b0382166134395760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610e7a565b6000818152600360205260409020546001600160a01b03161561349e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610e7a565b6134aa60008383612f39565b6001600160a01b03821660009081526004602052604081208054600192906134d3908490613c3d565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461353d90613bec565b90600052602060002090601f01602090048101928261355f57600085556135a5565b82601f1061357857805160ff19168380011785556135a5565b828001600101855582156135a5579182015b828111156135a557825182559160200191906001019061358a565b506135b19291506136ac565b5090565b8280548282559060005260206000209081019282156135a5579160200282015b828111156135a55781546001600160a01b0319166001600160a01b038435161782556020909201916001909101906135d5565b82805482825590600052602060002090600f016010900481019282156135a55791602002820160005b8382111561367557833561ffff1683826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302613631565b80156136a35782816101000a81549061ffff0219169055600201602081600101049283019260010302613675565b50506135b19291505b5b808211156135b157600081556001016136ad565b6001600160e01b031981168114610f6a57600080fd5b6000602082840312156136e957600080fd5b8135612139816136c1565b80356001600160a01b038116811461370b57600080fd5b919050565b6000806040838503121561372357600080fd5b61372c836136f4565b915060208301356001600160601b038116811461374857600080fd5b809150509250929050565b60006020828403121561376557600080fd5b612139826136f4565b60005b83811015613789578181015183820152602001613771565b83811115610ffc5750506000910152565b600081518084526137b281602086016020860161376e565b601f01601f19169290920160200192915050565b602081526000612139602083018461379a565b6000602082840312156137eb57600080fd5b5035919050565b6000806040838503121561380557600080fd5b61380e836136f4565b946020939093013593505050565b60008060006060848603121561383157600080fd5b61383a846136f4565b9250613848602085016136f4565b9150604084013590509250925092565b6020808252825182820181905260009190848201906040850190845b818110156138995783516001600160a01b031683529284019291840191600101613874565b50909695505050505050565b600080604083850312156138b857600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b81811015613899578351835292840192918401916001016138e3565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115613930576139306138ff565b604051601f8501601f19908116603f01168101908282118183101715613958576139586138ff565b8160405280935085815286868601111561397157600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561399d57600080fd5b813567ffffffffffffffff8111156139b457600080fd5b8201601f810184136139c557600080fd5b61260c84823560208401613915565b60008083601f8401126139e657600080fd5b50813567ffffffffffffffff8111156139fe57600080fd5b6020830191508360208260051b850101111561113c57600080fd5b60008060208385031215613a2c57600080fd5b823567ffffffffffffffff811115613a4357600080fd5b613a4f858286016139d4565b90969095509350505050565b8015158114610f6a57600080fd5b60008060408385031215613a7c57600080fd5b613a85836136f4565b9150602083013561374881613a5b565b60008060008060808587031215613aab57600080fd5b613ab4856136f4565b9350613ac2602086016136f4565b925060408501359150606085013567ffffffffffffffff811115613ae557600080fd5b8501601f81018713613af657600080fd5b613b0587823560208401613915565b91505092959194509250565b6020808252825182820181905260009190848201906040850190845b8181101561389957835161ffff1683529284019291840191600101613b2d565b60008060408385031215613b6057600080fd5b613b69836136f4565b9150613b77602084016136f4565b90509250929050565b60008060008060408587031215613b9657600080fd5b843567ffffffffffffffff80821115613bae57600080fd5b613bba888389016139d4565b90965094506020870135915080821115613bd357600080fd5b50613be0878288016139d4565b95989497509550505050565b600181811c90821680613c0057607f821691505b60208210811415613c2157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115613c5057613c50613c27565b500190565b6000600019821415613c6957613c69613c27565b5060010190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b6000816000190483118215151615613cd857613cd8613c27565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613d0257613d02613cdd565b500490565b634e487b7160e01b600052603260045260246000fd5b60008151613d2f81856020860161376e565b9290920192915050565b600080845481600182811c915080831680613d5557607f831692505b6020808410821415613d7557634e487b7160e01b86526022600452602486fd5b818015613d895760018114613d9a57613dc7565b60ff19861689528489019650613dc7565b60008b81526020902060005b86811015613dbf5781548b820152908501908301613da6565b505084890196505b505050505050613dfb613dea613de483602f60f81b815260010190565b86613d1d565b64173539b7b760d91b815260050190565b95945050505050565b600082821015613e1657613e16613c27565b500390565b600060208284031215613e2d57600080fd5b815161213981613a5b565b600082613e4757613e47613cdd565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613ed19083018461379a565b9695505050505050565b600060208284031215613eed57600080fd5b8151612139816136c1565b634e487b7160e01b600052603160045260246000fdfea26469706673582212201285cd4651169158d5b98eb976262d5d27b8c731c711eafaff1be9236572d20464736f6c63430008090033000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000094e4f545345545945540000000000000000000000000000000000000000000000

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

000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000094e4f545345545945540000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _notRevealedUri (string): NOTSETYET

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [2] : 4e4f545345545945540000000000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

66194:10800:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76778:213;;;;;;;;;;-1:-1:-1;76778:213:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;76778:213:0;;;;;;;;75432:167;;;;;;;;;;-1:-1:-1;75432:167:0;;;;;:::i;:::-;;:::i;:::-;;67366:52;;;;;;;;;;-1:-1:-1;67366:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;36752:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;38362:221::-;;;;;;;;;;-1:-1:-1;38362:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2454:32:1;;;2436:51;;2424:2;2409:18;38362:221:0;2290:203:1;66506:28:0;;;;;;;;;;;;;:::i;37879:417::-;;;;;;;;;;-1:-1:-1;37879:417:0;;;;;:::i;:::-;;:::i;60126:105::-;;;;;;;;;;-1:-1:-1;60204:19:0;60126:105;;;2903:25:1;;;2891:2;2876:18;60126:105:0;2757:177:1;51413:113:0;;;;;;;;;;-1:-1:-1;51501:10:0;:17;51413:113;;68912:178;;;;;;;;;;-1:-1:-1;68912:178:0;;;;;:::i;:::-;;:::i;71314:290::-;;;;;;;;;;-1:-1:-1;71314:290:0;;;;;:::i;:::-;;:::i;66781:43::-;;;;;;;;;;;;;;;39194:373;;;;;;;;;;-1:-1:-1;39194:373:0;;;;;:::i;:::-;;:::i;74787:92::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24762:505::-;;;;;;;;;;-1:-1:-1;24762:505:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4380:32:1;;;4362:51;;4444:2;4429:18;;4422:34;;;;4335:18;24762:505:0;4188:274:1;71820:346:0;;;;;;;;;;-1:-1:-1;71820:346:0;;;;;:::i;:::-;;:::i;50994:343::-;;;;;;;;;;-1:-1:-1;50994:343:0;;;;;:::i;:::-;;:::i;73287:167::-;;;;;;;;;;-1:-1:-1;73287:167:0;;;;;:::i;:::-;;:::i;75607:290::-;;;:::i;73824:65::-;;;;;;;;;;;;;:::i;39638:185::-;;;;;;;;;;-1:-1:-1;39638:185:0;;;;;:::i;:::-;;:::i;74030:221::-;;;;;;;;;;-1:-1:-1;74030:221:0;;;;;:::i;:::-;;:::i;75905:495::-;;;;;;;;;;-1:-1:-1;75905:495:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;51603:320::-;;;;;;;;;;-1:-1:-1;51603:320:0;;;;;:::i;:::-;;:::i;66543:20::-;;;;;;;;;;-1:-1:-1;66543:20:0;;;;;;;;73172:107;;;;;;;;;;-1:-1:-1;73172:107:0;;;;;:::i;:::-;;:::i;72849:104::-;;;;;;;;;;-1:-1:-1;72849:104:0;;;;;:::i;:::-;;:::i;67992:395::-;;;;;;;;;;;;;:::i;:::-;;;;;;6467:4:1;6509:3;6498:9;6494:19;6486:27;;6546:6;6540:13;6529:9;6522:32;6610:4;6602:6;6598:17;6592:24;6585:4;6574:9;6570:20;6563:54;6673:4;6665:6;6661:17;6655:24;6648:4;6637:9;6633:20;6626:54;6736:4;6728:6;6724:17;6718:24;6711:4;6700:9;6696:20;6689:54;6799:4;6791:6;6787:17;6781:24;6774:4;6763:9;6759:20;6752:54;6862:4;6854:6;6850:17;6844:24;6837:4;6826:9;6822:20;6815:54;6925:4;6917:6;6913:17;6907:24;6900:4;6889:9;6885:20;6878:54;6329:609;;;;;6504:86:0;;;;;;;;;;-1:-1:-1;6551:4:0;6575:7;;;6504:86;;68543:233;;;;;;;;;;-1:-1:-1;68543:233:0;;;;;:::i;:::-;;:::i;36413:272::-;;;;;;;;;;-1:-1:-1;36413:272:0;;;;;:::i;:::-;;:::i;66893:33::-;;;;;;;;;;-1:-1:-1;66893:33:0;;;;;;;;66478:21;;;;;;;;;;;;;:::i;36057:294::-;;;;;;;;;;-1:-1:-1;36057:294:0;;;;;:::i;:::-;;:::i;9363:103::-;;;;;;;;;;;;;:::i;68784:120::-;;;;;;;;;;-1:-1:-1;68784:120:0;;;;;:::i;:::-;;:::i;73755:61::-;;;;;;;;;;;;;:::i;8715:87::-;;;;;;;;;;-1:-1:-1;8788:6:0;;-1:-1:-1;;;;;8788:6:0;8715:87;;66933:35;;;;;;;;;;-1:-1:-1;66933:35:0;;;;;;;-1:-1:-1;;;;;66933:35:0;;;36921:104;;;;;;;;;;;;;:::i;60421:89::-;;;;;;;;;;-1:-1:-1;60491:11:0;;60421:89;;69538:1768;;;;;;:::i;:::-;;:::i;38655:187::-;;;;;;;;;;-1:-1:-1;38655:187:0;;;;;:::i;:::-;;:::i;73090:74::-;;;;;;;;;;;;;:::i;73588:159::-;;;;;;;;;;-1:-1:-1;73588:159:0;;;;;:::i;:::-;;:::i;72961:121::-;;;;;;;;;;-1:-1:-1;72961:121:0;;;;;:::i;:::-;;:::i;66605:25::-;;;;;;;;;;;;;;;;39894:360;;;;;;;;;;-1:-1:-1;39894:360:0;;;;;:::i;:::-;;:::i;66733:41::-;;;;;;;;;;;;;;;;72200:111;;;;;;;;;;-1:-1:-1;72200:111:0;;;;;:::i;:::-;-1:-1:-1;72290:13:0;;72200:111;69406:122;;;;;;;;;;-1:-1:-1;69406:122:0;;;;;:::i;:::-;-1:-1:-1;;;;;69490:30:0;69466:4;69490:30;;;:20;:30;;;;;;;;;69406:122;72319:522;;;;;;;;;;-1:-1:-1;72319:522:0;;;;;:::i;:::-;;:::i;69300:98::-;;;;;;;;;;-1:-1:-1;69300:98:0;;;;;:::i;:::-;;:::i;66694:32::-;;;;;;;;;;;;;;;;74887:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;75310:112::-;;;;;;;;;;-1:-1:-1;75310:112:0;;;;;:::i;:::-;;:::i;69200:92::-;;;;;;;;;;-1:-1:-1;69200:92:0;;;;;:::i;:::-;;:::i;60616:122::-;;;;;;;;;;;;;:::i;69098:94::-;;;;;;;;;;-1:-1:-1;69098:94:0;;;;;:::i;:::-;;:::i;66637:28::-;;;;;;;;;;;;;;;;76408:362;;;;;;;;;;-1:-1:-1;76408:362:0;;;;;:::i;:::-;;:::i;66572:26::-;;;;;;;;;;;;;;;;74346:433;;;;;;;;;;-1:-1:-1;74346:433:0;;;;;:::i;:::-;;:::i;66831:53::-;;;;;;;;;;;;;;;73462:118;;;;;;;;;;;;;:::i;9621:238::-;;;;;;;;;;-1:-1:-1;9621:238:0;;;;;:::i;:::-;;:::i;74259:79::-;;;;;;;;;;;;;:::i;76778:213::-;76918:4;76947:36;76971:11;76947:23;:36::i;:::-;76940:43;76778:213;-1:-1:-1;;76778:213:0:o;75432:167::-;8601:13;:11;:13::i;:::-;75549:42:::1;75568:8;75578:12;75549:18;:42::i;:::-;75432:167:::0;;:::o;36752:100::-;36806:13;36839:5;36832:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36752:100;:::o;38362:221::-;38483:7;38508:23;38523:7;38508:14;:23::i;:::-;-1:-1:-1;38551:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;38551:24:0;;38362:221::o;66506:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37879:417::-;37960:13;37976:23;37991:7;37976:14;:23::i;:::-;37960:39;;38024:5;-1:-1:-1;;;;;38018:11:0;:2;-1:-1:-1;;;;;38018:11:0;;;38010:57;;;;-1:-1:-1;;;38010:57:0;;11149:2:1;38010:57:0;;;11131:21:1;11188:2;11168:18;;;11161:30;11227:34;11207:18;;;11200:62;-1:-1:-1;;;11278:18:1;;;11271:31;11319:19;;38010:57:0;;;;;;;;;4728:10;-1:-1:-1;;;;;38102:21:0;;;;:62;;-1:-1:-1;38127:37:0;38144:5;4728:10;76408:362;:::i;38127:37::-;38080:174;;;;-1:-1:-1;;;38080:174:0;;11551:2:1;38080:174:0;;;11533:21:1;11590:2;11570:18;;;11563:30;11629:34;11609:18;;;11602:62;11700:32;11680:18;;;11673:60;11750:19;;38080:174:0;11349:426:1;38080:174:0;38267:21;38276:2;38280:7;38267:8;:21::i;:::-;37949:347;37879:417;;:::o;68912:178::-;8601:13;:11;:13::i;:::-;-1:-1:-1;;;;;68987:30:0;::::1;;::::0;;;:20:::1;:30;::::0;;;;;::::1;;68983:100;;;-1:-1:-1::0;;;;;69041:30:0;::::1;;::::0;;;:20:::1;:30;::::0;;;;69034:37;;-1:-1:-1;;69034:37:0::1;::::0;;68983:100:::1;68912:178:::0;:::o;71314:290::-;8601:13;:11;:13::i;:::-;71395:14:::1;71412:13;51501:10:::0;:17;;51413:113;71412:13:::1;71466:9;::::0;71395:30;;-1:-1:-1;71445:16:0::1;71454:7:::0;71395:30;71445:16:::1;:::i;:::-;71444:31;;71436:66;;;::::0;-1:-1:-1;;;71436:66:0;;12247:2:1;71436:66:0::1;::::0;::::1;12229:21:1::0;12286:2;12266:18;;;12259:30;-1:-1:-1;;;12305:18:1;;;12298:52;12367:18;;71436:66:0::1;12045:346:1::0;71436:66:0::1;71530:1;71513:84;71538:7;71533:1;:12;71513:84;;71567:18;71581:3;71567:13;:18::i;:::-;71547:3:::0;::::1;::::0;::::1;:::i;:::-;;;;71513:84;;;;71384:220;71314:290:::0;;:::o;39194:373::-;39403:41;4728:10;39422:12;39436:7;39403:18;:41::i;:::-;39381:137;;;;-1:-1:-1;;;39381:137:0;;;;;;;:::i;:::-;39531:28;39541:4;39547:2;39551:7;39531:9;:28::i;74787:92::-;74829:16;74865:6;74858:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;74858:13:0;;;;;;;;;;;;;;;;;;;;;;74787:92;:::o;24762:505::-;24904:7;24967:27;;;:17;:27;;;;;;;;24938:56;;;;;;;;;-1:-1:-1;;;;;24938:56:0;;;;;-1:-1:-1;;;24938:56:0;;;-1:-1:-1;;;;;24938:56:0;;;;;;;;24904:7;;25007:92;;-1:-1:-1;25058:29:0;;;;;;;;;25068:19;25058:29;-1:-1:-1;;;;;25058:29:0;;;;-1:-1:-1;;;25058:29:0;;-1:-1:-1;;;;;25058:29:0;;;;;25007:92;25149:23;;;;25111:21;;25633:5;;25136:36;;-1:-1:-1;;;;;25136:36:0;:10;:36;:::i;:::-;25135:71;;;;:::i;:::-;25227:16;;;-1:-1:-1;25111:95:0;;-1:-1:-1;;24762:505:0;;;;;;:::o;71820:346::-;71885:7;-1:-1:-1;;;;;71913:22:0;;71905:51;;;;-1:-1:-1;;;71905:51:0;;13583:2:1;71905:51:0;;;13565:21:1;13622:2;13602:18;;;13595:30;-1:-1:-1;;;13641:18:1;;;13634:46;13697:18;;71905:51:0;13381:340:1;71905:51:0;-1:-1:-1;;;;;69490:30:0;;69466:4;69490:30;;;:20;:30;;;;;;;;71967:74;;;-1:-1:-1;;72016:13:0;;;71820:346::o;71967:74::-;72055:27;72073:8;72055:17;:27::i;:::-;72051:77;;;-1:-1:-1;;72106:10:0;;;71820:346::o;72051:77::-;-1:-1:-1;;72147:11:0;;;71820:346::o;50994:343::-;51136:7;51191:23;51208:5;51191:16;:23::i;:::-;51183:5;:31;51161:124;;;;-1:-1:-1;;;51161:124:0;;13928:2:1;51161:124:0;;;13910:21:1;13967:2;13947:18;;;13940:30;14006:34;13986:18;;;13979:62;-1:-1:-1;;;14057:18:1;;;14050:41;14108:19;;51161:124:0;13726:407:1;51161:124:0;-1:-1:-1;;;;;;51303:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;50994:343::o;73287:167::-;8601:13;:11;:13::i;:::-;73402:20:::1;:44:::0;;-1:-1:-1;;;;;73402:44:0;;::::1;;;-1:-1:-1::0;;;;;;73402:44:0;;::::1;::::0;;;::::1;::::0;;73287:167::o;75607:290::-;8601:13;:11;:13::i;:::-;65247:1:::1;65845:7;;:19;;65837:63;;;::::0;-1:-1:-1;;;65837:63:0;;14340:2:1;65837:63:0::1;::::0;::::1;14322:21:1::0;14379:2;14359:18;;;14352:30;14418:33;14398:18;;;14391:61;14469:18;;65837:63:0::1;14138:355:1::0;65837:63:0::1;65247:1;65978:7;:18:::0;75694:21:::2;75734:11:::0;75726:49:::2;;;::::0;-1:-1:-1;;;75726:49:0;;14700:2:1;75726:49:0::2;::::0;::::2;14682:21:1::0;14739:2;14719:18;;;14712:30;14778:27;14758:18;;;14751:55;14823:18;;75726:49:0::2;14498:349:1::0;75726:49:0::2;75805:37;::::0;75787:12:::2;::::0;75806:10:::2;::::0;75830:7;;75787:12;75805:37;75787:12;75805:37;75830:7;75806:10;75805:37:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75786:56;;;75861:7;75853:36;;;::::0;-1:-1:-1;;;75853:36:0;;15264:2:1;75853:36:0::2;::::0;::::2;15246:21:1::0;15303:2;15283:18;;;15276:30;-1:-1:-1;;;15322:18:1;;;15315:46;15378:18;;75853:36:0::2;15062:340:1::0;75853:36:0::2;-1:-1:-1::0;;65203:1:0::1;66157:7;:22:::0;75607:290::o;73824:65::-;8601:13;:11;:13::i;:::-;73871:10:::1;:8;:10::i;:::-;73824:65::o:0;39638:185::-;39776:39;39793:4;39799:2;39803:7;39776:39;;;;;;;;;;;;:16;:39::i;74030:221::-;74101:41;4728:10;74120:12;4648:98;74101:41;74079:139;;;;-1:-1:-1;;;74079:139:0;;15609:2:1;74079:139:0;;;15591:21:1;15648:2;15628:18;;;15621:30;15687:34;15667:18;;;15660:62;-1:-1:-1;;;15738:18:1;;;15731:46;15794:19;;74079:139:0;15407:412:1;74079:139:0;74229:14;74235:7;74229:5;:14::i;75905:495::-;75992:16;76026:15;76044:17;76054:6;76044:9;:17::i;:::-;76026:35;;76072:23;76112:7;76098:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76098:22:0;;76072:48;;76131:15;76157:13;76183:186;76198:7;76190:5;:15;76183:186;;;41863:4;41887:16;;;:7;:16;;;;;;-1:-1:-1;;;;;41887:16:0;:30;;76226:46;;;;;76266:6;-1:-1:-1;;;;;76246:26:0;:16;76254:7;76246;:16::i;:::-;-1:-1:-1;;;;;76246:26:0;;76226:46;76222:112;;;76311:7;76293:6;76300:7;;;;:::i;:::-;;;76293:15;;;;;;;;:::i;:::-;;;;;;:25;;;;;76222:112;76348:9;;;;:::i;:::-;;;;76183:186;;;-1:-1:-1;76386:6:0;;75905:495;-1:-1:-1;;;;75905:495:0:o;51603:320::-;51723:7;51778:30;51501:10;:17;;51413:113;51778:30;51770:5;:38;51748:132;;;;-1:-1:-1;;;51748:132:0;;16158:2:1;51748:132:0;;;16140:21:1;16197:2;16177:18;;;16170:30;16236:34;16216:18;;;16209:62;-1:-1:-1;;;16287:18:1;;;16280:42;16339:19;;51748:132:0;15956:408:1;51748:132:0;51898:10;51909:5;51898:17;;;;;;;;:::i;:::-;;;;;;;;;51891:24;;51603:320;;;:::o;73172:107::-;8601:13;:11;:13::i;:::-;73251:8:::1;:20:::0;;-1:-1:-1;;;;;;73251:20:0::1;-1:-1:-1::0;;;;;73251:20:0;;;::::1;::::0;;;::::1;::::0;;73172:107::o;72849:104::-;8601:13;:11;:13::i;:::-;72924:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;67992:395::-:0;68032:12;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68032:12:0;68057:21;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68057:21:0;68112:11;;68089:34;;68156:10;;68134:19;;;:32;68202:13;;68177:22;;;:38;68247:9;;68226:18;;;:30;51501:10;:17;68267:20;;;:36;68338:13;68314:21;;;:37;68267:8;67992:395;-1:-1:-1;67992:395:0:o;68543:233::-;8601:13;:11;:13::i;:::-;68638:10;68624:11:::1;68666:103;68690:3;68686:1;:7;68666:103;;;68753:4;68715:20;:35;68736:10;;68747:1;68736:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;68715:35:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;68715:35:0;:42;;-1:-1:-1;;68715:42:0::1;::::0;::::1;;::::0;;;::::1;::::0;;68695:3;::::1;::::0;::::1;:::i;:::-;;;;68666:103;;36413:272:::0;36530:7;36571:16;;;:7;:16;;;;;;-1:-1:-1;;;;;36571:16:0;36606:19;36598:56;;;;-1:-1:-1;;;36598:56:0;;16571:2:1;36598:56:0;;;16553:21:1;16610:2;16590:18;;;16583:30;-1:-1:-1;;;16629:18:1;;;16622:54;16693:18;;36598:56:0;16369:348:1;66478:21:0;;;;;;;:::i;36057:294::-;36174:7;-1:-1:-1;;;;;36221:19:0;;36199:110;;;;-1:-1:-1;;;36199:110:0;;16924:2:1;36199:110:0;;;16906:21:1;16963:2;16943:18;;;16936:30;17002:34;16982:18;;;16975:62;-1:-1:-1;;;17053:18:1;;;17046:39;17102:19;;36199:110:0;16722:405:1;36199:110:0;-1:-1:-1;;;;;;36327:16:0;;;;;:9;:16;;;;;;;36057:294::o;9363:103::-;8601:13;:11;:13::i;:::-;9428:30:::1;9455:1;9428:18;:30::i;68784:120::-:0;8601:13;:11;:13::i;:::-;-1:-1:-1;;;;;68859:30:0::1;;::::0;;;:20:::1;:30;::::0;;;;:37;;-1:-1:-1;;68859:37:0::1;68892:4;68859:37;::::0;;68784:120::o;73755:61::-;8601:13;:11;:13::i;:::-;73800:8:::1;:6;:8::i;36921:104::-:0;36977:13;37010:7;37003:14;;;;;:::i;69538:1768::-;6109:19;:17;:19::i;:::-;65247:1:::1;65845:7;;:19;;65837:63;;;::::0;-1:-1:-1;;;65837:63:0;;14340:2:1;65837:63:0::1;::::0;::::1;14322:21:1::0;14379:2;14359:18;;;14352:30;14418:33;14398:18;;;14391:61;14469:18;;65837:63:0::1;14138:355:1::0;65837:63:0::1;65247:1;65978:7;:18:::0;69706:15:::2;::::0;69684:82:::2;;;::::0;-1:-1:-1;;;69684:82:0;;17334:2:1;69684:82:0::2;::::0;::::2;17316:21:1::0;17373:2;17353:18;;;17346:30;-1:-1:-1;;;17392:18:1;;;17385:42;17444:18;;69684:82:0::2;17132:336:1::0;69684:82:0::2;69779:14;69796:13;51501:10:::0;:17;;51413:113;69796:13:::2;69779:30;;69842:1;69828:11;:15;69820:55;;;::::0;-1:-1:-1;;;69820:55:0;;17675:2:1;69820:55:0::2;::::0;::::2;17657:21:1::0;17714:2;17694:18;;;17687:30;17753:29;17733:18;;;17726:57;17800:18;;69820:55:0::2;17473:351:1::0;69820:55:0::2;69909:13;69894:11;:28;;69886:67;;;::::0;-1:-1:-1;;;69886:67:0;;18031:2:1;69886:67:0::2;::::0;::::2;18013:21:1::0;18070:2;18050:18;;;18043:30;18109:28;18089:18;;;18082:56;18155:18;;69886:67:0::2;17829:350:1::0;69886:67:0::2;69998:9;::::0;69973:20:::2;69982:11:::0;69973:6;:20:::2;:::i;:::-;69972:35;;69964:70;;;::::0;-1:-1:-1;;;69964:70:0;;12247:2:1;69964:70:0::2;::::0;::::2;12229:21:1::0;12286:2;12266:18;;;12259:30;-1:-1:-1;;;12305:18:1;;;12298:52;12367:18;;69964:70:0::2;12045:346:1::0;69964:70:0::2;70108:20;70093:11;70069:21;70079:10;70069:9;:21::i;:::-;:35;;;;:::i;:::-;:59;;70047:138;;;::::0;-1:-1:-1;;;70047:138:0;;18386:2:1;70047:138:0::2;::::0;::::2;18368:21:1::0;18425:2;18405:18;;;18398:30;18464:31;18444:18;;;18437:59;18513:18;;70047:138:0::2;18184:353:1::0;70047:138:0::2;70212:10;69466:4:::0;69490:30;;;:20;:30;;;;;;;;70196:248:::2;;;70256:10;70240:27;::::0;;;:15:::2;:27:::0;;;;;:42;;70271:11;;70240:27;:42:::2;::::0;70271:11;;70240:42:::2;:::i;:::-;::::0;;;-1:-1:-1;;70354:18:0::2;::::0;70339:10:::2;70323:27;::::0;;;:15:::2;:27:::0;;;;;;:49:::2;;70297:135;;;::::0;-1:-1:-1;;;70297:135:0;;18744:2:1;70297:135:0::2;::::0;::::2;18726:21:1::0;18783:2;18763:18;;;18756:30;18822:26;18802:18;;;18795:54;18866:18;;70297:135:0::2;18542:348:1::0;70297:135:0::2;70454:12;70469:20;70478:10;70469:8;:20::i;:::-;70454:35:::0;-1:-1:-1;70500:17:0::2;70520:21;70454:35:::0;70529:11;70520:8:::2;:21::i;:::-;70500:41;;70573:9;70560;:22;;70552:53;;;::::0;-1:-1:-1;;;70552:53:0;;19097:2:1;70552:53:0::2;::::0;::::2;19079:21:1::0;19136:2;19116:18;;;19109:30;-1:-1:-1;;;19155:18:1;;;19148:48;19213:18;;70552:53:0::2;18895:342:1::0;70552:53:0::2;70635:1;70618:95;70643:11;70638:1;:16;70618:95;;70676:25;70690:10;70676:13;:25::i;:::-;70656:3:::0;::::2;::::0;::::2;:::i;:::-;;;;70618:95;;;-1:-1:-1::0;70748:13:0::2;::::0;-1:-1:-1;;;;;70748:13:0::2;70725;70807:29;:9:::0;70824:4:::2;70830:5;70807:16;:29::i;:::-;70881:8;::::0;70847:43:::2;::::0;-1:-1:-1;;;70847:43:0;;-1:-1:-1;;;;;70881:8:0;;::::2;70847:43;::::0;::::2;2436:51:1::0;70798:38:0;;-1:-1:-1;70847:18:0;::::2;::::0;::::2;::::0;70798:38;;2409:18:1;;70847:43:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;70962:6:0::2;:13:::0;;-1:-1:-1;70948:11:0::2;::::0;-1:-1:-1;;70986:313:0::2;71010:3;71006:1;:7;70986:313;;;71044:34;71061:6;71068:1;71061:9;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;::::2;;::::0;71044;;71061;;::::2;;;;::::0;::::2;;;71072:5;71044:16;:34::i;:::-;71035:43;;71094:12;71112:6;71119:1;71112:9;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;::::2;::::0;:33:::2;::::0;-1:-1:-1;;;;;71112:9:0;;::::2;::::0;71134:6;;71112:33;;:9;:33;71134:6;71112:9;:33:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71093:52;;;71186:7;71160:127;;;::::0;-1:-1:-1;;;71160:127:0;;19444:2:1;71160:127:0::2;::::0;::::2;19426:21:1::0;19483:2;19463:18;;;19456:30;19522:34;19502:18;;;19495:62;19593:28;19573:18;;;19566:56;19639:19;;71160:127:0::2;19242:422:1::0;71160:127:0::2;-1:-1:-1::0;71015:3:0;::::2;::::0;::::2;:::i;:::-;;;;70986:313;;;-1:-1:-1::0;;65203:1:0::1;66157:7;:22:::0;-1:-1:-1;;;;;;69538:1768:0:o;38655:187::-;38782:52;4728:10;38815:8;38825;38782:18;:52::i;73090:74::-;8601:13;:11;:13::i;:::-;73148:8:::1;::::0;;-1:-1:-1;;73136:20:0;::::1;73148:8;::::0;;::::1;73147:9;73136:20;::::0;;73090:74::o;73588:159::-;8601:13;:11;:13::i;:::-;73699:18:::1;:40:::0;73588:159::o;72961:121::-;8601:13;:11;:13::i;:::-;73042:32;;::::1;::::0;:14:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;39894:360::-:0;40082:41;4728:10;40115:7;40082:18;:41::i;:::-;40060:137;;;;-1:-1:-1;;;40060:137:0;;;;;;;:::i;:::-;40208:38;40222:4;40228:2;40232:7;40241:4;40208:13;:38::i;72319:522::-;41863:4;41887:16;;;:7;:16;;;;;;72438:13;;-1:-1:-1;;;;;41887:16:0;72469:114;;;;-1:-1:-1;;;72469:114:0;;19871:2:1;72469:114:0;;;19853:21:1;19910:2;19890:18;;;19883:30;19949:34;19929:18;;;19922:62;-1:-1:-1;;;20000:18:1;;;19993:45;20055:19;;72469:114:0;19669:411:1;72469:114:0;72600:8;;;;72596:71;;72641:14;72634:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72319:522;;;:::o;72596:71::-;72679:23;72743:7;72757:26;72774:8;72757:16;:26::i;:::-;72726:67;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;72726:67:0;;;;;;;;;;72319:522;-1:-1:-1;;;72319:522:0:o;69300:98::-;8601:13;:11;:13::i;:::-;69369::::1;:21:::0;69300:98::o;74887:91::-;74929:15;74964:6;74957:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74887:91;:::o;75310:112::-;8601:13;:11;:13::i;:::-;75386:15:::1;:28:::0;75310:112::o;69200:92::-;8601:13;:11;:13::i;:::-;69266:10:::1;:18:::0;69200:92::o;60616:122::-;60668:7;60718:12;60491:11;;;60421:89;60718:12;60695:35;;60204:19;60695:35;:::i;:::-;60688:42;;60616:122;:::o;69098:94::-;8601:13;:11;:13::i;:::-;69165:11:::1;:19:::0;69098:94::o;76408:362::-;76586:21;;76535:15;;76586:21;;:67;;;;-1:-1:-1;76632:20:0;;-1:-1:-1;;;;;76611:42:0;;;76632:20;;;;;76611:42;76586:67;76568:135;;;-1:-1:-1;76687:4:0;76680:11;;76568:135;-1:-1:-1;;;;;39084:25:0;;;39055:4;39084:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;76720:42;76713:49;76408:362;-1:-1:-1;;;76408:362:0:o;74346:433::-;8601:13;:11;:13::i;:::-;74494:22;74486:47:::1;;;::::0;-1:-1:-1;;;74486:47:0;;22408:2:1;74486:47:0::1;::::0;::::1;22390:21:1::0;22447:2;22427:18;;;22420:30;-1:-1:-1;;;22466:18:1;;;22459:42;22518:18;;74486:47:0::1;22206:336:1::0;74486:47:0::1;74552:38:::0;;::::1;74544:70;;;::::0;-1:-1:-1;;;74544:70:0;;22749:2:1;74544:70:0::1;::::0;::::1;22731:21:1::0;22788:2;22768:18;;;22761:30;-1:-1:-1;;;22807:18:1;;;22800:49;22866:18;;74544:70:0::1;22547:343:1::0;74544:70:0::1;74632:27;74648:10;;74632:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;74632:15:0::1;::::0;-1:-1:-1;;;74632:27:0:i:1;:::-;74627:85;;74676:24;::::0;-1:-1:-1;;;74676:24:0;;23097:2:1;74676:24:0::1;::::0;::::1;23079:21:1::0;23136:2;23116:18;;;23109:30;-1:-1:-1;;;23155:18:1;;;23148:44;23209:18;;74676:24:0::1;22895:338:1::0;74627:85:0::1;74722:19;:6;74731:10:::0;;74722:19:::1;:::i;:::-;-1:-1:-1::0;74752:19:0::1;:6;74761:10:::0;;74752:19:::1;:::i;:::-;;74346:433:::0;;;;:::o;73462:118::-;8601:13;:11;:13::i;:::-;73551:21:::1;::::0;;-1:-1:-1;;73526:46:0;::::1;73551:21;::::0;;::::1;73550:22;73526:46;::::0;;73462:118::o;9621:238::-;8601:13;:11;:13::i;:::-;-1:-1:-1;;;;;9724:22:0;::::1;9702:110;;;::::0;-1:-1:-1;;;9702:110:0;;23440:2:1;9702:110:0::1;::::0;::::1;23422:21:1::0;23479:2;23459:18;;;23452:30;23518:34;23498:18;;;23491:62;-1:-1:-1;;;23569:18:1;;;23562:36;23615:19;;9702:110:0::1;23238:402:1::0;9702:110:0::1;9823:28;9842:8;9823:18;:28::i;74259:79::-:0;8601:13;:11;:13::i;:::-;51501:10;:17;74305:9:::1;:25:::0;74259:79::o;24416:291::-;24563:4;-1:-1:-1;;;;;;24605:41:0;;-1:-1:-1;;;24605:41:0;;:94;;;24663:36;24687:11;24663:23;:36::i;8880:132::-;8788:6;;-1:-1:-1;;;;;8788:6:0;4728:10;8944:23;8936:68;;;;-1:-1:-1;;;8936:68:0;;23847:2:1;8936:68:0;;;23829:21:1;;;23866:18;;;23859:30;23925:34;23905:18;;;23898:62;23977:18;;8936:68:0;23645:356:1;25917:392:0;25633:5;-1:-1:-1;;;;;26057:33:0;;;;26035:125;;;;-1:-1:-1;;;26035:125:0;;24208:2:1;26035:125:0;;;24190:21:1;24247:2;24227:18;;;24220:30;24286:34;24266:18;;;24259:62;-1:-1:-1;;;24337:18:1;;;24330:40;24387:19;;26035:125:0;24006:406:1;26035:125:0;-1:-1:-1;;;;;26179:22:0;;26171:60;;;;-1:-1:-1;;;26171:60:0;;24619:2:1;26171:60:0;;;24601:21:1;24658:2;24638:18;;;24631:30;24697:27;24677:18;;;24670:55;24742:18;;26171:60:0;24417:349:1;26171:60:0;26266:35;;;;;;;;;-1:-1:-1;;;;;26266:35:0;;;;;;-1:-1:-1;;;;;26266:35:0;;;;;;;;;;-1:-1:-1;;;26244:57:0;;;;:19;:57;25917:392::o;46684:135::-;41863:4;41887:16;;;:7;:16;;;;;;-1:-1:-1;;;;;41887:16:0;46758:53;;;;-1:-1:-1;;;46758:53:0;;16571:2:1;46758:53:0;;;16553:21:1;16610:2;16590:18;;;16583:30;-1:-1:-1;;;16629:18:1;;;16622:54;16693:18;;46758:53:0;16369:348:1;45963:174:0;46038:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;46038:29:0;-1:-1:-1;;;;;46038:29:0;;;;;;;;:24;;46092:23;46038:24;46092:14;:23::i;:::-;-1:-1:-1;;;;;46083:46:0;;;;;;;;;;;45963:174;;:::o;71612:180::-;71666:10;71679:11;:9;:11::i;:::-;71666:24;;71714:1;71709:2;:6;:25;;;;;71725:9;;71719:2;:15;;71709:25;71701:55;;;;-1:-1:-1;;;71701:55:0;;24973:2:1;71701:55:0;;;24955:21:1;25012:2;24992:18;;;24985:30;-1:-1:-1;;;25031:18:1;;;25024:47;25088:18;;71701:55:0;24771:341:1;71701:55:0;71767:17;71777:2;71781;71767:9;:17::i;42092:331::-;42221:4;42243:13;42259:23;42274:7;42259:14;:23::i;:::-;42243:39;;42312:5;-1:-1:-1;;;;;42301:16:0;:7;-1:-1:-1;;;;;42301:16:0;;:65;;;;42334:32;42351:5;42358:7;42334:16;:32::i;:::-;42301:113;;;;42407:7;-1:-1:-1;;;;;42383:31:0;:20;42395:7;42383:11;:20::i;:::-;-1:-1:-1;;;;;42383:31:0;;42301:113;42293:122;42092:331;-1:-1:-1;;;;42092:331:0:o;45182:662::-;45355:4;-1:-1:-1;;;;;45328:31:0;:23;45343:7;45328:14;:23::i;:::-;-1:-1:-1;;;;;45328:31:0;;45306:118;;;;-1:-1:-1;;;45306:118:0;;25319:2:1;45306:118:0;;;25301:21:1;25358:2;25338:18;;;25331:30;25397:34;25377:18;;;25370:62;-1:-1:-1;;;25448:18:1;;;25441:35;25493:19;;45306:118:0;25117:401:1;45306:118:0;-1:-1:-1;;;;;45443:16:0;;45435:65;;;;-1:-1:-1;;;45435:65:0;;25725:2:1;45435:65:0;;;25707:21:1;25764:2;25744:18;;;25737:30;25803:34;25783:18;;;25776:62;-1:-1:-1;;;25854:18:1;;;25847:34;25898:19;;45435:65:0;25523:400:1;45435:65:0;45513:39;45534:4;45540:2;45544:7;45513:20;:39::i;:::-;45617:29;45634:1;45638:7;45617:8;:29::i;:::-;-1:-1:-1;;;;;45659:15:0;;;;;;:9;:15;;;;;:20;;45678:1;;45659:15;:20;;45678:1;;45659:20;:::i;:::-;;;;-1:-1:-1;;;;;;;45690:13:0;;;;;;:9;:13;;;;;:18;;45707:1;;45690:13;:18;;45707:1;;45690:18;:::i;:::-;;;;-1:-1:-1;;45719:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;45719:21:0;-1:-1:-1;;;;;45719:21:0;;;;;;;;;45758:27;;45719:16;;45758:27;;;;;;;37949:347;37879:417;;:::o;68395:140::-;68494:13;;68487:40;;-1:-1:-1;;;68487:40:0;;-1:-1:-1;;;;;2454:32:1;;;68487:40:0;;;2436:51:1;68463:4:0;;68494:13;;68487:30;;2409:18:1;;68487:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;7359:120::-;6368:16;:14;:16::i;:::-;7428:5:::1;7418:15:::0;;-1:-1:-1;;7418:15:0::1;::::0;;7449:22:::1;4728:10:::0;7458:12:::1;7449:22;::::0;-1:-1:-1;;;;;2454:32:1;;;2436:51;;2424:2;2409:18;7449:22:0::1;;;;;;;7359:120::o:0;44425:420::-;44485:13;44501:23;44516:7;44501:14;:23::i;:::-;44485:39;;44537:48;44558:5;44573:1;44577:7;44537:20;:48::i;:::-;44626:29;44643:1;44647:7;44626:8;:29::i;:::-;-1:-1:-1;;;;;44668:16:0;;;;;;:9;:16;;;;;:21;;44688:1;;44668:16;:21;;44688:1;;44668:21;:::i;:::-;;;;-1:-1:-1;;44707:16:0;;;;:7;:16;;;;;;44700:23;;-1:-1:-1;;;;;;44700:23:0;;;44741:36;44715:7;;44707:16;-1:-1:-1;;;;;44741:36:0;;;;;44707:16;;44741:36;75432:167;;:::o;10019:191::-;10112:6;;;-1:-1:-1;;;;;10129:17:0;;;-1:-1:-1;;;;;;10129:17:0;;;;;;;10162:40;;10112:6;;;10129:17;10112:6;;10162:40;;10093:16;;10162:40;10082:128;10019:191;:::o;7100:118::-;6109:19;:17;:19::i;:::-;7160:7:::1;:14:::0;;-1:-1:-1;;7160:14:0::1;7170:4;7160:14;::::0;;7190:20:::1;7197:12;4728:10:::0;;4648:98;6663:108;6551:4;6575:7;;;6733:9;6725:38;;;;-1:-1:-1;;;6725:38:0;;26380:2:1;6725:38:0;;;26362:21:1;26419:2;26399:18;;;26392:30;-1:-1:-1;;;26438:18:1;;;26431:46;26494:18;;6725:38:0;26178:340:1;58238:98:0;58296:7;58323:5;58327:1;58323;:5;:::i;58910:729::-;59016:7;59048:1;59044;:5;59036:34;;;;-1:-1:-1;;;59036:34:0;;26725:2:1;59036:34:0;;;26707:21:1;26764:2;26744:18;;;26737:30;-1:-1:-1;;;26783:18:1;;;26776:46;26839:18;;59036:34:0;26523:340:1;59036:34:0;59087:6;59083:20;;-1:-1:-1;59102:1:0;59095:8;;59083:20;59114:10;59127:5;59131:1;59127;:5;:::i;:::-;59114:18;-1:-1:-1;59157:1:0;59147:6;59152:1;59114:18;59147:6;:::i;:::-;:11;59143:120;;;59245:6;59250:1;59245:2;:6;:::i;:::-;59238:13;;;;;59143:120;59335:9;59347:5;59351:1;59347;:5;:::i;:::-;59335:17;-1:-1:-1;59363:9:0;59375:5;59379:1;59375;:5;:::i;:::-;59363:17;-1:-1:-1;59470:9:0;59482:5;59486:1;59482;:5;:::i;:::-;59470:17;-1:-1:-1;59498:9:0;59510:5;59514:1;59510;:5;:::i;:::-;59498:17;-1:-1:-1;59565:66:0;59615:15;59628:1;59615:8;:1;59498:17;59615:5;:8::i;:::-;:12;;:15::i;:::-;59565:45;59601:8;:1;59607;59601:5;:8::i;:::-;59565:31;59587:8;:1;59593;59587:5;:8::i;:::-;59566:15;59579:1;59566:8;:1;59572;59566:5;:8::i;:::-;:12;;:15::i;:::-;59565:21;;:31::i;:66::-;59545:86;58910:729;-1:-1:-1;;;;;;;;;58910:729:0:o;46280:315::-;46435:8;-1:-1:-1;;;;;46426:17:0;:5;-1:-1:-1;;;;;46426:17:0;;;46418:55;;;;-1:-1:-1;;;46418:55:0;;27187:2:1;46418:55:0;;;27169:21:1;27226:2;27206:18;;;27199:30;27265:27;27245:18;;;27238:55;27310:18;;46418:55:0;26985:349:1;46418:55:0;-1:-1:-1;;;;;46484:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;46484:46:0;;;;;;;;;;46546:41;;540::1;;;46546::0;;513:18:1;46546:41:0;;;;;;;46280:315;;;:::o;41135:350::-;41291:28;41301:4;41307:2;41311:7;41291:9;:28::i;:::-;41352:47;41375:4;41381:2;41385:7;41394:4;41352:22;:47::i;:::-;41330:147;;;;-1:-1:-1;;;41330:147:0;;;;;;;:::i;1899:723::-;1955:13;2176:10;2172:53;;-1:-1:-1;;2203:10:0;;;;;;;;;;;;-1:-1:-1;;;2203:10:0;;;;;1899:723::o;2172:53::-;2250:5;2235:12;2291:78;2298:9;;2291:78;;2324:8;;;;:::i;:::-;;-1:-1:-1;2347:10:0;;-1:-1:-1;2355:2:0;2347:10;;:::i;:::-;;;2291:78;;;2379:19;2411:6;2401:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2401:17:0;;2379:39;;2429:154;2436:10;;2429:154;;2463:11;2473:1;2463:11;;:::i;:::-;;-1:-1:-1;2532:10:0;2540:2;2532:5;:10;:::i;:::-;2519:24;;:2;:24;:::i;:::-;2506:39;;2489:6;2496;2489:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;2489:56:0;;;;;;;;-1:-1:-1;2560:11:0;2569:2;2560:11;;:::i;:::-;;;2429:154;;74986:316;75121:14;;75085:4;;;;75174:84;75198:3;75194:1;:7;75174:84;;;75236:7;75244:1;75236:10;;;;;;;;:::i;:::-;;;;;;;75223:23;;;;;;;:::i;:::-;;-1:-1:-1;75203:3:0;;;;:::i;:::-;;;;75174:84;;;-1:-1:-1;75290:4:0;75277:17;;74986:316;-1:-1:-1;;;74986:316:0:o;50610:300::-;50757:4;-1:-1:-1;;;;;;50799:50:0;;-1:-1:-1;;;50799:50:0;;:103;;;50866:36;50890:11;50866:23;:36::i;62264:1325::-;62312:7;62332:16;62374:12;60491:11;;;60421:89;62374:12;62351:35;;60204:19;62351:35;:::i;:::-;62464:219;;-1:-1:-1;;62503:10:0;28085:2:1;28081:15;;;28077:24;;62464:219:0;;;28065:37:1;62536:14:0;28136:15:1;;28132:24;28118:12;;;28111:46;62573:16:0;28173:12:1;;;28166:28;62612:14:0;28210:12:1;;;28203:28;62649:15:0;28247:13:1;;;28240:29;62332:54:0;;-1:-1:-1;62397:14:0;;62332:54;;28285:13:1;;62464:219:0;;;;;;;;;;;;62436:262;;;;;;62414:295;;:306;;;;:::i;:::-;62733:13;62765:19;;;:11;:19;;;;;;62397:323;;-1:-1:-1;62733:13:0;62761:304;;-1:-1:-1;62910:6:0;62761:304;;;-1:-1:-1;63034:19:0;;;;:11;:19;;;;;;62761:304;63142:11;:25;63154:12;63165:1;63154:8;:12;:::i;:::-;63142:25;;;;;;;;;;;;63171:1;63142:30;63138:331;;;63276:12;63287:1;63276:8;:12;:::i;:::-;63254:19;;;;:11;:19;;;;;:34;63138:331;;;63432:11;:25;63444:12;63455:1;63444:8;:12;:::i;:::-;63432:25;;;;;;;;;;;;;;-1:-1:-1;63432:25:0;;;;63410:19;;;:11;:19;;;;:47;63138:331;63527:17;:15;:17::i;:::-;-1:-1:-1;63564:17:0;63572:9;63564:5;:17;:::i;:::-;63557:24;;;;;62264:1325;:::o;42765:110::-;42841:26;42851:2;42855:7;42841:26;;;;;;;;;;;;:9;:26::i;52536:589::-;-1:-1:-1;;;;;52742:18:0;;52738:187;;52777:40;52809:7;53952:10;:17;;53925:24;;;;:15;:24;;;;;:44;;;53980:24;;;;;;;;;;;;53848:164;52777:40;52738:187;;;52847:2;-1:-1:-1;;;;;52839:10:0;:4;-1:-1:-1;;;;;52839:10:0;;52835:90;;52866:47;52899:4;52905:7;52866:32;:47::i;:::-;-1:-1:-1;;;;;52939:16:0;;52935:183;;52972:45;53009:7;52972:36;:45::i;52935:183::-;53045:4;-1:-1:-1;;;;;53039:10:0;:2;-1:-1:-1;;;;;53039:10:0;;53035:83;;53066:40;53094:2;53098:7;53066:27;:40::i;6848:108::-;6551:4;6575:7;;;6907:41;;;;-1:-1:-1;;;6907:41:0;;28511:2:1;6907:41:0;;;28493:21:1;28550:2;28530:18;;;28523:30;-1:-1:-1;;;28569:18:1;;;28562:50;28629:18;;6907:41:0;28309:344:1;58637:98:0;58695:7;58722:5;58726:1;58722;:5;:::i;57500:98::-;57558:7;57585:5;57589:1;57585;:5;:::i;47383:1034::-;47537:4;-1:-1:-1;;;;;47558:13:0;;11743:19;:23;47554:856;;47611:174;;-1:-1:-1;;;47611:174:0;;-1:-1:-1;;;;;47611:36:0;;;;;:174;;4728:10;;47705:4;;47732:7;;47762:4;;47611:174;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47611:174:0;;;;;;;;-1:-1:-1;;47611:174:0;;;;;;;;;;;;:::i;:::-;;;47590:765;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47968:13:0;;47964:376;;48011:108;;-1:-1:-1;;;48011:108:0;;;;;;;:::i;47964:376::-;48290:6;48284:13;48275:6;48271:2;48267:15;48260:38;47590:765;-1:-1:-1;;;;;;47849:51:0;-1:-1:-1;;;47849:51:0;;-1:-1:-1;47842:58:0;;47554:856;-1:-1:-1;48394:4:0;47383:1034;;;;;;:::o;35638:355::-;35785:4;-1:-1:-1;;;;;;35827:40:0;;-1:-1:-1;;;35827:40:0;;:105;;-1:-1:-1;;;;;;;35884:48:0;;-1:-1:-1;;;35884:48:0;35827:105;:158;;;-1:-1:-1;;;;;;;;;;23008:40:0;;;35949:36;22849:207;60848:114;60914:7;61104:1;61080:21;:19;:21::i;:::-;:25;61072:62;;;;-1:-1:-1;;;61072:62:0;;29619:2:1;61072:62:0;;;29601:21:1;29658:2;29638:18;;;29631:30;29697:26;29677:18;;;29670:54;29741:18;;61072:62:0;29417:348:1;61072:62:0;60941:11:::1;:13:::0;;;:11:::1;:13;::::0;::::1;:::i;:::-;;;;;60934:20;;60848:114:::0;:::o;43102:319::-;43231:18;43237:2;43241:7;43231:5;:18::i;:::-;43282:53;43313:1;43317:2;43321:7;43330:4;43282:22;:53::i;:::-;43260:153;;;;-1:-1:-1;;;43260:153:0;;;;;;;:::i;54639:1002::-;54919:22;54969:1;54944:22;54961:4;54944:16;:22::i;:::-;:26;;;;:::i;:::-;54981:18;55002:26;;;:17;:26;;;;;;54919:51;;-1:-1:-1;55135:28:0;;;55131:328;;-1:-1:-1;;;;;55202:18:0;;55180:19;55202:18;;;:12;:18;;;;;;;;:34;;;;;;;;;55253:30;;;;;;:44;;;55370:30;;:17;:30;;;;;:43;;;55131:328;-1:-1:-1;55555:26:0;;;;:17;:26;;;;;;;;55548:33;;;-1:-1:-1;;;;;55599:18:0;;;;;:12;:18;;;;;:34;;;;;;;55592:41;54639:1002::o;55936:1079::-;56214:10;:17;56189:22;;56214:21;;56234:1;;56214:21;:::i;:::-;56246:18;56267:24;;;:15;:24;;;;;;56640:10;:26;;56189:46;;-1:-1:-1;56267:24:0;;56189:46;;56640:26;;;;;;:::i;:::-;;;;;;;;;56618:48;;56704:11;56679:10;56690;56679:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;56784:28;;;:15;:28;;;;;;;:41;;;56956:24;;;;;56949:31;56991:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;56007:1008;;;55936:1079;:::o;53426:221::-;53511:14;53528:20;53545:2;53528:16;:20::i;:::-;-1:-1:-1;;;;;53559:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;53604:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;53426:221:0:o;43757:439::-;-1:-1:-1;;;;;43837:16:0;;43829:61;;;;-1:-1:-1;;;43829:61:0;;30104:2:1;43829:61:0;;;30086:21:1;;;30123:18;;;30116:30;30182:34;30162:18;;;30155:62;30234:18;;43829:61:0;29902:356:1;43829:61:0;41863:4;41887:16;;;:7;:16;;;;;;-1:-1:-1;;;;;41887:16:0;:30;43901:58;;;;-1:-1:-1;;;43901:58:0;;30465:2:1;43901:58:0;;;30447:21:1;30504:2;30484:18;;;30477:30;30543;30523:18;;;30516:58;30591:18;;43901:58:0;30263:352:1;43901:58:0;43972:45;44001:1;44005:2;44009:7;43972:20;:45::i;:::-;-1:-1:-1;;;;;44030:13:0;;;;;;:9;:13;;;;;:18;;44047:1;;44030:13;:18;;44047:1;;44030:18;:::i;:::-;;;;-1:-1:-1;;44059:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;44059:21:0;-1:-1:-1;;;;;44059:21:0;;;;;;;;44098:33;;44059:16;;;44098:33;;44059:16;;44098:33;75432:167;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:173::-;660:20;;-1:-1:-1;;;;;709:31:1;;699:42;;689:70;;755:1;752;745:12;689:70;592:173;;;:::o;770:366::-;837:6;845;898:2;886:9;877:7;873:23;869:32;866:52;;;914:1;911;904:12;866:52;937:29;956:9;937:29;:::i;:::-;927:39;;1016:2;1005:9;1001:18;988:32;-1:-1:-1;;;;;1053:5:1;1049:38;1042:5;1039:49;1029:77;;1102:1;1099;1092:12;1029:77;1125:5;1115:15;;;770:366;;;;;:::o;1141:186::-;1200:6;1253:2;1241:9;1232:7;1228:23;1224:32;1221:52;;;1269:1;1266;1259:12;1221:52;1292:29;1311:9;1292:29;:::i;1332:258::-;1404:1;1414:113;1428:6;1425:1;1422:13;1414:113;;;1504:11;;;1498:18;1485:11;;;1478:39;1450:2;1443:10;1414:113;;;1545:6;1542:1;1539:13;1536:48;;;-1:-1:-1;;1580:1:1;1562:16;;1555:27;1332:258::o;1595:269::-;1648:3;1686:5;1680:12;1713:6;1708:3;1701:19;1729:63;1785:6;1778:4;1773:3;1769:14;1762:4;1755:5;1751:16;1729:63;:::i;:::-;1846:2;1825:15;-1:-1:-1;;1821:29:1;1812:39;;;;1853:4;1808:50;;1595:269;-1:-1:-1;;1595:269:1:o;1869:231::-;2018:2;2007:9;2000:21;1981:4;2038:56;2090:2;2079:9;2075:18;2067:6;2038:56;:::i;2105:180::-;2164:6;2217:2;2205:9;2196:7;2192:23;2188:32;2185:52;;;2233:1;2230;2223:12;2185:52;-1:-1:-1;2256:23:1;;2105:180;-1:-1:-1;2105:180:1:o;2498:254::-;2566:6;2574;2627:2;2615:9;2606:7;2602:23;2598:32;2595:52;;;2643:1;2640;2633:12;2595:52;2666:29;2685:9;2666:29;:::i;:::-;2656:39;2742:2;2727:18;;;;2714:32;;-1:-1:-1;;;2498:254:1:o;2939:328::-;3016:6;3024;3032;3085:2;3073:9;3064:7;3060:23;3056:32;3053:52;;;3101:1;3098;3091:12;3053:52;3124:29;3143:9;3124:29;:::i;:::-;3114:39;;3172:38;3206:2;3195:9;3191:18;3172:38;:::i;:::-;3162:48;;3257:2;3246:9;3242:18;3229:32;3219:42;;2939:328;;;;;:::o;3272:658::-;3443:2;3495:21;;;3565:13;;3468:18;;;3587:22;;;3414:4;;3443:2;3666:15;;;;3640:2;3625:18;;;3414:4;3709:195;3723:6;3720:1;3717:13;3709:195;;;3788:13;;-1:-1:-1;;;;;3784:39:1;3772:52;;3879:15;;;;3844:12;;;;3820:1;3738:9;3709:195;;;-1:-1:-1;3921:3:1;;3272:658;-1:-1:-1;;;;;;3272:658:1:o;3935:248::-;4003:6;4011;4064:2;4052:9;4043:7;4039:23;4035:32;4032:52;;;4080:1;4077;4070:12;4032:52;-1:-1:-1;;4103:23:1;;;4173:2;4158:18;;;4145:32;;-1:-1:-1;3935:248:1:o;4467:632::-;4638:2;4690:21;;;4760:13;;4663:18;;;4782:22;;;4609:4;;4638:2;4861:15;;;;4835:2;4820:18;;;4609:4;4904:169;4918:6;4915:1;4912:13;4904:169;;;4979:13;;4967:26;;5048:15;;;;5013:12;;;;4940:1;4933:9;4904:169;;5104:127;5165:10;5160:3;5156:20;5153:1;5146:31;5196:4;5193:1;5186:15;5220:4;5217:1;5210:15;5236:632;5301:5;5331:18;5372:2;5364:6;5361:14;5358:40;;;5378:18;;:::i;:::-;5453:2;5447:9;5421:2;5507:15;;-1:-1:-1;;5503:24:1;;;5529:2;5499:33;5495:42;5483:55;;;5553:18;;;5573:22;;;5550:46;5547:72;;;5599:18;;:::i;:::-;5639:10;5635:2;5628:22;5668:6;5659:15;;5698:6;5690;5683:22;5738:3;5729:6;5724:3;5720:16;5717:25;5714:45;;;5755:1;5752;5745:12;5714:45;5805:6;5800:3;5793:4;5785:6;5781:17;5768:44;5860:1;5853:4;5844:6;5836;5832:19;5828:30;5821:41;;;;5236:632;;;;;:::o;5873:451::-;5942:6;5995:2;5983:9;5974:7;5970:23;5966:32;5963:52;;;6011:1;6008;6001:12;5963:52;6051:9;6038:23;6084:18;6076:6;6073:30;6070:50;;;6116:1;6113;6106:12;6070:50;6139:22;;6192:4;6184:13;;6180:27;-1:-1:-1;6170:55:1;;6221:1;6218;6211:12;6170:55;6244:74;6310:7;6305:2;6292:16;6287:2;6283;6279:11;6244:74;:::i;6943:367::-;7006:8;7016:6;7070:3;7063:4;7055:6;7051:17;7047:27;7037:55;;7088:1;7085;7078:12;7037:55;-1:-1:-1;7111:20:1;;7154:18;7143:30;;7140:50;;;7186:1;7183;7176:12;7140:50;7223:4;7215:6;7211:17;7199:29;;7283:3;7276:4;7266:6;7263:1;7259:14;7251:6;7247:27;7243:38;7240:47;7237:67;;;7300:1;7297;7290:12;7315:437;7401:6;7409;7462:2;7450:9;7441:7;7437:23;7433:32;7430:52;;;7478:1;7475;7468:12;7430:52;7518:9;7505:23;7551:18;7543:6;7540:30;7537:50;;;7583:1;7580;7573:12;7537:50;7622:70;7684:7;7675:6;7664:9;7660:22;7622:70;:::i;:::-;7711:8;;7596:96;;-1:-1:-1;7315:437:1;-1:-1:-1;;;;7315:437:1:o;7757:118::-;7843:5;7836:13;7829:21;7822:5;7819:32;7809:60;;7865:1;7862;7855:12;7880:315;7945:6;7953;8006:2;7994:9;7985:7;7981:23;7977:32;7974:52;;;8022:1;8019;8012:12;7974:52;8045:29;8064:9;8045:29;:::i;:::-;8035:39;;8124:2;8113:9;8109:18;8096:32;8137:28;8159:5;8137:28;:::i;8200:667::-;8295:6;8303;8311;8319;8372:3;8360:9;8351:7;8347:23;8343:33;8340:53;;;8389:1;8386;8379:12;8340:53;8412:29;8431:9;8412:29;:::i;:::-;8402:39;;8460:38;8494:2;8483:9;8479:18;8460:38;:::i;:::-;8450:48;;8545:2;8534:9;8530:18;8517:32;8507:42;;8600:2;8589:9;8585:18;8572:32;8627:18;8619:6;8616:30;8613:50;;;8659:1;8656;8649:12;8613:50;8682:22;;8735:4;8727:13;;8723:27;-1:-1:-1;8713:55:1;;8764:1;8761;8754:12;8713:55;8787:74;8853:7;8848:2;8835:16;8830:2;8826;8822:11;8787:74;:::i;:::-;8777:84;;;8200:667;;;;;;;:::o;8872:643::-;9041:2;9093:21;;;9163:13;;9066:18;;;9185:22;;;9012:4;;9041:2;9264:15;;;;9238:2;9223:18;;;9012:4;9307:182;9321:6;9318:1;9315:13;9307:182;;;9386:13;;9401:6;9382:26;9370:39;;9464:15;;;;9429:12;;;;9343:1;9336:9;9307:182;;9520:260;9588:6;9596;9649:2;9637:9;9628:7;9624:23;9620:32;9617:52;;;9665:1;9662;9655:12;9617:52;9688:29;9707:9;9688:29;:::i;:::-;9678:39;;9736:38;9770:2;9759:9;9755:18;9736:38;:::i;:::-;9726:48;;9520:260;;;;;:::o;9785:772::-;9906:6;9914;9922;9930;9983:2;9971:9;9962:7;9958:23;9954:32;9951:52;;;9999:1;9996;9989:12;9951:52;10039:9;10026:23;10068:18;10109:2;10101:6;10098:14;10095:34;;;10125:1;10122;10115:12;10095:34;10164:70;10226:7;10217:6;10206:9;10202:22;10164:70;:::i;:::-;10253:8;;-1:-1:-1;10138:96:1;-1:-1:-1;10341:2:1;10326:18;;10313:32;;-1:-1:-1;10357:16:1;;;10354:36;;;10386:1;10383;10376:12;10354:36;;10425:72;10489:7;10478:8;10467:9;10463:24;10425:72;:::i;:::-;9785:772;;;;-1:-1:-1;10516:8:1;-1:-1:-1;;;;9785:772:1:o;10562:380::-;10641:1;10637:12;;;;10684;;;10705:61;;10759:4;10751:6;10747:17;10737:27;;10705:61;10812:2;10804:6;10801:14;10781:18;10778:38;10775:161;;;10858:10;10853:3;10849:20;10846:1;10839:31;10893:4;10890:1;10883:15;10921:4;10918:1;10911:15;10775:161;;10562:380;;;:::o;11780:127::-;11841:10;11836:3;11832:20;11829:1;11822:31;11872:4;11869:1;11862:15;11896:4;11893:1;11886:15;11912:128;11952:3;11983:1;11979:6;11976:1;11973:13;11970:39;;;11989:18;;:::i;:::-;-1:-1:-1;12025:9:1;;11912:128::o;12396:135::-;12435:3;-1:-1:-1;;12456:17:1;;12453:43;;;12476:18;;:::i;:::-;-1:-1:-1;12523:1:1;12512:13;;12396:135::o;12536:410::-;12738:2;12720:21;;;12777:2;12757:18;;;12750:30;12816:34;12811:2;12796:18;;12789:62;-1:-1:-1;;;12882:2:1;12867:18;;12860:44;12936:3;12921:19;;12536:410::o;12951:168::-;12991:7;13057:1;13053;13049:6;13045:14;13042:1;13039:21;13034:1;13027:9;13020:17;13016:45;13013:71;;;13064:18;;:::i;:::-;-1:-1:-1;13104:9:1;;12951:168::o;13124:127::-;13185:10;13180:3;13176:20;13173:1;13166:31;13216:4;13213:1;13206:15;13240:4;13237:1;13230:15;13256:120;13296:1;13322;13312:35;;13327:18;;:::i;:::-;-1:-1:-1;13361:9:1;;13256:120::o;15824:127::-;15885:10;15880:3;15876:20;15873:1;15866:31;15916:4;15913:1;15906:15;15940:4;15937:1;15930:15;20330:185;20372:3;20410:5;20404:12;20425:52;20470:6;20465:3;20458:4;20451:5;20447:16;20425:52;:::i;:::-;20493:16;;;;;20330:185;-1:-1:-1;;20330:185:1:o;20638:1433::-;21016:3;21045:1;21078:6;21072:13;21108:3;21130:1;21158:9;21154:2;21150:18;21140:28;;21218:2;21207:9;21203:18;21240;21230:61;;21284:4;21276:6;21272:17;21262:27;;21230:61;21310:2;21358;21350:6;21347:14;21327:18;21324:38;21321:165;;;-1:-1:-1;;;21385:33:1;;21441:4;21438:1;21431:15;21471:4;21392:3;21459:17;21321:165;21502:18;21529:104;;;;21647:1;21642:320;;;;21495:467;;21529:104;-1:-1:-1;;21562:24:1;;21550:37;;21607:16;;;;-1:-1:-1;21529:104:1;;21642:320;20158:1;20151:14;;;20195:4;20182:18;;21737:1;21751:165;21765:6;21762:1;21759:13;21751:165;;;21843:14;;21830:11;;;21823:35;21886:16;;;;21780:10;;21751:165;;;21755:3;;21945:6;21940:3;21936:16;21929:23;;21495:467;;;;;;;21978:87;22003:61;22029:34;22059:3;-1:-1:-1;;;20276:16:1;;20317:1;20308:11;;20211:114;22029:34;22021:6;22003:61;:::i;:::-;-1:-1:-1;;;20580:20:1;;20625:1;20616:11;;20520:113;21978:87;21971:94;20638:1433;-1:-1:-1;;;;;20638:1433:1:o;22076:125::-;22116:4;22144:1;22141;22138:8;22135:34;;;22149:18;;:::i;:::-;-1:-1:-1;22186:9:1;;22076:125::o;25928:245::-;25995:6;26048:2;26036:9;26027:7;26023:23;26019:32;26016:52;;;26064:1;26061;26054:12;26016:52;26096:9;26090:16;26115:28;26137:5;26115:28;:::i;26868:112::-;26900:1;26926;26916:35;;26931:18;;:::i;:::-;-1:-1:-1;26965:9:1;;26868:112::o;27339:414::-;27541:2;27523:21;;;27580:2;27560:18;;;27553:30;27619:34;27614:2;27599:18;;27592:62;-1:-1:-1;;;27685:2:1;27670:18;;27663:48;27743:3;27728:19;;27339:414::o;28658:500::-;-1:-1:-1;;;;;28927:15:1;;;28909:34;;28979:15;;28974:2;28959:18;;28952:43;29026:2;29011:18;;29004:34;;;29074:3;29069:2;29054:18;;29047:31;;;28852:4;;29095:57;;29132:19;;29124:6;29095:57;:::i;:::-;29087:65;28658:500;-1:-1:-1;;;;;;28658:500:1:o;29163:249::-;29232:6;29285:2;29273:9;29264:7;29260:23;29256:32;29253:52;;;29301:1;29298;29291:12;29253:52;29333:9;29327:16;29352:30;29376:5;29352:30;:::i;29770:127::-;29831:10;29826:3;29822:20;29819:1;29812:31;29862:4;29859:1;29852:15;29886:4;29883:1;29876:15

Swarm Source

ipfs://1285cd4651169158d5b98eb976262d5d27b8c731c711eafaff1be9236572d204
Loading